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

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

原文地址:https://www.cnblogs.com/linhxx/p/8412906.html

时间: 2025-01-01 10:02:42

redis使用基础(十一) ——Redis特殊情况处理机制的相关文章

Redis一点基础的东西

目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结 1.基础底层数据结构 1.1.简单动态字符串SDS 定义: struct sdshdr{ int len; int free; char buf[]; } 优势: 为了重用部分C语言函数库功能,在buf里存储了空字符'\0',但是不同于C char[]的是: 取sds长度时,直接从len中获取,不是像C中遍历buf,直到遇到空字符结束. 在改变sds内容时,如果

Redis学习基础一

今天开始系统的学习redis基础知识,以往只是看redis的手册,貌似总是记不住.这次尝试手记笔记,使得印象更加深刻,从零开始学习.看是很慢,其实很快哟. 一.什么是Redis 至于什么是redis, 官网上这样给出:redis 是Salvatore Sanfilippo 这个人写的 Key-value 存储系统.Redis是一个开源的使用 C语言编写的,并且准守 BSD协议 属于Key-value 数据库.也被称为数据结构服务器,因为 value 可以是 (字符串,哈希,列表,集合,有序集合)

redis使用基础(九) ——Redis虚拟内存

redis使用基础(九) --Redis虚拟内存 (转载请附上本文链接--linhxx) 一.概述 Redis的数据是保存在内存中,当物理内存不足,其会保存在虚拟内存(VM)中.Redis的vm类似操作系统的vm,其会把所有的键都存在内存中,而把部分很少被访问到的值放在硬盘中. 操作系统的vm是基于页的概念,linux每个页4KB,而redis很多对象远小于4KB.另外,redis将交换到磁盘的对象压缩,保存到磁盘的对象可以去除指针和对象元数据,这样可以减少很多的I/O操作. redis的虚拟内

redis使用基础(六) ——Redis集群

redis使用基础(六) --Redis集群 (转载请附上本文链接--linhxx) 一.单台服务器 单台redis服务器,会出现单点故障,且需要承受所有的负载.另外,所有的内容都存在单个服务器上,该服务器会成为瓶颈. 使用多台服务器作为redis服务器,需要考虑集群管理,如数据一致性.增加节点.故障恢复等问题.redis对处理这些问题有一套方案. 二.复制 redis的持久化功能保证了数据的持久性,但是如果服务器故障,数据还是可能会丢失,因此需要将数据备份到其他服务器.当一台服务器内容更新,会

redis使用基础(十) ——Redis存储Session

redis使用基础(十) --Redis存储Session (转载请附上本文链接--linhxx) 一.概述 PHP默认是将session存于服务器的文件中.当并发量大,此方式效率低,因此可以采用redis存储session. 要改变session的存储位置,首先要改变php.ini中的配置项session.save_handler,将其值设置为user. 二.改变存储位置函数 php内置的函数session_set_save_handler可以重新设定session的保存方式,包括sessio

redis使用基础(二) ——Redis数据类型

redis使用基础(二) --Redis数据类型 (转载请附上本文链接--linhxx)  一.概述 Redis是一种Key-Value类型的数据库,属于非关系型数据库,NoSQL的一种.Redis共有5种数据类型:字符串(string).散列(hash).列表(list).集合(set).有序集合(zset). 1.通配符 Redis支持部分通配符,包括?.*.[].\x,和正则表达式一致,?表示匹配0或1个,*匹配任意个,[]匹配框内的任意一个内容,\x转义,例如\?表示匹配?. 2.获取键

redis使用基础(五) ——Redis数据持久化

redis使用基础(五) --Redis数据持久化 (转载请附上本文链接--linhxx) 当服务器突然发生问题,或者redis重启,如果希望将数据持久化在硬盘中,下次开启redis还有数据时,redis提供了两种方案,一个叫做RDB(通过内存快照(Snapshotting)实现),另一个叫做AOF(日志追加(Append-only file)).通常结合两种方式来实现redis的持久化. 1.RDB RDB通过内存快照实现,会将redis当前的全部数据以快照的方式写入二进制文件中.实现快照有以

redis使用基础(七) ——Redis管理

redis使用基础(七) --Redis管理 (转载请附上本文链接--linhxx) 一.安全性 1.运行环境 Redis以简洁为美,其安全性没有太多操作,要求在生产系统中外界不能直接连接Redis进行操作,而必须经过程序中转后,由程序进行操作. 即,redis要求运行在可信的环境中. redis服务器启动后,默认允许外界连接,可以修改其配置文件的bind,配置只能有一个路径进行连接,如bind 127.0.0.1,只允许本机连接.bind只能配置一个ip,因此设置应在防火墙中进行. 2.密码

Redis进阶实践之十一 Redis的Cluster集群搭建

原文:Redis进阶实践之十一 Redis的Cluster集群搭建 一.引言 本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的所涉及到的概念做深入的探讨.本文只是针对如何设置集群.测试和操作集群做了简述,并且从用户的角度描述了系统的行为,并不涉及Redis集群规范中所包含的细节.但是,本教程试图从最终用户的角度来解释有关Redis的Cluster集群的可用性和一致性的特点,并以简单易懂的方式讲解. 请注意,本教程需要使用Redis 3.0版本或更高版本. 如果您打算部署