Redis键过期策略、内存淘汰策略详解(下)

简介: Redis键过期策略、内存淘汰策略详解(下)

3 内存淘汰

3.1 内存淘汰策略

配置项

image.png

image.png

noeviction(Redis默认策略)

image.png

不删除任何东西,只需在写操作中返回错误。即不会继续服务写请求 (但DEL 请求可继续服务),读请求可继续进行。

这保证不会丢数据,但会让线上业务无法持续进行。

  • config.c
createEnumConfig("maxmemory-policy", NULL, 
  MODIFIABLE_CONFIG, maxmemory_policy_enum, 
    server.maxmemory_policy, 
      MAXMEMORY_NO_EVICTION, NULL, NULL),

allkeys-random

当内存不足以容纳新写入的数据时,在键空间中,随机移除某key。

但是凭啥随机呢,至少也是把最近最少使用的key删除。

allkeys-lru

当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key,没有设置过期时间的 key 也会被淘汰。

allkeys-lfu(Least Frequently Used)

LRU的关键是看页面最后一次被使用到发生调度的时间长短,而LFU关键是看一定时间段内页面被使用的频率

volatile-lru(最常用)

尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。

没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。

区别于 allkey-lru,这个策略要淘汰的只是过期的 key 集。

volatile-lfu

volatile-random

淘汰的 key 是过期 key 集合中随机的 key。

volatile-ttl

淘汰的策略不是 LRU,而是 key 的剩余寿命 ttl 的值,ttl

越小越优先被淘汰。

volatile-xxx 策略只会针对带TTL的 key 进行淘汰,allkeys-xxx 策略会对所有的 key 进行淘汰。

  • 若只拿 Redis 做缓存,推荐 allkeys-xxx,客户端写缓存时不必携带TTL
  • 若你还想同时使用 Redis 持久化,推荐 volatile-xxx,这样可以保留没有TTL的 key,它们是永久 key 不会被 LRU 淘汰。

数据淘汰策略

1.volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

2.volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

3.volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

4.allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰;

5.allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰;

6.no-enviction(驱逐):禁止驱逐数据。

应用场景

可以充分的利用Redis的特性,大大提高效率。


在主页中显示最新的项目列表

Redis使用的是常驻内存的缓存,速度非常快


LPUSH用来插入一个内容ID,作为关键字存储在列表头部

LTRIM用来限制列表中的项目数最多为5000

如果用户需要的检索的数据量超越这个缓存容量,这时才需要把请求发送到数据库

删除和过滤

如果一篇文章被删除,可以使用LREM从缓存中彻底清除掉


排行榜及相关问题

排行榜(leader board)按照得分进行排序


ZADD命令可以直接实现这个功能

ZREVRANGE命令可以用来按照得分来获取前100名的用户

ZRANK可以用来获取用户排名,非常直接而且操作容易

按照用户投票和时间排序

排行榜,得分会随着时间变化。

LPUSH和LTRIM命令结合运用,把文章添加到一个列表中

一项后台任务用来获取列表,并重新计算列表的排序,ZADD命令用来按照新的顺序填充生成列表。列表可以实现非常快速的检索,即使是负载很重的站点。


过期处理

使用Unix时间作为关键字,用来保持列表能够按时间排序。对current_time和time_to_live进行检索,完成查找过期项目的艰巨任务。另一项后台任务使用ZRANGE…WITHSCORES进行查询,删除过期的条目。


计数

进行各种数据统计的用途是非常广泛的,比如想知道什么时候封锁一个IP地址

INCRBY命令让这些变得很容易,通过原子递增保持计数

GETSET用来重置计数器

过期属性用来确认一个关键字什么时候应该删除


特定时间内的特定项目

这是特定访问者的问题,可以通过给每次页面浏览使用SADD命令来解决

SADD不会将已经存在的成员添加到一个集合。


Pub/Sub

在更新中保持用户对数据的映射是系统中的一个普遍任务。Redis的pub/sub功能使用了SUBSCRIBE、UNSUBSCRIBE和PUBLISH命令,让这个变得更加容易。


队列

在当前的编程中队列随处可见。除了push和pop类型的命令之外,Redis还有阻塞队列的命令,能够让一个程序在执行时被另一个程序添加到队列。



目录
相关文章
|
运维 NoSQL 测试技术
Redis:内存陡增100%深度复盘
本文深度分析了Redis内存陡增100%的一些细节和解决方案。
651 1
Redis:内存陡增100%深度复盘
|
11月前
|
存储 缓存 NoSQL
工作 10 年!Redis 内存淘汰策略 LRU 和传统 LRU 差异,还傻傻分不清
小富带你深入解析Redis内存淘汰机制:LRU与LFU算法原理、实现方式及核心区别。揭秘Redis为何采用“近似LRU”,LFU如何解决频率老化问题,并结合实际场景教你如何选择合适策略,提升缓存命中率。
1389 3
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
953 4
AI代理内存消耗过大?9种优化策略对比分析
|
12月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
585 9
|
12月前
|
机器学习/深度学习 监控 安全
解密虚拟化弹性内存:五大核心技术与实施策略
本文深入解析虚拟化环境中实现内存弹性管理的五大核心技术与实施策略。内容涵盖内存架构演进、关键技术原理、性能优化方法及典型问题解决方案,助力提升虚拟机密度与资源利用率。
486 0
|
12月前
|
存储 NoSQL 算法
应对Redis中的并发冲突:有效解决策略
以上策略各有优劣:乐观锁和悲观锁控制得当时可以很好地解决并发问题;发布/订阅模式提高了实时响应能力;Lua脚本和Redis事务保证了命令序列的原子性;分布式锁适合跨节点的并发控制;限流措施和持久化配置从系统设计层面减少并发风险;数据分片通过架构上的优化减轻单个Redis节点的负担。正确选择适合自己应用场景的策略,是解决Redis并发冲突的关键。
474 0
|
边缘计算 算法 Java
Java 绿色计算与性能优化:从内存管理到能耗降低的全方位优化策略与实践技巧
本文探讨了Java绿色计算与性能优化的技术方案和应用实例。文章从JVM调优(包括垃圾回收器选择、内存管理和并发优化)、代码优化(数据结构选择、对象创建和I/O操作优化)等方面提出优化策略,并结合电商平台、社交平台和智能工厂的实际案例,展示了通过Java新特性提升性能、降低能耗的显著效果。最终指出,综合运用这些优化方法不仅能提高系统性能,还能实现绿色计算目标,为企业节省成本并符合环保要求。
354 0
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
3465 0
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
1162 1