redis+lua分布式限流

为什么redis+lua分布式限流,redis本身就是可以分布式部署的,为什么还需要配置使用lua来实现限流呢?
我能想到的可能就是以下几点:
1、把计算部分使用lua脚本去实现,每个需要用到的地方直接去调用脚本执行,不用在每个地方去查询处理。
2、提取公共方法查询是否限流。在这期间有两个问题,1:需要把当前请求counter查询出来,再做处理,2:这期间如果有并发的话,需要额外的同步处理。

结合以上:
我看了有大神发的帖子,是这样写的,因为redis本身就是单线程的,所以直接调用lua脚本执行 ,也不要处理同步问题。虽然redis是单线程的,但它实际上做增/删操作是使用的epoll,那这样来讲的话,是不是reids调用luz脚本是单线程的,而其他是使用的epoll呢?

请大神们解答一下。

阅读 1.3k
1 个回答

“Redis 本身就是可以分布式部署的,为什么还需要配置使用 Lua 来实现限流呢?”

这句话里的前后两个部分本身就不搭嘎呀,两者也不是冲突的东西啊。

换个比方你就明白为啥不搭嘎了:“MySql 本身就是可以分布式部署的,为什么还需要使用 Java 来实现接口呢?”

明白意思了吗?Redis 就是个存储数据的地方,而 Lua 是编程语言、是业务逻辑、是你的程序。

实际上你不用 Lua 也完全可以,就是把限流的逻辑写在自己的程序里呗,没啥问题的。

但用 Lua 实现限流的工作有几点好处:

  1. Lua 跑在 Redis 这样的 C/C++ 程序里,只要你写的不是太差劲,性能绝对是比 Java、PHP 之流要高。
  2. Lua 在 Redis 上天然具有原子性(注意,不是一致性,很多人分不清它俩),你要是外部程序去实现的话还得自行处理这块。
  3. 高度可复用。不管你程序是什么语言开发的(这在微服务这种异构系统中极为常见),只要你用的 Redis 库支持调用 Lua 脚本,就可以复用这段业务逻辑了;反之的话你要是后面一个 Java 服务、一个 PHP 服务、还一个 Go 服务,是不是每种语言得自己实现一遍?实现的效果还未必一致。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进