文章摘要(AI生成)
问题1:redis的阻塞队列怎么做到阻塞式的抢占?redis在blpop命令处理过程时,首先会去查找key对应的list,如果存在,则pop出数据响应给客户端。否则将对应的key push到blocking_keys数据结构当中,对应的value是被阻塞的client。当下次push命令发出时,服务
问题1:redis的阻塞队列怎么做到阻塞式的抢占?
redis在blpop命令处理过程时,首先会去查找key对应的list,如果存在,则pop出数据响应给客户端。否则将对应的key push到blocking_keys数据结构当中,对应的value是被阻塞的client。当下次push命令发出时,服务器检查blocking_keys当中是否存在对应的key,如果存在,则将key添加到ready_keys链表当中,同时将value插入链表当中并响应客户端。
服务端在每次的事件循环当中处理完客户端请求之后,会遍历ready_keys链表,并从blocking_keys链表当中找到对应的client,进行响应,整个过程并不会阻塞事件循环的执行。所以, 总的来说,redis server是通过ready_keys和blocking_keys两个链表和事件循环来处理阻塞事件的。
文章参考:https://www.cnblogs.com/ajianbeyourself/p/15650518.html
问题2:redis常用的除了string,还有哪些结构经常使用到
string:用来做缓存和分布式锁
hash:用来存储对象,或用作购物车场景
list:做分布式栈、阻塞队列
set:做分布式集合
文章参考:https://blog.csdn.net/weixin_42352733/article/details/123628841
问题3:redis守护线程怎么实现的?
- redission分布式锁自动续期,是在超时时间/3的时候,会触发锁检查,发现线程ID未解锁,则触发续锁操作。续锁会创建redission自己实现的TimerTask,然后放到时间轮中触发,触发延迟1500ms。
时间轮相当于一个倒计时的秒表,时间轮的格子数,每个格子代表的时间间隔(秒表倒计时指针多久走一格)都可以设置,每个格子内的任务有个队列缓存,初始长度是1024。然后当倒计时指针走到当前格子时,格子内的任务,当round轮数是0的时候触发,如果round轮数>0则减1;然后倒计时指针继续走下一个格子。
当倒计时指针走到最后一个格子的时候,复位到第一个格子(格子虽然是个列表,但是这种行为看起来像个环)。因为采用了时间轮,只有一个倒计时主线程,所以不会太费性能。- 不采用redission客户端,我们自己实现的话可以启动一个schedule拉进行锁的自动续期,这个时候我们需要维护一个我们占用锁的线程与对应锁(key: threadId, value: redisKeys)的map,根据线程的存活状态来判断是否性需要续约。
文章参考:https://www.jb51.net/article/233992.htm#_lab2_0_0, https://blog.csdn.net/ncy2005/article/details/117375921
问题4:redis设置连锁有什么好的方式?
这个问题首先要讨论什么场景下需要加连锁,分布式锁与分布式事务的区别?
分布式锁和分布式事务区别:
锁问题的关键在于进程操作的互斥关系,例如多个进程同时修改账户的余额,如果没有互斥关系则会导致该账户的余额不正确。
而事务问题的关键则在于事务涉及的一系列操作需要满足ACID特性,例如要满足原子性操作则需要这些操作要么都执行,要么都不执行。
解决进程互斥本身不需要连锁,如果是事务级联,可以看分布式事务如何实现
问题5:redis能存放几十亿的数据?持久化怎么做?为什么不用ES?
- redis亿级存储需要考虑:
1)淘汰策略,及时发现保留热数据,淘汰冷数据
2)减少膨胀,key越多消耗空间越多,可以通过hash存储来解决,取值方式由get(key1)变为hget(md5(key1), key1)
3)减少碎片,key,value不等长导致内存无法对齐进行重新分配- 持久化存储方式:
1)AOF持久化,采用日志的形式来记录每个写操作,追加到AOF文件的末尾。
2)RDB持久化,把内存数据以快照的形式保存到磁盘上。- redis和ES对比
1)ES特性:创建字段前要预先建立Mapping,一但存在就不支持修改。适合全文检索,且写入性能不高的场景。不适合用在那些数据价值不高、对写入性能有要求、数据量大而成本受限的场景中。
2)REDIS特性:key-value存储所带来的简单和高性能。但是所有的查询都依赖key,因此Redis无法提供常规数据库所具备的多列查询、区段查询等复杂查询功能。
评论区