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 条评论
登录 后参与评论

相关文章

来自专栏Python中文社区

使用Python分析nginx日志

使用Python分析nginx日志 专栏作者:熊球 ♚土木工程毕业,现从事web后端开发方面的工作,擅长python,flask框架等。 博客:codechat...

19910
来自专栏嵌入式程序猿

进入main之前,都干了什么,老实招来

经常有程序猿会说软件上电后从main函数开始执行,其实是不对的,在进入main之前,经历了好多,今天就带你来熟识下IAR环境下,应用软件系统的main函数之前的...

27510
来自专栏葡萄城控件技术团队

如何使用MOQ进行单元测试

使用MOQ来伪装和隔离被依赖对象,从而提高被测对象的测试效果。 安装 通过http://code.google.com/p/moq可以下载MOQ的最新版本。在S...

1736
来自专栏腾讯云API

【转】腾讯云 TCCLI 实践分享

原文地址:https://cloud.tencent.com/developer/article/1158013

1293
来自专栏数据和云

深入解析:由expdp遇到ORA-7445问题的深入展开

李真旭(Roger) ACOUG 核心专家,Oracle ACE,云和恩墨技术专家 编辑手记:由一个问题入手,深入其根本原因,层层递进,细致分析,由点及面,这...

2766
来自专栏GreenLeaves

EF 一对一、一对多、多对多配置语句小记

数据库实体间的关系无非有这么几种:一对一、一对多、多对多,这些关系在EF框架中分别有不同的创建方式: 1、在"Database First"模式中,这些关系通过...

2187
来自专栏web

关于HTML5中的sessionStorage和localStorage

1086
来自专栏月牙寂

[以太坊源代码分析] V. 从钱包到客户端

本文转载来源自:http://blog.csdn.net/teaspring/article/details/78350888 感谢原作者teaspring...

3243
来自专栏前端说吧

vuex - 简单使用步骤梳理,轻松掌握、附源码

2824
来自专栏Google Dart

AngularDart 4.0 高级-管道 顶

每个应用程序都以一个简单的任务开始:获取数据,转换它们,并将它们展示给用户。 获取数据可以像创建本地变量一样简单,也可以像通过WebSocket传输流数据一样复...

512

扫描关注云+社区