Redis专题(十二) ——Redis特殊情况处理机制

Redis专题(十二) ——Redis特殊情况处理机制

(原创内容,转载请注明来源,谢谢)

一、内存淘汰

当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 2017.08.15

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark学习技巧

分布式开放消息系统(RocketMQ)的原理与实践

1563
来自专栏匠心独运的博客

消息中间件—RocketMQ消息消费(三)(消息消费重试)

摘要:如果Consumer端消费消息失败,那么RocketMQ是如何对失败的异常情况进行处理? 前面两篇RocketMQ消息消费(一)/(二)篇,主要从Pus...

1293
来自专栏服务端技术杂谈

Service Mesh优化

Provider负载均衡:加权轮训,最小响应时间Tcp连接负载均衡:支持按最小请求选择Tcp连接Dubbo请求:批量encodeTcp参数优化:开启TCP_N...

942
来自专栏决胜机器学习

优化页面访问速度(三) ——服务端优化

服务端的优化,主要可以通过消息队列、减少数据库请求(缓存)、并发处理、页面静态化等方式处理。

772
来自专栏IT技术精选文摘

Kafka剖析系列之Benchmark

性能测试及集群监控工具 本章将介绍Kafka提供的性能测试工具,Metrics报告工具及Yahoo开源的Kafka Manager。 Kafka性能测试脚本 $...

2018
来自专栏Java技术

从Nginx、Apache工作原理看为什么Nginx比Apache高效!

Nginx才短短几年,就拿下了Web服务器大壁江山,众所周知,Nginx在处理大并发静态请求方面,效率明显高于Httpd,甚至能轻松解决C10K问题。

691
来自专栏yukong的小专栏

【java并发编程实战4】偏向锁-轻量锁-重量锁的那点秘密(synchronize实现原理)synchronized自旋锁偏向锁轻量锁重量锁小结

在多线程并发编程中,synchronized一直都是元老级别的角色,人们都通常称呼它为重量锁,但是在jdk1.6版本之后,jdk就对synchronized做了...

1052
来自专栏个人分享

通信协议

  由于没有存储共享器,分布式系统中的所有通信都是基于底层消息交换的。如果进程A要与进程B通信,A必须首先在自己的地址空间中生成该消息,再执行一个系统调用,通知...

582
来自专栏用户2442861的专栏

Thrift 服务器端的几种工作模式分析

相关示例代码见:http://download.csdn.net/detail/hjx_1000/8374829

632
来自专栏北京马哥教育

Linux 组调度浅析

cgroup 与组调度 linux内核实现了control group功能(cgroup,since linux 2.6.24),可以支持将进程分组,然后按组来...

2874

扫码关注云+社区