我正在关注这个关于使用 Redis 实施速率限制器的博客。
这里他们使用了
MULTI
来打包所有原子命令。这确保了我们不会同时错误地写入 Redis 节点。
尽管最后两步提到:
所有操作完成后,我们统计获取到的元素数量。如果超过限制,我们不允许该操作。
我们还可以将获取的最大元素与当前时间戳进行比较。如果它们太近,我们也不允许该操作。
这两个命令将是读取命令。现在,如果我们处于处理数百万个请求的设置中,复制就变得很重要。
现在,如果在执行读取时,我从副本中获取数据,则由于主副本和副本之间的同步延迟,我的读取可能会过时。
我的思考方向正确吗?如果是,您有什么担忧吗?您想到了什么解决方案?
我想到的解决方案是:-
编写lua脚本——将直接在master上执行。
仅强制执行这些特定的读取查询以发送至主服务器。
MULTI/EXEC 命令不适用于 Redis 集群或主从架构。使用 MULTI/EXEC 的事务是由 Redis 服务器节点实现的,这意味着只有当您能够保证所有命令都发送到集群中的同一节点时,它们才会起作用。
集群模式下,需要保证所有涉及到的key都在同一个slot中。您可以通过对要执行的所有键使用相同的主题标签来实现此目的,这会强制它们位于同一个槽中。
在主从模式下,行为取决于Redis客户端的实现方式。有些客户端会将事务中的所有命令发送到主节点,无论它们是否是只读的,而其他客户端可能不会。另一种解决方案是使用 Lua 脚本,因为 EVAL 命令被所有 Redis 客户端视为写入命令,允许您在同一主节点中原子地执行所有命令。