REDIS数据库中批量删除KEY例子

Redis server went away

查看系统日志文件时发现每天定时有该错误抛出:

PHP Fatal error: 
Uncaught exception 'RedisException' with message 'Redis server went away'

抛出该问题的脚本为统计脚本,需要读取前一天数据并入库,最初以为是REDIS读取太频繁造成的,但将数据导到测试机后执行脚本发现不会出现该情况,仔细调试发现手动执行时有一行代码没有执行,若执行该行则十分缓慢。该行代码为:

$Redis->delete($Redis->keys($pre_key_del.'*'));

查看手册有相应提示:

KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集
中查找特定的 key ,你最好还是用 Redis 的集合结构(set)来代替。
登录redis通过info查看,内存使用25G多,而KEY也有1.44亿了。。。REIDS中有大量无用而又未设置过期时间的KEY存在。设置个过期时间,举手之劳的事,还是有必要的。

used_memory_human:24.72G
db0:keys=144856453,expires=25357

通过测试机执行 keys prefix* 导致REDIS卡死,其他连接也连不上。所以定位到问题出现在keys命令上,也正如手册上说的造成性能问题。

如何删除未用到的KEY?

大部分KEY是有规律的,有特定前缀,需要拿到特定前缀的KEY然后删除,网上有这样的命令:

redis-cli -a redis-pwd -n 0 keys "preffix*" | xargs redis-cli -p 6379 -a redis-pwd -n 0 del

测试机执行keys "preffix-1*"时间大概40多s,这意味着redis要停40s+,而前缀是按天设置的,这样子需要操作多次,因为业务的原因,不允许这么操作,分分钟都是钱~
最后想到的办法是先从测试机上把满足条件的key导到文本,前面的语句通过cat文本去拿。如:

redis-cli -p 6380 -a redis-pwd keys "preffix-1*" > /home/keys_redis/preffix-1

然后通过这些数据删掉生产环境上的key。

cat /home/keys_redis/preffix-1 | xargs redis-cli -a redis-pwd -n 0 del

删除的速度非常快,内存耗的也挺快,感觉像是有多少耗多少的。执行之后KEY的数量减少了95%+,内存也从25G降到了2G。不过有一个指数升高了 ———— mem_fragmentation_ratio,前后的memory对比:

# Memory 处理前
used_memory:26839186032
used_memory_human:25.00G
used_memory_rss:23518339072
used_memory_peak:26963439000
used_memory_peak_human:25.11G
used_memory_lua:31744
mem_fragmentation_ratio:0.88
mem_allocator:jemalloc-3.2.0
# Memory 处理后
used_memory:2399386704
used_memory_human:2.23G
used_memory_rss:4621533184
used_memory_peak:26963439000
used_memory_peak_human:25.11G
used_memory_lua:31744
mem_fragmentation_ratio:1.93
mem_allocator:jemalloc-3.2.0

mem_fragmentation_ratio的问题可能还需要优化下,从redis这个问题可以看到,设置cache的时候我们也需要考虑到cache的维护问题,是否该设置cache的过期时间,key的命名方式如何管理,不能只想着把数据塞进去就万事大吉了。

 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 数据
, redis
, 代码
, cache
时间
redis 批量删除key、redis 批量查询key、redis批量删除指定key、redis如何批量删除key、redis批量获取key,以便于您获取更多的相关知识。

时间: 2024-10-25 16:02:22

REDIS数据库中批量删除KEY例子的相关文章

Redis批量删除KEY的方法_Redis

Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作. 复制代码 代码如下: redis-cli keys "*" | xargs redis-cli del //如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径 //如:/opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli d

C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据

#region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// <param name="sourceDataTable">数据源表</param> /// <param name="targetTableName">服务器上目标表</param> /// <param nam

数据库 删除-为什么我删除了listview中的值,数据库中没删除呢

问题描述 为什么我删除了listview中的值,数据库中没删除呢 string connstr = ""Provider=Microsoft.Jet.OleDb.4.0;""; connstr += @""Data Source=D:Merger20150208_caohuanGEARCNC.mdb""; OleDbConnection tempconn = new OleDbConnection(connstr);//连接数

Word中批量删除节信息的方法

Word中批量删除节信息的方法   这时要想编辑页码,只有两个思路,要么一节一节的编辑(因为页码的编辑只在当前节内生效);要么就批量删除掉所有的节,再重新编辑.如果这篇文档只有十几页,我可能就会新建一个空文档,再通过复制粘贴的方法去除那些摸不着边儿的分节符了.但是此文档过于臃肿,如果这样操作甚至会死机的.而且,格式刷和"清除格式"对各种分隔符均无效. 因为批量替换空格等字符可以用过替换来实现,于是想到"可否替换掉分节符呢".Ctrl+H调出替换对话框,在"

怎样在word2013中批量删除图片

  word2013中批量删除图片的步骤如下: 步骤一:鼠标左键双击计算机桌面Word2013程序图标,将其打开运行.在打开的Word2013程序窗口,点击"打开其他文档"选项,然后选择文档所在的位置将其打开.如图所示; 步骤二:在打开的Word文档中,按下键盘的Ctrl+H快捷组合键,打开"查找和替换"对话框.如图所示; 步骤三:在替换标签中,先点击"更多"按钮,下方会出现搜索选项和替换,我们再点击"特殊格式"按钮.如图所示

源码-(急)PHP中批量删除问题&amp;amp;#39;checkbook&amp;amp;#39; 求大神看看代码哪里出现问题??????????

问题描述 (急)PHP中批量删除问题'checkbook' 求大神看看代码哪里出现问题?????????? delete.php: while($a=mysql_fetch_array($result)){ ?> <tr><td> <input name="checkbox[]" type="checkbox" value="<?php echo $result['bookno'];?>" />

sql server-按条件从数据库中批量导出excel表

问题描述 按条件从数据库中批量导出excel表 一张表中有58万条记录,产地(产地为字符型)也有200个,按产地(如产地为北京的为一个excel表)分类导出带表头的excel表,excel表名与导出的产地一致.求各位大侠帮忙,万分感谢!(用oracle,sql server都可) 解决方案 http://blog.csdn.net/yongsheng0550/article/details/6714111 解决方案二: 数据库数据批量导出到excel利用POI将数据库表导出到Excel 解决方案

.net开发中批量删除记录时实现全选功能的具体方法_实用技巧

1 . JS实现全选 往页面上拖一个GridView,设置好数据源,并为GridView添加一个模板列,往模板列里添加一个chekcbox,比如下面的代码 复制代码 代码如下: <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID"    DataSourceID="SqlD

SQL Server数据库中批量导入数据的2种方法_MsSql

在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是,如何让用户了解这些方法,让数据导入变得轻松一些.相信以下方法大家都用过了,温故而知新哈,如果有更好的方法希望大家都提出来~ 一.使用Select Into语句 若企业数据库都采用的是SQL Server数据库的话,则可以利用Select Into语句来实现数据的导入.Select Into语句,他的