使用 redis cluster 模式, 在高并发场景使用 setnx,然后去数据库拿资源, 现在想将数据库资源 push 到 redis 的队列里面,然后再去 pop
这里有两个问题:
在集群模式下去 pop 的时候,会存在重复消费情况么? 自己理解应该不会,因为数据是分布在某个 slot 上,请求进到固定的某个 redis 实例,加上 redis 是单线程,就不会重复获取
在主从模式,且多主的架构中,不加锁的情况是,是不是会从在类似重复消费的现象?因为有可能从不太的 redis 主实例读出来的数据
1
pastgift 2020-02-12 13:08:09 +08:00 via iPhone
请仔细阅读 redis 官方文档「 Distributed locks with Redis 」章节,里面相关库都列出来了
|
3
dilu 2020-02-12 15:49:14 +08:00
1 不重复 2 有可能
|
4
masterjoess 2020-02-12 18:28:38 +08:00
不记得在哪里看过评论说,不要拿 redis 做消息列队
|
5
beryl OP @masterjoess 印象中之前也看到过,今天查的时候没有找到相关论据
|
6
pastgift 2020-02-12 19:29:14 +08:00 via iPhone
@masterjoess #4 的确有地方说过,我记得 redis 有个关联项目是专门做消息队列的,但好像没什么起色
事实上很多项目都支持把 redis 作为消息队列,比如 celery。事实上,redis 官方文档都写了如何利用 list 做可靠队列,所以应该没什么问题 一般来说,每个队列元素小于 2kb 就没啥问题,过大就要考虑专业消息队列了 |
7
kier 2020-02-12 20:46:28 +08:00
1.有理论上的概率出问题,就是主当机时,最新的操作没同步过去,然后发生主从切换,就会有重复
2.主从模式的多主架构是什么意思? |
8
lovedebug 2020-02-12 20:59:47 +08:00
看业务场景是否允许读取过期值
|
9
daozhihun 2020-02-12 21:03:53 +08:00
按照官方的策略,也会在一些极端情况下有 bug (不过很少会遇到)。
不管你用什么策略,都要考虑一下对应的补偿策略,没有 100%的高枕无忧的方案 |