--csdn代码块高亮显示没有lua格式,凑活看吧
--选库
redis.call("select",0)--游标的id
local cursor =0--查找删除的key的数量
local keyNum =0----当前时间
local currentTime = ARGV[1]----过期时间
local expire = ARGV[2]--删除key所对应的sessionId的数量
local totalNum =0--字符串切分函数
local function splitStr(str, delimeter)
local find, sub, insert = string.find, string.sub, table.insert
local res ={}
local start, start_pos, end_pos =1,1,1whiletruedo
start_pos, end_pos =find(str, delimeter, start,true)if not start_pos then
break
end
insert(res,sub(str, start, start_pos -1))
start = end_pos +1
end
insert(res,sub(str,start))return res
end
repeat
--使用scan搜索,cursor=0的时候标识一个新的迭代期,服务器返回0的时候表示迭代已经结束
local res = redis.call("scan",cursor,"MATCH",KEYS[1],"COUNT",10000)if(res ~= nil and #res>=0) then
cursor =tonumber(res[1])
local ks = res[2]if(ks ~= nil and #ks>0) then
redis.replicate_commands()--循环删除当前迭代器迭代出的数据
for i=1,#ks,1do
local key =tostring(ks[i])--根据查询出来的key,获取value(sessionid)的数量
local valNum = redis.call("ZCARD",key)
local allVal ={}--根据key分批获取value,每次获取1000个
for j=1,valNum,1000do
local val = redis.call("ZRANGE",key,j-1,j+999)for k=1,#val,1do
allVal[j+k-1]= val[k]
end
end
--根据获取的sessionid进行关联删除
for i=1,valNum,1do--删除key为ip_*
local ip =redis.call("HGET",tostring(allVal[i]),"ip")
redis.call("UNLINK","ip_"..ip)--移除sessions
redis.call("ZREM","sessions",tostring(allVal[i]))--移除key为ent_*对应的数据
local entRealm = redis.call("HGET",tostring(allVal[i]),"ent_realm")
redis.call("ZREM","ent_"..entRealm,tostring(allVal[i]))-- 移除key为un_*对应的数据
local username = redis.call("HGET",tostring(allVal[i]),"username")
redis.call("ZREM","un_"..username,tostring(allVal[i]))--移除key为cid_*对应的数据
local callingId = redis.call("HGET",tostring(allVal[i]),"callingid")
redis.call("ZREM","cid_"..callingId,tostring(allVal[i]))--删除过期时间的key
--获取sessionid(不带ses_开头的形式)
local sessionid =splitStr(tostring(allVal[i]),'_')
redis.call("UNLINK","ex_"..sessionid[2])--删除key"ses_"
redis.call("UNLINK",tostring(allVal[i]))----记录下线数量
redis.call("INCR","offline_"..tostring(currentTime))----设置过期时间
redis.call("EXPIRE","offline_"..tostring(currentTime),expire)
end
--使用UNLINK删除,区别于del的是这个是异步执行的
--这条指令要版本大于4.0.0 小于4.0.0就使用del
redis.call("UNLINK",key)--统计删除的key的数量
keyNum = keyNum + #ks
--统计删除的sessionId数量
totalNum =totalNum+valNum
end
end
end
--当服务器返回0的时候,跳出循环
until( cursor <=0)return totalNum