共计 1698 个字符,预计需要花费 5 分钟才能阅读完成。
应用场景
最近联系人列表
保护长度为 100 的最近联系人列表
- 如果指定的联系人已在列表中,则从列表中移除 (lrem) lrem list 1 mobile
- 将指定的联系人增加到列表最后面 (lpush) lpush list mobile
- 如果增加实现后,列表长度超过 100,则对列表进行修剪,仅保留列表后面的 100 个联系人 (ltrim) ltrim list 0 99
限度短信频率,比方同一手机号 60 分钟之内只能发送 3 条
限度短信频率,同一手机号 60 分钟之内只能发送 3 条
精华版采纳队列实现
local lKey = KEYS[1] -- 列表键,比方间接应用手机号
local maxCount = tonumber(ARGV[1]) -- 肯定工夫内短信最多发送条数
-- 以后工夫戳,毫秒
local currentTime = tonumber(ARGV[2])
-- 一段时间:一分钟、一小时、一天,毫秒
local period = tonumber(ARGV[3])
-- 查看以后队列大小。local lSize = redis.call("llen", lKey)
-- 阐明一段时间内队列未满,间接压入队列,返回 1,示意能够发送短信
local flag = false
if lSize < maxCount then
-- 记录短信的发送工夫 (毫秒)
redis.call("lpush", lKey, currentTime)
flag = true
else
-- 取队列当中最早一条短信的发送工夫,拿以后工夫减去此工夫,如果超过“一段”工夫,则能够移掉,并压入以后短信工夫。local oldestTime = tonumber(redis.call("lindex", lKey, -1))
local result = currentTime - oldestTime
-- 以后工夫与第一条短信的发送工夫距离大于“周期”,才可持续发送
if result > period then
redis.call("rpop", lKey) -- 弹出队列中最早一条短信发送工夫
redis.call("lpush", lKey, currentTime) -- 压入最新一条短信的发送工夫
flag = true
end
end
-- 刷新键的过期工夫为“一段”工夫。redis.call("expire", lKey, period/1000)
-- flag: true 示意能够发送短信,false 则不能发送短信
if flag then
return 1
end
return 0
简陋版
--[[ 实现拜访频率的脚本.
参数: KEY[1] 用来标识同一个用户的 id
ARGV[1] 过期工夫
ARGV[2] 过期工夫内能够拜访的次数
返回值: 如果没有超过指定的频率, 则返回 1; 否则返回 0 ]]
local times = redis.call('incr', KEYS[1])
if times == 1 then -- 阐明刚创立, 设置生存工夫
redis.call('expire', KEYS[1], ARGV[1])
end
if times > tonumber(ARGV[2]) then
return 0
end
return 1
队列实现
一、非阻塞生产队列
生产者 rpush 或 lpush
消费者 lpop 或 rpop
二、阻塞生产队列
生产者 rpush 或 lpush
消费者 blpop 或 brpop
一、二两种实现有丢掉音讯的危险,当消费者网络问题或生产的过程中出现异常,音讯会丢掉。
三、牢靠生产队列
生产者 rpush 或 lpush
消费者端减少一个辅助列表 (解决中列表 processing list), 消费者生产音讯的时候采纳命令 love messageList processingList right left,当生产解决完了,从解决中列表移走解决好的音讯 lrem processingList 1 element。因为 lmove 是原子操作,所以不会失落隐没。最好另开一个线程用于监督 processingList 列表,如果滞留 processingList 列表工夫过长,视场景解决。
三、优先级队列
blpop 或 brpop 能够给定多个列表作为弹出操作的执行对象。把优先级高的队列放在第一个参数,优先级中等的队列放在第二个参数,优先级低等的队列放在第三个队列。这样就能够通过多个队列实现优先级个性。
正文完