问题导读
一、说说Redis 回收进程如何工作的?
二、使用过 Redis 做异步队列么,你是怎么用的?
三、使用过 Redis 分布式锁么,它是什么回事?
01
说说Redis 回收进程如何工作的?
一个客户端运行了新的命令,添加了新的数据。
Redis 检查内存使用情况, 如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。一个新的命令被执行,等等。
所以我们不断地穿越内存限制的边界,通过不断达到边界然后不 断地回收回到边界以下。
如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。
分享朋友圈,每天进步一点点~
02
使用过 Redis 做异步队列么,你是怎么用的?
一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。
当 lpop 没有消息的时候,要适当 sleep 一会再重试。
可不可以不用 sleep 呢?
list 还有个指令叫 blpop, 在没有消息的时候,它会阻塞住直 到消息到来。
能不能生产一次消费多次呢?
使用 pub/sub 主题订 阅者模式,可以实现 1:N 的消息队列。
pub/sub 有什么缺点?
在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 RabbitMQ 等。
redis 如何实现延时队列?
使用 sortedset,拿时间 戳作为 score,消息内容作为 192key 调用 zadd 来生产消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询进行 处理。
03
使用过 Redis 分布式锁么,它是什么回事?
先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。
如果在 setnx 之后执行 expire 之前进程意 外 crash 或者要重启维护了,那会怎么样?
set 指令有参数,这个应该是可以同时把 setnx 和 expire 合成一条指令来用的
- End -