在Redis中执行Lua脚本有两种方法:eval和evalsha。 http://redisdoc.com/script/eval.html https://redisbook.readthedocs.io/en/latest/feature/scripting.html 1.1 eval# Copy eval 脚本内容 key个数 key列表 参数列表 下面例子使用了key列表和参数列表来为Lua脚本提供更多的灵活性:
两个基础限流算法是漏斗算法和令牌算法 分布式限流 如果你的应用是单个进程,那么限流就很简单,请求的计数算法都可以在内存里完成。限流算法几乎没有损耗,都是纯内存的计算。但是互联网世界的应用都是多节点的分布式的,每个节点的请求处理能力还不一定一样。我们需要考虑的是这多个节点的整体请求处理能力。 单个进程的处理能力是1w QPS 并不意味着整体的请求处理能力是 N * 1w QPS,因为整体的处理能力还会有共享资源的能力限制。这个共享资源一般是指数据库,也可以是同一台机器的多个进程共享的 CPU 和 磁盘 等资源,还有网络带宽因素也会制约整体的请求量。 这时候请求的计数算法就需要集中在一个地方(限流中间件)来完成。应用程序在处理请求之前都需要向这种集中管理器申请流量(空气、令牌桶)。 每一个请求都需要一次网络 IO,从应用程序到限流中间件之间。
动态空间划分(R-tree) 静态空间划分(GeoHash、google S2、uber H3) 四叉树 经度、纬度的二分来分块,逻辑最简单。 Z-行空间遍历 编码方式 所在层级经纬度二分下标(0、1),先经后纬,逐层排列。
https://github.com/xiazemin/h3-go https://uber.github.io/h3/#/documentation/overview/introduction https://uber.github.io/h3/#/documentation/core-library/coordinate-systems https://halfrost.com/go_spatial_search/ https://github.com/vraid/earthgen-old https://gist.github.com/jp1017/71bd0976287ce163c11a7cb963b04dd8
select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready。 golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。