我们常说Redis是单线程服务。单线程的好处非常明显。第一,代码逻辑更简单,服务更稳定。但同时单线程也会带来一些问题,比如做一些非常繁重的操作。有时,其他任务也会受到影响。有一些非常重要的操作实际上可以在多线程中完成,例如备份数据或删除一个非常大的字典。同步没有多大意义。为了解决这个问题,Redis也有一些异步线程来工作,让Redis更加高效,我们称之为Lazyfree机制。RedislazydeleteUnlink命令在Redis命令中,提供了一个新的删除命令Unlink。其实在现实生活中,这种懒删除在现实生活中是很常见的。例如,当一家餐厅在晚上即将打烊时,并没有立即赶走店内的顾客并进行清理。相反,门口有一个关闭的标志。然后在里面慢慢整理,Redis的Unlink命令也是这样。例如,一个字典的Unlink命令的执行步骤如下:首先从字典的条目中取出键,得到字典中值的总数。如果数字较小,则同步删除该值;否则,将自动添加要删除的条目。将字典提交到惰性删除队列,返回删除成功。Redis异步清除数据库。我们都知道,如果我们要删除整个Redis中的所有数据,是需要花费很多时间的。同样,Redis的删除命令也可以是异步的。.在执行删除命令时,Redis会将数据库字典指向新字典,然后将旧数据提交给异步线程处理。Redis其他异步删除在此之前,我们介绍了Redis的一些内存淘汰和过期策略。比如Redis的过期策略,有两种不同的策略:主动删除和被动删除。Redis4.0为我们提供了一个新的配置项,可以在删除的时候启用异步删除。这里需要注意的是,不是开线程去不断扫描那些key过期的。总结一下Redis的异步删除,其实我们在日常开发中也可以借鉴。例如,在电子商务系统中,商家需要向所有购买了自己产品的用户发放一张优惠券。这个逻辑非常重要。需要读取用户系统(比如需要读取用户的基本信息)、订单系统(查询用户订单)、折扣系统(查看优惠券数量和优惠券详情)、推送系统(推送用户领取新优惠券,可以查看)等系统,如果我们同步做的话,用户可能点击一次发放优惠券需要好几个小时,还可能伴随各种超时。一般我们都是针对这个需求做的,提供一个任务队列。当商户完成任务后,将任务丢入消息队列。在里面告诉商家任务提交成功,然后在后台慢慢分发优惠券,最后通知商家派送成功。Redis这个小而精的项目,有很多值得学习的设计思想。欢迎大家关注我,一起学习,一起进步。您的支持是我继续聊天的动力。
