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