redis使用基础(十一) ——Redis特殊情况处理机制

redis使用基础(十一)

——Redis特殊情况处理机制

 

(转载请附上本文链接——linhxx)

 

一、内存淘汰

         当redis的内存不足时,需要采取内存淘汰的方法,共有两种方法。一是启用虚拟内存的方式,即将redis配置文件中的vm-enabled设置成yes;二是启用内存淘汰机制,即将redis配置文件中的maxmemory设置成一个大于0的整数。

         redis内存淘汰机制共有三种:随机淘汰(随机挑选键进行淘汰)、LRU淘汰(查找键中最近最少访问的进行淘汰)、TTL淘汰(查找键中离过期时间最近的进行淘汰)。

         memcache只有LRU淘汰,相比于memcache,redis的淘汰机制丰富。redis的淘汰算法是通过配置文件中的maxmemory-policy进行设置。

         当redis内存使用量超过设置的内存时,无论是采取虚拟内存还是内存淘汰,都会循环执行,直到redis的内存使用量降到设置的内存以下为止。

 

二、对象引用计数器

         当客户端调用get获取value比较大的key,即不能通过一次I/O把数据传输完毕,而此时另一个客户端调用del删除该key,则如果对key没有保护,由于del已经把key从内存删除,而get仍在调用内存,则会访问到非法的内存地址。

         为了解决此问题,redis引入对象引用计数器,即每个数据类型的对象都有一个int型字段refcount,其默认值是1。当有地方引用该对象,则值加1;当引用完毕,则值减1。当refcount的值是0,则从内存中删除。

         该机制有效避免get的同时del导致的错误问题。当get的时候,refcount会变成2;而此时如果del,则值会变成1;当get结束时,refcount会自动减1,值变成0,则redis将其从内存中删除。

 

三、自动关闭超时连接

         redis只能处理有限的连接,为了预防客户端恶意占用连接,当一定时间不操作,redis会自动断开和客户端的连接。

         启用该功能,需要将配置文件里面的timeout设置为大于0的数,则当客户端超过timeout的值没有操作,会自动断开连接。但是当值为0,则不启用此功能。

         因此,如果要使用连接池,长期使用redis连接,则不能设置此配置,否则连接有可能会失效。

 

四、清除过期数据

         当把value存储时,如果设定了过期时间,则redis会在过期后将数据从内存删除。为了提高效率,redis用HashTable存储数据的过期时间,把key和过期时间关联。

         redis内部有定时器,每隔100毫秒会清理一次过期数据。另外当用户访问时,也会先判断是否过去,如果发现该key已经过期,则会将key从内存删除。

         定时清理机制:

redis每100毫秒随机获取10个数据的过期时间,发现有数据过期则清理。当redis发现10个数据中超过25%的数据过期(即3个或以上),则会立即再次获取10个数据。

由于定时清理是随机的,因此每次用户用key获取value时,也会进行判断,确保用户获取的key是没有过期的key。

 

 

——written by linhxx

 

更多最新文章,欢迎关注微信公众号“决胜机器学习”,或扫描右边二维码。

posted @ 2018-02-04 12:22  lin_h  阅读(174)  评论(0编辑  收藏  举报