背景:
RedisTemplate中批量删除可以使用redisTemplate.delete(kyes),但是前提需要进行模糊匹配即keys命令。看起来很完美,但是现实总是很残酷,在实际线上项目中不能使用,会产生性能问题会占用大量的cpu使用资源,因为redis单线程;
方案:
1,使用scan;
2,使用树状结构,rootkey - subkeys
3,lua脚本(里面也是redis命令)
RedisTemplate执行lua脚本:
redis在2.6后者更高的版本可以使用lua解释器来执行脚本从而实现原子性的操作;当然lua脚本尽可能的短并且短时间,因为慢的脚本一样会占用cup会长时间锁住;
实例:
批量删除:
local function scan(key)
local cursor = 0
local keynum = 0
repeat
local res = redis.call("scan", cursor, "match", key)
if (res ~= nil and #res >= 0) then
redis.replicate_commands()
cursor = tonumber(res[1])
local ks = res[2]
keynum = #ks
for i=1,