前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >定时自动删除redis key

定时自动删除redis key

作者头像
用户1148526
发布于 2021-12-07 04:43:22
发布于 2021-12-07 04:43:22
2.2K00
代码可运行
举报
文章被收录于专栏:Hadoop数据仓库Hadoop数据仓库
运行总次数:0
代码可运行

目录

1. 背景描述

2. 实现脚本

3. 自动执行

1. 背景描述

使用redis存储群发消息。当初匆忙上线,设计上有两个主要问题:一是在每个userid的key中存储消息体,从数据库的角度看,存在大量的数据冗余,占用大量存储空间。二是不设置key的过期时间,使得redis像貔貅一样只进不出,不断膨胀。

由于对用户的群发消息量很大,使得redis几天就内存报警。开始时使用单实例redis,遇到报警就增加maxmemory配置。后来将单实例进行拆分,按照userid取模4,拆分成4个redis实例。但结果是治标不治本,依旧撑不了几天,架不住一个劲地狂发消息啊。不得已只能采用定期删除未读消息的方案来弥补设计缺陷。

2. 实现脚本

delmsg.sh内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash

cd ~/delmsg/

# 已处理的最大logid,首次为0
max_logid=`cat max_logid.txt`

# 从mysql导出三天前的数据,这部分可以删除。mod4列用来标识userid的模数。
d=`date +'%Y-%m-%d'`
mysql -u user1 -p123456 -h 10.10.10.1 -P3306 -D db1 -N -e "
select logid, userid, msgorder, 
       case when mod(userid,4)=0 then 'mod4_0'
            when mod(userid,4)=1 then 'mod4_1'
            when mod(userid,4)=2 then 'mod4_2'
            else 'mod4_3'
       end mod4
  from batch_system_msg_user_msgorder_log 
 where yearMonth=year('$d')* 100 + month('$d')
   and createTime < date_sub('$d', interval 3 day)
   and logid > $max_logid order by logid" > yushu.txt

# 如果导出文件为空则退出脚本
if [[ ! -s yushu.txt ]] 
then
  exit 1
fi

######## 处理mod4_0(20007端口的redis实例)########

# 生成mod4_0的redis命令文件,每个文件不超过50000行,避免报redis每秒命令数超限警告
grep mod4_0 yushu.txt | awk '{print "zremrangebyscore UnReadMessageEx_"$2 " " $3 " " $3}' | split -l 50000 -d -a 5 - yushu0_

# 由于可能发生自动主从redis切换,需要从哨兵获取当前20007端口的master ip
master=`/home/redis/redis-5.0.3/src/redis-cli -p 30001 info | grep 20007 | awk -F, {'print $3'} | awk -F= {'print $2'} | awk -F: {'print $1'}`

# 删除消息。使用--pipe方式逐个处理split生成的命令文件,每个文件处理后sleep 1秒用于缓解负载。
ls -l yushu0_* | awk {'print "cat " $9 " | /home/redis/redis-5.0.3/src/redis-cli -h '$master' -p 20007 -a 123456 -n 1 --pipe; sleep 1;"'} > yushu0.sh
chmod 755 yushu0.sh
./yushu0.sh


######## 处理mod4_1(20006端口的redis实例)########
grep mod4_1 yushu.txt | awk '{print "zremrangebyscore UnReadMessageEx_"$2 " " $3 " " $3}' | split -l 50000 -d -a 5 - yushu1_

master=`/home/redis/redis-5.0.3/src/redis-cli -p 30001 info | grep 20006 | awk -F, {'print $3'} | awk -F= {'print $2'} | awk -F: {'print $1'}`

ls -l yushu1_* | awk {'print "cat " $9 " | /home/redis/redis-5.0.3/src/redis-cli -h '$master' -p 20006 -a 123456 -n 1 --pipe; sleep 1;"'} > yushu1.sh
chmod 755 yushu1.sh
./yushu1.sh


######## 处理mod4_2(20015端口的redis实例) ########
grep mod4_2 yushu.txt | awk '{print "zremrangebyscore UnReadMessageEx_"$2 " " $3 " " $3}' | split -l 50000 -d -a 5 - yushu2_

master=`/home/redis/redis-5.0.3/src/redis-cli -p 30001 info | grep 20015 | awk -F, {'print $3'} | awk -F= {'print $2'} | awk -F: {'print $1'}`

ls -l yushu2_* | awk {'print "cat " $9 " | /home/redis/redis-5.0.3/src/redis-cli -h '$master' -p 20015 -a 123456 -n 1 --pipe; sleep 1;"'} > yushu2.sh
chmod 755 yushu2.sh
./yushu2.sh


######## 处理mod4_3(20014端口的redis实例) ########
grep mod4_3 yushu.txt | awk '{print "zremrangebyscore UnReadMessageEx_"$2 " " $3 " " $3}' | split -l 50000 -d -a 5 - yushu3_

master=`/home/redis/redis-5.0.3/src/redis-cli -p 30001 info | grep 20014 | awk -F, {'print $3'} | awk -F= {'print $2'} | awk -F: {'print $1'}`

ls -l yushu3_* | awk {'print "cat " $9 " | /home/redis/redis-5.0.3/src/redis-cli -h '$master' -p 20014 -a 123456 -n 1 --pipe; sleep 1;"'} > yushu3.sh
chmod 755 yushu3.sh
./yushu3.sh

# 更新已处理的最大logid
tail -1 yushu.txt | awk '{print $1}' > max_logid.txt

# 清理文件
rm -f yushu0_* yushu1_* yushu2_* yushu3_*

3. 自动执行

在crontab中增加项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0 4 * * * /home/redis/delmsg/delmsg.sh > /home/redis/delmsg/delmsg.log 2>&1
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
按过期时间定期删除 redis Key
脚本文件 /home/redis/expired_system_message/unlink.sh 内容如下:
用户1148526
2023/11/11
2830
redis手工分片
随着数据量越来越大,一个redis实例可能需要分成多个以形成数据分片。此时通常可以采取两种方式操作:一是启用cluster模式自动完成数据分片;二是手工分片,即配置需要分片redis实例的副本,再修改应用程序按一定方式(如取模等)访问不同redis实例。cluster方式的配置可以参考“初学乍练redis:Redis 5.0.3单实例数据迁移到Cluster”。本文说明第二种方式的具体操作步骤。
用户1148526
2020/03/25
6400
定期全备redis
首先申明我的观点,redis本身只是缓存,不适合作为数据库使用,有说微博就是拿redis当DB用的,自己去证实吧。如果非要拿redis当数据库,就不得不考虑数据丢失问题,这里讨论两种常见的可能造成数据丢失的情况。
用户1148526
2020/03/18
7530
Redis 日常运维脚本(增加集群批量删除 key 功能)
Redis 日常运维脚本 中的 redis-tools.sh 仅支持删除单个 key 和 全部清理,并未实现匹配特定前缀批量删除的功能。
叨叨软件测试
2020/05/18
3.5K0
哨兵模式的redis实例重置脚本
#!/bin/bash if [ ! -n "$1" ] ;then echo "请输入集群端口号!" exit fi master_name=`/home/redis/redis-3.2.3/src/redis-cli -p 30001 info | grep $1 | awk -F"," '{print $1}' | awk -F"=" '{print $2}'` echo $master_name get_char() { SAVEDSTTY=`stty -g`
用户1148526
2021/12/07
4930
初学乍练redis:Redis 5.0.3单实例数据迁移到Cluster
在使用redis 3时,可以使用redis-migrate-tool工具做redis在线数据迁移(参考https://wxy0327.blog.csdn.net/article/details/84138537)。但是我们现在使用的redis server已经升级到5.0.3版本,再用redis-migrate-tool做迁移会报错:
用户1148526
2022/05/07
5610
Redis 5 Cluster手工指定主从关系
可以看到: 140.210.73.39:20001有1个slave 140.210.73.40:20001有2个slave 140.210.73.41:20001有3个slave
用户1148526
2019/05/25
9950
初学乍练redis:分片与集群
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/82706614
用户1148526
2019/05/25
2.1K0
哨兵模式的redis修改IP脚本
change_to_intranet_ip_6.sh #!/bin/bash get_char() { SAVEDSTTY=`stty -g` stty -echo stty cbreak dd if=/dev/tty bs=1 count=1 2> /dev/null stty -raw stty echo stty $SAVEDSTTY } # 1. 检查哨兵状态 echo -e "\n检查当前哨兵状态\n" sudo -u redis /ho
用户1148526
2022/04/13
5240
001.Redis简介及安装
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
木二
2019/07/26
3360
Redis 5.0.3单实例数据迁移到Cluster
但是我们现在使用的redis server已经升级到5.0.3版本,再用redis-migrate-tool做迁移会报错:
用户1148526
2019/05/25
1.3K0
redis全局遍历替换特征字符串
需求:将一个redis实例(如10.10.10.1:6379)范围内所有key值中的 .letssing.net 替换为 .kaixinvv.com。
用户1148526
2023/03/08
6020
Redis之主从复制1
前面的两篇文章给大家介绍了Redis的两种持久化方式RDB和AOF,两种方式各有各的优缺点,本文给大家介绍Redis的主从复制,算是Redis的第三种持久化方式。
用户4919348
2019/04/02
3550
Redis之主从复制1
Redis进阶-5.x 单节点 及Redis Cluster 3主3从集群部署
之前装过4.0.11 ----> Redis-02Redis在linux下的安装及常见问题
小小工匠
2021/08/17
7810
Redis集群搭建及原理解剖
在前面的文章,已经写过redis主从架构和redis哨兵架构了,那么本文介绍的是redis集群架构,redis集群是当前大型互联网公司常用的架构模式了,由于它的强大高效而又便捷的功能,得到了广泛的使用。
黎明大大
2021/03/09
1.2K0
如何搭建redis集群 --- redis-cluster
在之前的《来聊聊NoSql》一文中,已经说了redis三种集群模式中的主从和哨兵,接下来再看看redis-cluster怎么玩。本文基于redis-cluster官方文档(https://redis.io/topics/cluster-tutorial),将其细化具体化,每一个操作过程都详细记录,如果官方文档读起来有点吃力,本文会是你不错的选择。 本文内容包括:
贪挽懒月
2020/08/11
2K0
Mac配置redis启动脚本
Mac redis #0 GitHub # 脚本文件 https://github.com/Coxhuang/MacRedissh #1 环境 Mac #2 需求分析 配置redis后台启动脚本 #3 开始 首先需要安装redis,可以正常启动reis 新建启动redis脚本 redis-start.sh sudo vim /opt/redis/redis-start.sh #!/bin/sh cd /Users/cox/Documents/redis-5.0.3/src/ # redis的安装
Autooooooo
2020/11/09
7370
Redis 实战篇之搭建集群
Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中心化,由多个节点组成,所有节点彼此互联。Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点。
Esofar
2019/03/20
7920
Redis 实战篇之搭建集群
redis实战第三篇 redis sentinel安装和部署
三个sentinel节点,一个redis主节点,两个redis从节点 redis版本:redis-5.0.3 机器IP 192.168.0.31、192.168.0.32、192.168.0.33
我是李超人
2020/08/20
6150
初学乍练redis:一键部署集群
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/81746264
用户1148526
2019/05/25
5790
相关推荐
按过期时间定期删除 redis Key
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验