本文还未完善,持续更新
需求:我需要删除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(