常用命令介绍:
命令 | 用例 | 介绍 | link |
---|---|---|---|
rpush | rpush key-name value [value ...] | 将一个或多个值推入到列表的右端 | |
lpush | lpush key-name value [value ...] | 将一个或多个值推入到列表的左端 | |
rpop | rpop key-name | 移除并返回列表最右端的元素 | |
lpop | lpop key-name | 移除并返回列表最左端的元素 | |
lindex | lindex key-name offset | 返回列表中偏移量为offset的元素 | |
lrange | lrange key-name start end | 返回列表从start偏移量到end偏移量范围内的所有元素,其中偏移量为start和偏移量为end的元素也会包含在被返回的元素之内 | |
ltrim | ltrim key-name start end | 对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,其中偏移量为start和偏移量为end的元素也会被保留 | |
blpop | blpop key-name [key-name ...] timeout | 从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现 | |
brpop | brpop key-name [key-name ...] | 从第一个非空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现 | |
rpoplpush | rpoplpush source-key dest-key | 从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素 | |
brpoplpush | brpoplpush source-key dest-key timeout | 从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果source-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现 | |
lrem | lrem key count element | 从列表中删除一些(count)等于element的元素,count = 0,删掉列表中所有等于element的元素, count > 0,从左到右删除指定数量个等于element的元素, count < 0,从右到左删除指定数量个等于elemnt的元素 | https://redis.io/commands/lrem/ |
linsert | linsert key BEFORE或AFTER pivot element | 在列表某个元素(pivot)的前面或后面插入元素element。如果pivot有多个,定位到列表左起第一个;如果pivot不存在,返回-1,否则返回列表长度 | https://redis.io/commands/lin... |
llen | llen key | 返回列表的长度。如果列表不存在,返回0。 | https://redis.io/commands/llen/ |
lset | lset key index element | 给列表指定位置设置成元素element | https://redis.io/commands/lset/ |
rpushx | rpushx key-name value [value ...] | 在列表存在的情况,从右边插入多个值。如果列表不存在,没有任何影响 | https://redis.io/commands/rpu... |
lpushx | lpushx key-name value [value ...] | 在列表存在的情况,从左边插入多个值。如果列表不存在,没有任何影响 | https://redis.io/commands/lpu... |
LMPOP | numkeys key [key ...] LEFT 或 RIGHT [COUNT count] | Pop elements from a list | https://redis.io/commands/lmpop/ |
BLMPOP | numkeys key [key ...] LEFT 或 RIGHT [COUNT count] | Pop elements from a list, or block until one is available | https://redis.io/commands/blm... |
LMOVE | LMOVE source destination LEFT 或 RIGHT LEFT 或 RIGHT | Pop an element from a list, push it to another list and return it | |
BLMOVE | source destination LEFT 或 RIGHT LEFT 或 RIGHT timeout | Pop an element from a list, push it to another list and return it; or block until one is available | |
LPOS | LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len] | Return the index of matching elements on a list |
使用场景
最近联系人列表
维护长度为 100 的最近联系人列表
- 如果指定的联系人已在列表中,则从列表中移除 (lrem) lrem list 1 mobile
- 将指定的联系人添加到列表最前面 (lpush) lpush list mobile
- 如果添加完成后,列表长度超过 100 ,则对列表进行修剪,仅保留列表前面的 100 个联系人 (ltrim) ltrim list 0 100
限制短信频率,比如同一手机号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