# 实现 Redis 时间轮的教程
Redis 时间轮(Time Wheel)是一种高效的定时任务管理算法。它通过将时间划分为多个时间片来优化任务调度。在这篇文章中,我们将为刚入行的小白详细讲解如何实现 Redis 时间轮。
## 实现流程
为了更清晰地展示实现过程,我们将其过程整理成以下表格:
| 步骤 | 描述                        |
|------|----            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-08-30 03:53:29
                            
                                89阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            RTT在上篇文章中说过,Redis 客户端执行一条命令分为如下 4 个部分:其中 1~4 所消耗的时间称为 Round Trip Time (RTT,往返时间),也就是数据在网络上传输的时间。Redis 提供了批量操作命令(例如 mget、mset 等),有效地节约 RTT。但大部分命令是不支持批量操作的,例如要执行 n 次 hgetall 命令,并没有 mhgetall 命令存在,需要消耗 n            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-08 20:07:31
                            
                                68阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            在现代的微服务架构中,Golang与Redis的结合愈发重要,特别是在高效的定时任务调度中。为了解决“Golang时间轮Redis”的问题,我们可以通过时间轮机制实现高效的调度。本文将深入探讨如何诊断和优化这一问题,以便确保我们的系统能够达到最佳性能。
### 背景定位
随着业务需求的不断增长,用户反馈开始集中在定时任务执行效率不高、电池耗损等问题上。这对业务造成了显著的影响,限制了实时数据处            
                
         
            
            
            
            本篇文章主要基于Redisson中实现的分布式锁机制继续进行展开,分析Redisson中的时间轮机制。在前面分析的Redisson的分布式锁实现中,有一个Watch Dog机制来对锁键进行续约,代码如下:private void renewExpiration() {
    ExpirationEntry ee = EXPIRATION_RENEWAL_MAP.get(getEntryName(            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-04-09 10:17:47
                            
                                115阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            上面一篇作者讲解了简单时间轮的概念和应用简单时间轮可以对多个任务进行周期性的执行,可以定制化周期进行任务执行。本篇内容讲解redis消息队列和时间轮的搭配应用。声明:redis消息队列采用生产消费者模式大概应用流程:下面附上redis消息队列-消费订阅者模式的事例代码,spring-redis配置  <?xml version="1.0" encoding="UTF-8"?>            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-13 10:01:13
                            
                                84阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            aeredis是一种典型的reactor设计模式。redis中的任何操作甚至是定时任务的触发都被看成是一个事件,由专门的事件处理器去执行。其内部自己定义了一套ae驱动器(ae.h、ae.c)。 事件分为文件事件和时间事件。像命令的请求,回复都是文件事件。而时间事件则是一种定时触发的事件,如serverCron函数(周期时间事件)、或者过期键的删除(定时时间事件)等。服务器将所有的时间事件都放在了一            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-16 14:05:13
                            
                                76阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Redis 采用事件驱动机制来处理大量的网络IO。它并没有使用 libevent 或者 libev 这样的成熟开源方案,而是自己实现一个非常简洁的事件驱动库 ae_event。Redis中的事件驱动库只关注网络IO,以及定时器。该事件库处理下面两类事件:① 文件事件(file  event):用于处理 Redis 服务器和客户端之间的网络IO。② 时间事件(time  evea            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-21 16:24:03
                            
                                58阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            # Redis 实现时间轮
时间轮(Time Wheel)是一种高效的定时任务调度算法,可以很好地解决大量定时任务的管理和调度问题。Redis 通过实现时间轮,优化了任务的定时处理,能够以较低的内存消耗和高效的执行速度来处理定时事件。
## 时间轮的基本原理
时间轮将时间划分为多个“槽”,每个槽对应一个时间段。任务会被放入相应的槽中。当时间轮转动到某个槽时,就会执行该槽中所有的任务。相对于在            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-10-13 05:39:02
                            
                                424阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            内存时序和内存频率一样,都代表了一款内存性能的高低。内存时序由4个数字组成,中间用破折号隔开,例如16-18-18-38  这些数字表示延迟,也就是内存的反应时间。当内存接收到CPU发来的指令后,通常需要几个时钟周期来处理它,比如访问某一块数据。所以,时间越短,内存性能越好。频率和时序一起,共同决定了内存可以跑得多快。不过相比频率,时序由四位数字组成,每一个数字都代表不同的含义,在理解上自然更加复            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-23 17:39:07
                            
                                104阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Redis采用的是定期删除+懒惰删除策略。 (1)定期删除策略 Redis会将每个设置了过期时间的key放入到一个独立的字典里,默认每100ms进行一次过期扫描: 1.随机抽取20个key 2.删除这20个key中过期的key 3.如果过期的key比例超过1/4,重复步骤1,继续删除。 问题1:为什么不扫描所有的key 由于redis是单线程,而且为了防止每次扫描过期的 key 比例都超过 1/4            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-11-23 12:55:07
                            
                                30阅读
                            
                                                                             
                 
                
                             
         
            
            
            
                       redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。          (一)redis事务的执行&            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-10-08 12:00:19
                            
                                17阅读
                            
                                                                             
                 
                
                             
         
            
            
            
              一、业务场景某个设备需要保持激活状态,当失效的时候需要预警。订单付款后需要在24小时之后触发短信提醒等等。二、常见方案手动无线循环;ScheduledExecutorService;DelayQueue;Redis zset 数据判断的方式;Redis 键空间通知的方式;Netty 提供的 HashedWheelTimer 工具类;RabbitMQ 死信队列;RabbitM            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-07-24 16:37:51
                            
                                94阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            时间轮  前文提到,基于排序链表的定时器存在一个问题:添加定时器的效率偏低。一种简单的时间轮如图所示:  在这个时间轮中,实线指针指向轮子上的一个槽(slot)。它以恒定的速度顺时针转动,每转动一步就指向下一个槽(slot)。每次转动称为一个滴答(tick)。一个tick时间间隔为时间轮的si(slot interval)。该时间轮共有N个槽,因此它转动一周的时间是N*si.每个槽指向一条定时器链            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-28 23:06:33
                            
                                148阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            时间轮是Libco中管理超时事件的定时器,在这之前先介绍一下定时器。常用的定时器数据结构有:链表:redis中的定时器是同链表实现的,时间复杂度为On,性能很差,但是redis中的超时时间只有一个所以被退化为指针。堆:堆顶是最近的超时事件,时间复杂度为logn,性能比链表较好,但是不能支持随机删除。红黑树:最左边的节点为最小超时事件,时间复杂度为logn。时间轮:时间轮本质是由数组实现,每个下标代            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-03-05 06:33:42
                            
                                80阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            01概述Redis 服务器是一个事件驱动程序,需要处理两类事件:文件事件:Redis 服务器通过套接字与外部进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与外部的通信会产生相应的文件事件,服务器通过监听并处理这些事件来完成一系列网络通信操作。时间事件:Redis 服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。02文件事件Redis 基于 R            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-04-19 11:23:10
                            
                                34阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            文章目录Geo查找附近商铺BitMap实现用户签到UV统计 Geo查找附近商铺Geo是GeoLocation的简称,代表地理坐标,在Redis 3.2中加入了对Geo的支持,允许存储地理坐标信息,常见的命令有: ①GEOADD key x y member [x2 y2 member]:向key中添加多个地理坐标,其中x,y是它的经纬度,member是key中的一个点 ②GEODIST key            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-10-16 21:03:16
                            
                                19阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            kafka内部为什么要设计时间轮?kafka内部有很多很多的延时任务,并没有急于JDK Timer来实现,那个插入和删除任务的时间复杂度是O(nlogn)而是与自己写的时间轮来实现的,时间复杂度是O(1),依靠时间轮机制,延时任务插入和删除O(1)时间轮是什么?其实时间轮说白了就是一个数组tickMS: 时间轮间隔 1mswheelSize: 时间大小 20个interval: tickMS *            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-04-18 13:40:50
                            
                                45阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            时间轮工作原理解析一.时间轮介绍1.时间轮的简单介绍时间轮(TimeWheel)作为一种高效率的计时器实现方案,在论文Hashed and Hierarchical Timing Wheels中被首次提出。
其被发明的主要目的在于解决当时操作系统的计时器功能实现中,维护一个定时器的开销随着所维护定时器数量的增多而逐渐变大的问题(时间复杂度为:O(n)、O(log n))。
这导致操作系统无法同时高            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-11-10 11:40:23
                            
                                118阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            一、什么是时间轮        时间轮这个技术其实出来很久了,在kafka、zookeeper等技术中都有时间轮使用的方式。 时间轮是一种高效利用线程资源进行批量化调度的一种调度模型。把大批量的调度任务全部绑定到同一个调度器上,使用这一个调度器来进行所有任务的管理、触发、以及运行。所以时间轮的模型能够高效管理各种延时任务、周期任务、通知任务。 以后大家在工作            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-06-12 21:49:17
                            
                                72阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            
             
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2021-08-10 15:56:32
                            
                                235阅读