redis安全大量删除数据

本文介绍如何在Redis集群中安全地删除以'user'开头的所有数据,避免阻塞主节点。通过使用Redis 3.2+的SCAN命令和Lua脚本实现增量删除,结合JAVA代码实现分布式锁和读写分离环境下的操作。注意脚本的序列化方式和执行效率。
摘要由CSDN通过智能技术生成

本文还未完善,持续更新
需求:我需要删除redis集群(备机)下的关于user开头的所有数据;
顺便说下redis+lua分布式锁重点:如果是主机写,从机只读,要小心使用;这时候可能会导致多个线程同时获取锁;因为从机同步主机数据需要时间,此时从机上还没有,这个时间内如果java(或者其他)去从机获取锁,会获取不到,从而导致多个线程获取锁;
单机redis,对AOF不敏感也可使用
服务器:主节点1、主节点2、主节点3,从节点1、从节点2、从节点3;读写分离

博主背景:JAVA工程师

环境:SpringBoot2.1.1,spring-boot-starter-data-redis依赖包,不能使用默认的JDK序列化配置,如果lua脚本提示出错且lua脚本没有写错,注意修改它的序列化方式

刚开始我想到了的方案:

第一步:先key*获取所有redis相关key

第二部:再一个一个的在JAVA中循环的删除key;

那么问题来了:第一步传统的key阻塞redis的主节点1(楼主user数据只在一个主节点1操作)

导致主节点1,在4秒内无法操作;

正题
解决方案:redis3.2+ ,相应版本lua语法,SCAN增量获取key*,UNLINK BIO删除key

思路:

Redis 集群不支持 scan 命令,可以使用 ISCAN 命令, 它和 Redis 的 SCAN 命令的功能相同。ISCAN 命令的语法如下:

ISCAN idx cursor [MATCH pattern] [COUNT count]

1.编写lua脚本

2.获取所有主机节点

3.遍历所有节点执行删除

3.增量的获取key*

4.将获取到的key*循环的异步删除key

5.java执行脚本;博主传输到redis的脚本不大,且删除操作频率不高,则不采用sha1调用方式;

首先至少得看得懂 redis eval语法
在这里插入图片描述

LUA脚本

--非阻塞查找keys+异步删除key+节省网络开销
--游标的id
local cursor = 0
--查找删除的key的数量
local keyNum = 0
--循环;先循环后判断条件
repeat
  --使用scan搜索,cursor=0的时候标识一个新的迭代期,服务器返回0的时候表示迭代已经结束
  local res = redis.call(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值