你说,redis如何实现键值自动清理?(代码片段)

HollisChuang HollisChuang     2023-03-06     630

关键词:

Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制。

大家都知道,Redis缓存使用的是内存资源,虽然缓存服务器会配置比较高的内存资源,但如果对于Redis中的缓存数据我们不管不顾,内存资源总有耗尽的时候,这时缓存服务器就无法再对外提供服务了。我们要用有限的服务器资源支撑更多的业务服务,就必须要让那些访问频率不高的缓存删除掉,为新的缓存腾出内存空间。

Redis主要通过两种方式相互配合来实现键值的清理,即:过期策略和内存淘汰机制。

内存淘汰策略

当 Redis 节点分配的内存使用到达最大值以后,为了继续提供服务,Redis 会启动内存淘汰策略,在Redis4.0之前主要是以下六种淘汰策略:

  • noeviction:不淘汰任何数据,当内存不足时,执行缓存新增操作会报错,这种策略下可以保证数据不丢失,它也是 Redis 默认的内存淘汰策略。

  • allkeys-lru:淘汰整个键值中最久未使用的键值,这也就是我们常说的LRU算法。

  • allkeys-random:随机淘汰任意键值。

  • volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值。

  • volatile-random:随机淘汰设置了过期时间的任意键值。

  • volatile-ttl:优先淘汰设置了过期时间中更早过期的键值。

通过上面的内存淘汰策略可以看出,以 allkeys- 开头的表示从所有key中进行数据淘汰,而以 volatile-开头的会从设置了过期时间的key中进行数据淘汰。

而在Redis4.0版本中又新增了2种淘汰策略:

  • allkeys-lfu,淘汰整个键值中最少使用的键值,这也就是我们常说的LRU算法。

  • volatile-lfu,淘汰所有设置了过期时间的键值中最少使用的键值。

LRU(Least Recently Used,最近最少使用),根据最近被使用的时间,离当前最远的数据优先被淘汰;

LFU(Least Frequently Used,最不经常使用),在一段时间内,缓存数据被使用次数最少的会被淘汰。

大家可以在 redis.conf 配置文件中修改配置项 maxmemory-policy ,将其修改成需要设置的类型即可。

缓存过期策略

内存淘汰策略是当内存不够用时才会触发的一种机制,是缓存服务层面的操作,而过期策略定义的是具体缓存数据何时失效。我们在使用Redis的时候经常会给redis的key设置一个过期时间如:EXPIRE key 30,过期策略就是指当 Redis 中缓存的 key 过期了,Redis 如何处理。

对于已经过期的数据,Redis将使用两种策略搭配使用来删除这些过期的键值,分别是惰性删除,定期删除。

惰性删除

惰性删除 是指 Redis 服务器不主动删除过期的键值,而是在客户端要获取某个键值时,Redis会先去检测一下这个key是否已经过期,如果没有过期则返回给客户端,如果已经过期了,那么Redis会删除这个key并返回null给客户端。

惰性删除可以解决一些过期了,但没被定期删除随机抽取到的key。但有些过期的key既没有被随机抽取,也没有被客户端访问,就会一直保留在数据库,占用内存,长期下去可能会导致内存耗尽。所以Redis提供了内存淘汰机制来解决这个问题。

惰性删除的优点是不会浪费太多的系统资源,只是在每次访问时才检查键值是否过期。缺点是像上面说的删除过期键不及时,造成了一定的空间浪费。

定期删除

定期删除 是指 Redis 服务器每隔一段时间会检查一下缓存数据库,看看是否有过期键可以被清除。默认情况下 Redis 定期检查的频率是每秒扫描 10 次,用于定期清除过期键。当然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”即可,默认的值为“hz 10”。

因为key太多,如果全盘扫描所有的key会非常耗性能,所以定期删除是随机抽取一些key来删除。这样就有可能删除不完,需要惰性删除配合。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

源码讲解redis的字符串是如何实现的(代码片段)

Redis的字符串是如何实现的前言为什么不用char*传统设计操作复杂度高SDS的设计SDS的高效操作创建sds字符数组拼接长度获取预分配内存空间节省内存的设计前言字符串在日常开发中应用得比较普遍,对于Redis来说,键值对... 查看详情

源码讲解redis的字符串是如何实现的(代码片段)

Redis的字符串是如何实现的前言为什么不用char*传统设计操作复杂度高SDS的设计SDS的高效操作创建sds字符数组拼接长度获取预分配内存空间节省内存的设计前言字符串在日常开发中应用得比较普遍,对于Redis来说,键值对... 查看详情

redis丢失键值的几种情况

参考技术A大致总结一下redis丢失键值的情况一般为以下几种情况:1.是否有大量过期key被清理分析:原因:这种情况并不是真正的“丢失”键值,只是达到了设置的key的过期值应对方案:根据项目情况设置合理的键值过期时间,... 查看详情

[gowebsocket]多房间的聊天室自动清理无人房间(代码片段)

...WebSocketserver。第三篇文章:《单房间的聊天室》,介绍了如何实现一个单房间的聊天室。第四篇文章:《多房间的聊天室(一)思考篇》,介绍了实现 查看详情

python小脚本连接redis集群编辑指定键值(代码片段)

...便念念不忘了。——烽火戏诸侯《雪中悍刀行》嗯,实现很简单,连接Redis之后,直接处理就可以了,这里要注意的是集群的问题,redis连接成功,报错D:\\haojingkeji\\flask-vue-crud\\redisclear>pythonredisclear.pyredis... 查看详情

源码讲解redis的高性能hash如何设计的(代码片段)

文章目录哈希表的优势实现链式hash哈希冲突设计与实现链式hash为什么链式hash可以解决冲突实现rehash什么时候触发rehashrehash扩容渐进式rehash实现哈希表的优势哈希表作为一种关键的数据结构应用非常普遍,比如在Memcache中ÿ... 查看详情

nginx--基于crond定时服务+shell脚本实现nginx日志自动清理及备份(代码片段)

...种,核心原理都是使用kill-USR1+nginx的PID进程文件来实现本文主要介绍自定义shell脚本+crond定时任务实现。二、shell脚本2.1、脚本实现思路定义日志要保存的天数SAVE_DAYS=7重命名当天日志mv* 查看详情

使用redis实现一个轻量级的搜索引擎,牛逼!(代码片段)

...果让你实现这样的一个搜索接口,你会如何实现?(当然你说借助搜索引擎,像Elasticsearch之类的,你完全可以实现。 查看详情

linux如何清理redis缓存(代码片段)

1.在redis下查看安装目录如果命令which和whereis都找不到安装目录,可使用以下办法ps-ef|grepredis得到了进程号xxxx 然后ls-l/proc/xxxx/cwd 根据下图配置即可1)确认redis进程存活(在进程存活的基础上来清楚缓存)psaux|grep... 查看详情

linux如何清理redis缓存(代码片段)

1.在redis下查看安装目录如果命令which和whereis都找不到安装目录,可使用以下办法ps-ef|grepredis得到了进程号xxxx 然后ls-l/proc/xxxx/cwd 根据下图配置即可1)确认redis进程存活(在进程存活的基础上来清楚缓存)psaux|grep... 查看详情

python自动清理电脑垃圾文件,一键启动即可(代码片段)

...脚本直接启动就大功告成了。【阅读全文】在这个脚本的实现过程中使用到的内置库就是os库,没有通过其他的三方插件进行实现。所以也不用下载其他的py 查看详情

oracle分区表自动清理分区(代码片段)

...#xff0c;仅保留一年数据,每天清理一年前的分区数据。实现方式每次清理均处理一年前全部分区,即时某次调度执行失败,也不会造成垃圾数据堆积。示例代码--创建存储过程createorreplaceprocedurezxjy_ora.del_wen_ptasv_sql1varcha... 查看详情

详解redis内存管理机制和实现(代码片段)

原文:详解Redis内存管理机制和实现Redis是一个基于内存的键值数据库,其内存管理是非常重要的。本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略。最大内存限制Redis使用maxmemory参数限制最大可用... 查看详情

数据存储redis第三章:redis五大数据类型实现原理(代码片段)

Redis五大数据类型实现原理对于五大数据类型(String,list,Hash,Set,Zset)实现原理,Redis在底层用到了多种数据结构,通过数据结构来实现键值对,将数据结构创建了一个对象redisObject,根据对象的类型type,为对象设置多种不同的数... 查看详情

数据存储redis第三章:redis五大数据类型实现原理(代码片段)

Redis五大数据类型实现原理对于五大数据类型(String,list,Hash,Set,Zset)实现原理,Redis在底层用到了多种数据结构,通过数据结构来实现键值对,将数据结构创建了一个对象redisObject,根据对象的类型type,为对象设置多种不同的数... 查看详情

如何将redis注册为本地服务(代码片段)

1.安装Redis1)下载Redis下载地址:https://github.com/microsoftarchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.zip2)解压安装,将Redis-x64-3.2.100.zip解压到某个地址(这里解压到英文目录下)3)启动Redis:打开一个c... 查看详情

学习笔记《redis设计与实现》笔记(代码片段)

本文摘录总结自《Redis设计与实现》一书。Redis是一个键值对数据库(key-valueDB),数据库的值可以是字符串、集合、列表等多种类型的对象,而数据库的键则总是字符串对象。一、内部数据结构1.简单动态字符串(1... 查看详情

redis五种数据类型详解(代码片段)

...前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了五大数据对象,字符串对象(string)、列表对象(list)、哈希对象(hash)、集... 查看详情