Redis批量删除Key及内存清理策略全解析

创始人
2024-12-15 16:01:22
0 次浏览
0 评论

对于redis的批量删除指定key,有没有好的方法

Redis可以使用flushdb/flushall删除所有key。
Del只能用于根据键进行删除。
或者,您可以设置过期时间,当密钥过期时自动关闭。

Redis的内存被占满后,如何进行清理?

当Redis内存满时,可以通过以下方式清除:1、使用redis-cli工具手动删除key。
你可以使用`keys*`命令找到所有的key,然后使用`del`命令将它们一一删除。
此方法适用于您知道哪些键可以删除的情况。
2.设置到期日期。
设置密钥到期日期。
当key过期时,Redis会自动将其删除。
该方法适用于不需要永久保存的数据。
3、使用LRU算法。
Redis4.0及以后版本支持设置最大内存限制和排除策略。
可以将其配置为当内存达到最大限制时使用LRU(最近最少使用)算法自动删除一些键。
该方法适用于不知道哪些key可以删除的情况。
4、使用RDB和AOF持久化。
RDB和AOF是Redis数据保存的两种方法。
RDB定期将数据从内存存储到磁盘,而AOF将每次写入附加到文件。
当内存满时,可以重新启动Redis并加载RDB或AOF文件来恢复数据。
该方法适用于需要保存数据的情况。
5.优化程序代码。
如果程序中有大量不必要的按键,可以考虑优化程序代码,减少按键数量。
例如,您可以将多个密钥合并为一个,或者及时删除一些不再需要的密钥。

redis删除大key集合的方法

Redis中的大键通常是指包含大量元素的集合数据类型,例如set、hash、list、sortedset等。
由于Redis在处理这些大key时的单线程特性,删除或清理大key可能会导致主线程阻塞,甚至导致Redis崩溃,导致应用程序异常。
例如,考虑一个包含6000万个用户GUID集集合的在线Redis实例。
直接使用del命令删除会严重阻塞Redis。
例如,对于64530980个元素的setkey“helper_2019-03-12”,使用del命令直接删除需要81.23秒,在超时时间短的恶劣情况下,很容易出现程序异常。
幸运的是,我使用连接池没有任何问题。
为了解决这个问题,可以使用sscan命令批量删除set集合元素。
这是一个Java示例:对于其他集合类型也有相应的方法。
当涉及到Redis监控和清理时,Python脚本通常更受欢迎,因为它们简单且轻量级。
另一方面,用Java编写简单的任务也需要打包和发布。
如果没有完整的开发和发布流程就更麻烦了。
所以懂Python的人通常也懂Java,所以很多人倾向于使用Python脚本。
下面是用于删除集合的Python脚本示例。
Redis4.0版本引入了无延迟机制,以解决使用del命令删除大键或使用flashdb或Pushall删除键时可能出现的Redis阻塞问题。
数据库。
这种机制可以在后台运行删除操作,以避免阻塞主线程。
延迟预防机制的使用分为两类:主动删除,对应DEL命令、删除过期键、移除maxmemoryke​​y、删除。
UNLINK命令是类似于DEL命令的无延迟实现。
删除集合键时,如果元素数量大于64,UNLINK会将内存释放操作传递给单独的bio。
FLUSHALL/FLUSHDBASYNC命令用于手动删除。
手动删除有防滞后机制。
四种场景对应四种配置参数,默认都是关闭的。
lazyfree-lazy-eviction:当Redis内存使用达到maxmemory并设置驱逐策略时,手动驱逐key时是否使用反惰性机制。
lazyfree-lazy-expire:对于设置为TTL的键,过期后被Redis清理和删除时是否使用反惰性机制。
lazyfree-lazy-server-del:对于某些指令,在处理现有键时存在隐式DEL键操作。
例如,在rename命令中,如果目标key已经存在,redis会先删除目标key。
如果这些目标键是大键,这将导致性能问题,从而阻止删除。
该参数设置就是为了解决这个问题,建议设置为ON。
Slave-lazy-flush:从站的完整数据同步。
在加载master的RDB文件之前,slave会运行flush来清理自己的数据场景。
根据参数设置,是否使用异常冲洗机制就这样决定了。
当Redis空闲时,它会进入activeExpireCycle循环并删除过期的键。
每个周期都会随机选择一个密钥子集来检查它们是否已过期,因此时间可能永远不会用完。
剩余的时间可以留在freeMemoryIfNeeded中用于执行。
热门文章
1
高效掌握:CMD命令轻松启动、关闭及登录... 如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...

2
MySQL分区删除技巧与8.0版本新特性... mysql删除分区在MySQL中,删除分区操作主要使用“可替代”的命令与“ dr...

3
Python代码实现:如何判断三角形的三... python三角形三条边长,判断能否构成三角形Python三角形的三个长边如下:...

4
深度解析:MySQL查询语句执行顺序及优... mysql查询语句执行顺序当这是由于执行SQL的过程时,了解其过程很重要。 ...

5
SQL教程:使用SUBSTRING和IN... sql取特定字符的前面几位字符selectsubstr('L-0FCLDRBCT...

6
MySQL日期差异计算方法:轻松获取日期... MySQL计算时间差两日期相减得月份mysql两时间相减得月MySQL计算时间之...

7
MySQL及SQL查询获取前10条数据方... MySql查询前10条数据sql语句是从MySQL获取前1 0个数据的SQL查询...

8
MySQL启动问题排查与解决指南 Mysql为什么启动不了如果要配置MySQL,则遇到无法启动的问题,可能是由于配...

9
DbVisualizer添加MySQL数... 如何在DbVisualizer中添加本地mysql数据库由于DbVisualiz...

10
SQL字段默认值设置全攻略:轻松实现自动... sql如何设置字段默认值设置SQL中某个字段的默认值;需要遵循几个步骤。首先您需...