Redis (六 深入了解redis内核)

时间:2022-12-03 05:17:20

### 内存淘汰

redis内存不足时,有两种处理方式:

(1)启用虚拟内存:将vm-enabled设置为yes

(2)启用内存淘汰:将maxmemory设置为一个大于0的整数

redis的使用内存大于最大分配可用内存时,开始进行淘汰,memcache只有LRU算法,redis有

1 随机淘汰:从数据库随机删除一个key

2 LRU算法:删除一个最近最少访问的key

3 TTL淘汰:删除最快过期的key


### 对象引用计数器

为了防止一个客户端调用get的同时,另一个client调用del删除key而导致的内存端错误,redis使用了内存引用计数器:给对象添加一个引用计数器,有新的引用时,计数+1 ,引用失效,计数器-1 ,引用计数为0时,redis把key删除,对象初始化时,引用计数为1  get时,引用+1  del时,引用-1 

eg:实例化refcount=1  

           get refcount=2  

           del  refcount=1  

          get结束 refcount=1,此时可以被删除


### 自动关闭超时连接

server.idletime是设置的timeout的时间,timeout=0时,自动关闭不会触发

当连接建立,却不做任何操作时,超过timeout会自动断开连接,当使用连接池时,不用配置timeout的时间,否则连接池里的连接会因超时而断开



### redis清除过期数据

redis为每个存储的数据设置一个过期时间,超过这个时间,redis把过期数据删除,redis删除数据分两个阶段

(1)在定时器serverCron中进行,每隔100ms执行一次

        activeExpireCycle随机获取一些key,如果当前时间>数据设置的过期时间,删除key,如果这些key有25%的数据过期,清理过程会继续进行,以释放更多的内存

(2)在用户get时,如果key的expiretime<time(),删除数据