redis数据类型之string,list
华子目录
- key操作
- 说明
- `SCAN cursor [MATCH pattern] [COUNT count]`
- `dump`与`restore`
- `keys 通配符`
- 示例演示
- `string`
- 说明
- `setbit key offset value`
- `getbit key offset`
- `setrange key offset value`
- `List`
- 结构图
- 相关命令
- `lrem key count value`
- `ltrim key count value`
- 示例:使用 LTRIM 裁剪列表
- `blpop key1 [key2...] timeout`
- `brpoplpush source destination timeout`
- 命令语法
- 返回值
- 特点与注意事项
- 示例
- `rpoplpush source destination`
- 命令语法
- 返回值
- 示例
- 应用场景
- `lmove source destination left|right left|right`
- 命令语法
- 示例
- 注意点
- 返回值
- 总结
key操作
命令 | 说明 |
---|---|
del key名 | 在key存在 时删除key |
exists key名 | 检查给定 key 是否存在,存在 返回1 ,否则返回0 |
keys 通配符 | 查找所有符合给定模式( pattern)的 key |
move key名 dbid | 将当前数据库的 key 移动到给定的数据库 dbid 当中 |
rename key名 新key名 | 修改 key 的名称 |
renamex key名 新key名 | 仅当newkey 不存在时,将key 改名为newkey |
type key名 | 返回 key 所储存的值的类型 |
select dbid | 切换数据库 ,数据库为0-15 (默认一共16 个数据库) |
dbsize | 查看数据库的key 数量 |
flushdb | 清空当前数据库中的数据 |
flushall | 清空所有数据库中的数据 |
echo | 打印命令 |
dump key名 | 序列化给定 key ,并返回被序列化的值 |
expire key名 seconds | 为给定 key 设置过期时间,以秒计 |
expireat key名 timestamp | 为 key 设置过期时间,时间参数是 UNIX 时间戳 |
pexprieat key名 milliseconds-timestamp | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
persist key名 | 移除 key 的过期时间,key 将持久保持 |
ttl key名 | 以秒 为单位,返回给定 key 的剩余生存时间 (TTL, time to live),如果 key 不存在或者没有设置过期 时间,则返回 -1 或 -2。 |
pttl key名 | 以毫秒 为单位返回 key 的剩余的过期时间 |
randomkey | 从当前数据库中随机返回一个 key |
scan cursor [match pattern] [count count] | 迭代数据库中的数据库键 |
说明
SCAN cursor [MATCH pattern] [COUNT count]
SCAN cursor [MATCH pattern] [COUNT count]
是 Redis 数据库中的一个命令,用于迭代数据库中的键。这个命令特别有用,因为它允许你在不阻塞 Redis 服务器的情况下,以增量方式检索键。
这里是命令的各个部分的解释:
-
SCAN cursor:
cursor
是一个无符号的 64 位整数,用于迭代过程。在第一次调用SCAN
时,应将其设置为0
。每次调用SCAN
后,它都会返回一个新的cursor
值,你可以在下一次调用时使用这个值来继续迭代。- 当
cursor
返回0
时,表示迭代已完成。
-
[MATCH pattern]:
- 这是一个可选参数,允许你指定一个模式来过滤返回的键。模式使用 glob 风格的通配符,其中
?
匹配一个字符,而*
匹配零个或多个字符。 - 例如,
MATCH user:*
将只返回以 “user:” 开头的键。
- 这是一个可选参数,允许你指定一个模式来过滤返回的键。模式使用 glob 风格的通配符,其中
-
[COUNT count]:
- 这也是一个可选参数,它告诉 Redis 在每次迭代中尝试返回的键的数量。请注意,这是一个提示,而不是一个严格的限制。Redis 可能会返回更多的键,也可能会返回更少的键。
- 使用
COUNT
可以帮助你更好地控制迭代的速度和资源的使用。例如,如果你希望迭代进行得慢一些以减少对 Redis 的压力,你可以设置一个较小的count
值。
示例:
假设你有一个包含大量键的 Redis 数据库,并且你想迭代并打印出所有以 “user:” 开头的键。你可以使用如下的 Lua 脚本来完成这个任务(这里使用 Redis 的 Lua 脚本只是为了演示目的,实际上你可以直接在 Redis 命令行或客户端中调用 SCAN
命令):
local cursor = '0'
local pattern = 'user:*'
local count = 100repeatlocal res = redis.call('SCAN', cursor, 'MATCH', pattern, 'COUNT', count)cursor = res[1]local keys = res[2]for i, key in ipairs(keys) doprint(key)end
until cursor == '0'
这个脚本会不断调用 SCAN
命令,直到迭代完成(即 cursor
变为 0
)。在每次迭代中,它都会打印出返回的键。
dump
与restore
- 在 Redis 中,
DUMP
命令用于序列化给定的键(key),并返回一个包含键值
的序列化版本的二进制字符串
。这个命令对于迁移或备份特定键的值非常有用。
DUMP
命令的语法如下:
DUMP key
其中 key
是你想要序列化的键的名称。
如果键存在,DUMP
命令将返回一个包含两个元素的字符串数组:
- 第一个元素是一个字符串,表示该键值的序列化版本。
- 第二个元素是一个整数,表示该键值的 RDB 版本(Redis Database version)。在大多数情况下,这个值可以被忽略,除非你在处理 RDB 格式的 Redis 快照。
例如,假设你在 Redis 中设置了一个键值对,并且键为 “mykey”,值为 “Hello, Redis!”,你可以使用 DUMP
命令来序列化这个键的值:
redis-cli DUMP mykey
输出可能类似于:
"\x00\x0dHello, Redis!\r\n"
注意这个输出是一个二进制字符串,并且可能包含不可见的字符(如换行符)。这个序列化字符串可以使用 RESTORE
命令在另一个 Redis 数据库中恢复为原始键值对。
RESTORE
命令的语法如下:
RESTORE key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME idle-time] [FREQ freq]
其中:
key
是要恢复的键的名称。ttl
是该键的过期时间(以秒为单位),如果设置为 0,则键永不过期。serialized-value
是DUMP
命令返回的序列化值。[REPLACE]
是一个可选参数,如果键已经存在并且设置了该参数,则替换旧值。[ABSTTL]
是一个可选参数,如果设置,则ttl
是绝对时间戳(以 UNIX 时间戳表示)。[IDLETIME idle-time]
是一个可选参数,用于设置键的空闲时间。[FREQ freq]
是一个可选参数,用于设置访问频率(仅在 Redis 6.0 及更高版本中可用)。
请注意,DUMP
和 RESTORE
命令通常用于高级用例,如跨 Redis 实例迁移数据。对于常规的数据备份和恢复操作,你可能需要使用其他方法,如 Redis 的持久化功能(RDB 快照或 AOF 日志)或 Redis 的复制和集群功能。
keys 通配符
keys *
匹配数据库中所有key
keys h?llo
匹配hello,hallo,hxllo
等keykeys h*llo
匹配hllo,heeello
等keykeys h[ae]llo
匹配hello,hallo
示例演示
[root@server ~]# redis-cli -p 6379 #-p指定端口号
127.0.0.1:6379> dbsize
(integer) 0
127.0.0.1:6379> set name huazi
OK
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> get name
"huazi"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> dbsize
(integer) 0
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set name huazi
OK
127.0.0.1:6379[1]> move name 0
(integer) 1
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> get name
"huazi"
127.0.0.1:6379> keys na*
1) "name"
127.0.0.1:6379> exists name #存在返回1,
(integer) 1
127.0.0.1:6379> exists name1 #不存在返回0
(integer) 0
127.0.0.1:6379> expire name 10 #设置10s期限
(integer) 1
127.0.0.1:6379> get name #10s内可以得到key值
"huazi"
127.0.0.1:6379> get name #10s过后key值被销毁
(nil)
127.0.0.1:6379> set name huazi
OK
127.0.0.1:6379> rename name key
OK
127.0.0.1:6379> get key
"huazi"
127.0.0.1:6379> expire key 30 #设置过期时间为30s
(integer) 1
127.0.0.1:6379> ttl key #查看剩余时间
(integer) 27
127.0.0.1:6379> persist key #将key的时间设置为永久
(integer) 1
127.0.0.1:6379> ttl key
(integer) -1127.0.0.1:6379> set name huazi
OK
127.0.0.1:6379> flushdb #删除当前数据库中的数据
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> select 1 #切换到1数据库
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> select 0 #切换到0数据库
OK
127.0.0.1:6379> flushall #删除所有数据库中的数据
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379[1]> set name huazi
OK
127.0.0.1:6379[1]> move name 0 #将key为name的键值对移动到0数据库,移动后就没有这个键值对了
(integer) 1
127.0.0.1:6379[1]> keys *
(empty array)
string
String
是redis
最基本的类型,你可以理解成与Memcached
一模一样的类型,一个key
对应一个value
。String
类型是二进制安全的意思是redis
的string
可以包含任何数据
。比如jpg
图片或者序列化的对象。
String
类型是Redis
最基本的数据类型,String
类型的值最大能存储512MB。
String
类型一般用于缓存、限流、计数器、分布式锁、分布式Session。
命令 | 说明 |
---|---|
set key value | 设置指定 key 的值 |
get key | 获取指定 key 的值 |
getrange key start end | 返回 key 中字符串值的子字符 ,end=-1 时表示全部 |
setbit key offset value | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) |
getbit key offset | 对 key 所储存的字符串值 ,获取指定偏移量上的位(bit) |
mset key value [key value...] | 同时设置一个 或多个 key-value 对 |
mget key1 [key2...] | 获取所有(一个或多个)给定 key 的值 |
getset key value | 将给定 key 的值设为 value ,并返回 key的旧值(old value) |
setex key seconds value | 设置key 的值value ,并将 key 的过期时间设为 seconds (以秒 为单位) |
setnx key value | 只有在 key 不存在时设置 key 的值 |
setrange key offset value | 用 value 参数覆盖给定 key 所储存的字符串值,从偏移量 offset 开始,默认从下标0 开始 |
strlen key | 返回 key 所储存的字符串值的长度 |
msetnx key value [key value...] | 同时设置一个 或多个 key-value 对,当且仅当所有给定 key 都不存在 |
psetex key milliseconds value | 与 setex 命令相似,但它以毫秒 为单位设置 key 的生存时间 |
incr key | 将 key 中储存的数字值增一 |
incrby key increment | 将 key 所储存的值加上给定的增量值(increment) |
incrbyfloat key increment | 将 key 所储存的值加上给定的浮点增量值(increment) |
decr key | 将 key 中储存的数字值减一 |
decrby key decrement | key 所储存的值减去 给定的减量值(decrement) |
append key value | 如果 key 已经存在并且是一个字符串,append 命令将指定的 value 追加到该 key 原来值 value 的末尾 |
说明
setbit key offset value
- 在
Redis
中,SETBIT
命令用于设置字符串值(string value
)在指定偏移量(offset
)上的位(bit
)的值。这个命令在二进制数据处理中
非常有用,特别是当你需要以位
为单位
存储或修改数据
时。
SETBIT
命令的语法如下:
SETBIT key offset value
key
是你想要操作的键的名称。offset
是你想要设置的位的偏移量(从 0 开始计数)。value
是你想要设置的位的值,只能是 0 或 1。
如果 key
不存在,Redis 会创建一个新的字符串值,并且这个字符串值的长度足以容纳指定的偏移量。在偏移量之后的字符串部分会被填充为 0(即空的二进制字符串)。
如果 offset
大于当前字符串值的长度,Redis 会在字符串的末尾添加足够的 0 来达到指定的偏移量,然后设置该位的值。
需要注意的是,SETBIT
命令并不会自动扩展字符串的长度以包含整个字节(8位)。如果你设置了一个字符串末尾之后的位,Redis 只会扩展字符串到足以包含该位的长度,而不会扩展到下一个完整的字节。
示例:
- 假设你有一个名为
mykey
的键,并且它的值是字符串"a"
(在 ASCII 中,'a'
的值是 97,其二进制表示为01100001
)。现在你想要设置第 7 位的值为 1(从右往左数,最低位是第 0 位):
redis-cli SETBIT mykey 7 1
这个命令将把 mykey
的值修改为二进制表示 01100011
,对应的 ASCII 字符是 'c'
。所以,如果你之后使用 GET mykey
命令,你将得到值 "c"
。
注意:虽然 SETBIT
命令可以修改字符串中的位,但修改后的字符串可能不再是一个有效的文本字符串(即它可能不再表示一个可打印的字符或字符串)。在上面的示例中,我们修改了 'a'
的二进制表示来得到一个不同的字符 'c'
。但是,你也可以使用 SETBIT
命令来修改任意二进制数据,而不仅仅是可打印的字符串。
getbit key offset
- 在 Redis 中,
GETBIT
命令用于获取字符串值(string value
)在指定偏移量(offset
)上的位的值。这个命令在处理二进制数据时非常有用,因为它允许你以位为单位读取数据。
GETBIT
命令的语法如下:
GETBIT key offset
key
是你想要获取其位值的键的名称。offset
是你想要获取的位的偏移量(从 0 开始计数)。
如果 key
不存在,或者 offset
超出了字符串值的长度,GETBIT
命令将返回 0
。
示例:
假设你有一个名为 mykey
的键,并且它的值是字符串 "a"
(在 ASCII 中,'a'
的值是 97,其二进制表示为 01100001
)。现在你想要获取第 2 位的值(从右往左数,最低位是第 0 位):
redis-cli GETBIT mykey 2
这个命令将返回 1
,因为第 2 位(从右往左数)在二进制表示 01100001
中是 1
。
如果你尝试获取一个不存在的键的位值,或者一个存在的键但偏移量超出了其值的长度,GETBIT
命令将返回 0
:
redis-cli GETBIT nonexistingkey 0 # 返回 0,因为键不存在
redis-cli SET mykey "a"
redis-cli GETBIT mykey 7 # 返回 0,因为 "a" 的二进制表示只有 7 位,第 7 位不存在
请注意,偏移量是从 0 开始的,并且 Redis 允许你访问字符串值末尾之后的位(即超出当前字符串长度的偏移量),但这些位的值将被视为 0
。
setrange key offset value
SETRANGE 命令在 Redis 中的用法
SETRANGE 是 Redis 中的一个命令,用于在指定的 key 所储存的字符串值中,从偏移量 offset 开始,用指定的字符串 value 覆盖。以下是关于 SETRANGE 命令的详细解释:
-
基本语法:
SETRANGE key offset value
key
:需要修改的字符串键名。offset
:开始覆盖的偏移量。value
:要覆盖的字符串值。
-
返回值:
命令执行后,返回被修改后的字符串总长度。 -
注意事项:
- 如果
key
原来储存的字符串长度比offset
小,那么在原字符串
和offset
之间的空白部分将用零字节(“\x00”)来填充。 - 最大偏移量是 2^29-1(即 536,870,911),因为
Redis
字符串的大小被限制在 512 兆以内。如果需要更大的空间,可以使用多个key
来实现。 - 当生成一个很长的字符串时,
Redis
需要分配内存空间,这有时候可能会造成服务器阻塞。
- 如果
-
命令示例:
- 假设当前 key “url” 的值为 “this site”:
127.0.0.1:6379> SET url "this site" OK 127.0.0.1:6379> SETRANGE url 5 www.biancheng.net (integer) 22 127.0.0.1:6379> GET url "this www.biancheng.net"
- 这里,我们从偏移量 5 开始,用
"www.biancheng.net"
覆盖了原来的字符串。
- 假设当前 key “url” 的值为 “this site”:
-
内存分配:
- 当首次为 key 分配内存空间时,Redis 会根据需要分配足够的内存来存储字符串。如果之后再次对该 key 使用 SETRANGE 命令,并且新的字符串长度没有超过已分配的内存大小,Redis 则不会重新分配内存。
-
版本要求:
- SETRANGE 命令在 Redis 2.2.0 及之后的版本中可用。
综上所述,SETRANGE 命令为 Redis 提供了一个在字符串中指定位置进行覆盖的功能,使得对字符串的修改操作更加灵活和高效。
List
Redis列表
是简单的字符串列表
,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)
或者尾部(右边)
一个列表最多可以包含2^32^ - 1
个元素(4294967295, 每个列表超过40亿个元素)。
List
类型一般用于关注人、简单队列
等
结构图
相关命令
命令语法 | 说明 |
---|---|
lpush key value1 [value2...] | 将一个 或多个值 插入到列表头部 |
lpop key | 移出 并获取 列表的第一个元素 |
lrange key start stop | 获取 列表指定范围内的元素 |
lpushx key value | 将一个值 插入到已存在 的列表头部 |
rpush key value1 [value2...] | 在列表 中添加一个 或多个值 |
rpop key | 移除 列表的最后一个元素 ,返回值为移除的元素 |
rpushx key value | 为已存在的列表添加值 |
llen key | 获取列表长度 |
linsert key before | after pivot value | 在列表的pivot元素前 或者后插入value元素 |
lindex key index | 通过索引获取 列表中的元素 |
lset key index value | 通过索引 修改列表元素的值 |
lrem key count value | 移除列表元素 |
ltrim key count value | 对一个列表进行修剪,就是让列表只保留指定区间内的元素 ,不在指定区间之内的元素都将被删除 |
blpop key1 [key2...] timeout | 移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 block left pop (两个会话测试) |
brpop key1 [key2...] timeout | 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
brpoplpush source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
rpoplpush source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
lmove source destination right left | 将source 的右边的值移动到destination 左边插入 |
lmpop numkeys key1 [key2...] left|right count | 给定多个列表key1 key2 判断key1是否为空,不为空弹出该key的元素,为空直到找到不为空的key弹出对应的元素。 |
lrem key count value
LREM
是 Redis 中的一个命令,用于从列表中移除指定数量的、与指定值相等的元素。以下是关于 LREM
命令的详细说明:
命令语法:
lrem key count value
key
:列表的键名。count
:要移除的元素数量。这个参数有几个可能的值:- 如果
count
> 0,则从头向尾搜索并移除等于value
的元素,直到移除了count
个。 - 如果
count
< 0,则从尾向头搜索并移除等于value
的元素,直到移除了abs(count)
个。 - 如果
count
= 0,则移除列表中所有等于value
的元素。
- 如果
value
:要移除的元素的值。
返回值:
- 命令执行后被移除的元素数量。
ltrim key count value
- 实际上,
ltrim
命令在Redis
中并不是通过key count value
这样的参数来使用的。LTRIM
命令用于对列表进行裁剪,保留指定范围内的元素,而不需要指定一个具体的值。
命令语法:
LTRIM key start stop
key
:列表的键名。start
和stop
:要保留的元素的索引范围。索引从0
开始。例如,0
表示列表的第一个元素,-1
表示列表的最后一个元素,-2
表示倒数第二个元素,依此类推。
示例:
假设我们有一个名为 mylist
的 Redis 列表,它包含以下元素:
redis-cli RPUSH mylist 1 2 3 4 5
此时,mylist
的内容为 [1, 2, 3, 4, 5]
。
示例:使用 LTRIM 裁剪列表
如果我们想要保留索引从 1
到 3
(包含)的元素(即 [2, 3, 4]
),我们可以这样做:
redis-cli LTRIM mylist 1 3
执行后,mylist
的内容将变为 [2, 3, 4]
。
请注意,如果 start
的值大于列表的实际长度,或者 start
大于 stop
,则列表将被清空。
例如,如果我们执行以下命令:
redis-cli LTRIM mylist 10 15
由于列表 mylist
只有 5 个元素,索引从 0
到 4
,所以执行上述命令后,mylist
将被清空。
另外,如果你之前提到的 lrem key count value
是一个误解或笔误,请忽略,因为我已经在之前的回答中解释了 LREM
命令的用法。
blpop key1 [key2...] timeout
BLPOP
是Redis
中的一个命令,用于从列表的左侧移除并获取一个或多个列表中的第一个元素,如果列表为空,则阻塞等待直到有元素可获取或者超过指定的超时时间。
命令语法:
blpop key1 [key2 ...] timeout
key1 [key2 ...]
:一个或多个列表的键名。BLPOP
会按照给定的key
顺序检查列表,并在找到第一个非空列表时从中弹出一个元素。timeout
:阻塞等待的时间(以秒为单位),或者为0
表示永远阻塞。
返回值:
- 如果在
timeout
秒内找到了一个非空列表并成功弹出元素,则返回包含两个元素的列表:第一个元素是被弹出元素的列表名,第二个元素是被弹出的元素值。 - 如果在
timeout
秒内没有找到任何非空列表,则返回nil
。
示例:
假设我们有两个列表 list1
和 list2
,它们的内容分别为:
redis-cli RPUSH list1 a b c
redis-cli RPUSH list2 x y z
此时,list1
的内容为 [a, b, c]
,list2
的内容为 [x, y, z]
。
如果我们执行以下命令:
redis-cli BLPOP list1 list2 5
因为 list1
是非空的,所以 BLPOP
会立即返回 list1
的第一个元素 a
,并同时从 list1
中移除该元素。返回的结果将是:
1) "list1"
2) "a"
如果我们再次执行相同的命令(此时 list1
的内容为 [b, c]
),BLPOP
仍然会立即返回 list1
的第一个元素 b
。
但是,如果我们清空 list1
和 list2
,并尝试执行以下命令:
redis-cli BLPOP list1 list2 5
由于两个列表都是空的,BLPOP
会阻塞等待,直到有元素被添加到其中一个列表,或者超过 5 秒的超时时间。如果 5 秒内没有任何变化,则返回 nil
。
BLPOP
常用于实现队列(queue)或任务列表(task list)等需要按照顺序处理元素的应用场景。
brpoplpush source destination timeout
BRPOPLPUSH
是 Redis 中的一个命令,它是 RPOPLPUSH
的阻塞版本。这个命令主要用于从一个列表(source)的尾部弹出一个元素,并将其推送到另一个列表(destination)的头部。如果 source 列表为空,Redis 会阻塞这个连接,直到另一个客户端 push 元素进入 source 列表,或者达到指定的超时时间(timeout)。
以下是关于 BRPOPLPUSH
命令的详细解释:
命令语法
BRPOPLPUSH source destination timeout
source
:要弹出最后一个元素的列表的键名。destination
:要将弹出的元素插入的列表的键名。timeout
:超时时间(以秒为单位)。设置为 0 表示无限期阻塞。
返回值
- 如果在超时时间内 source 列表中有元素被弹出,命令将返回被弹出元素的值。
- 如果在超时时间内没有任何元素被弹出,命令将返回一个
nil
和等待时长(以秒为单位)。
特点与注意事项
- 如果
source
列表在调用命令时不存在或为空,Redis 会阻塞客户端连接,直到source
列表中有元素可用或超时。 - 如果
source
和destination
是同一个列表,这个命令可以看作是列表的翻转操作,将尾部元素移动到头部。 timeout
参数允许你指定一个最大等待时间。如果在这个时间内没有元素被弹出,命令将返回nil
和等待时长。BRPOPLPUSH
命令的时间复杂度为 O(1),因为它只涉及常数时间的操作。
示例
假设我们有两个列表 list1
和 list2
,其中 list1
为空,list2
包含一些元素。如果我们执行以下命令:
redis-cli BRPOPLPUSH list1 list2 10
Redis 会阻塞这个连接,等待 list1
中有元素被 push,或者等待 10 秒超时。因为 list1
为空且没有新元素被 push 进去,所以这个命令在 10 秒后将返回一个 nil
和等待时长 10.xx
秒。
如果我们在另一个客户端中向 list1
push 一个元素,比如 a
,那么上述被阻塞的 BRPOPLPUSH
命令会立即返回,并将 a
插入到 list2
的头部,同时从 list1
中移除 a
。返回的值将是 a
。
rpoplpush source destination
RPOPLPUSH
是Redis
中的一个命令,它从一个列表(source)的尾部移除并获取一个元素,然后将这个元素推送到另一个列表(destination)的头部。这个命令是一个原子操作,即它在执行过程中不会被其他命令打断。
命令语法
RPOPLPUSH source destination
source
:要弹出最后一个元素的列表的键名。destination
:要将弹出的元素插入的列表的键名。
返回值
- 如果
source
列表不为空,命令将返回被弹出元素的值。 - 如果
source
列表为空,命令将返回nil
。
示例
假设我们有两个列表 list1
和 list2
,其中 list1
包含一些元素,而 list2
为空或包含其他元素。如果我们执行以下命令:
redis-cli RPOPLPUSH list1 list2
Redis 会从 list1
的尾部弹出一个元素,并将其推送到 list2
的头部。如果 list1
不为空,这个命令将返回被弹出元素的值;如果 list1
为空,这个命令将返回 nil
。
应用场景
RPOPLPUSH
命令通常用于实现消息队列或任务队列的场景。例如,你可以将待处理的任务推送到一个列表(例如 tasks
),并使用多个工作进程或线程来消费这些任务。每个工作进程或线程可以使用 BRPOPLPUSH
(阻塞版本的 RPOPLPUSH
)或 RPOPLPUSH
来从 tasks
列表中获取任务,并在处理完任务后将结果推送到另一个列表(例如 results
)。这样可以确保任务的处理是顺序的,并且可以在多个工作进程或线程之间平衡负载。
lmove source destination left|right left|right
LMOVE
是 Redis
中的一个命令,用于从一个列表(source)中移除一个元素,并将其推送到另一个列表(destination)中。该命令允许指定元素是从列表的左侧还是右侧移除,并指定推送到目标列表的左侧还是右侧。
命令语法
LMOVE source destination LEFT|RIGHT LEFT|RIGHT
source
:源列表的键名。destination
:目标列表的键名。- 第一个
LEFT|RIGHT
:指定从源列表中移除元素的位置(LEFT 表示左侧,RIGHT 表示右侧)。 - 第二个
LEFT|RIGHT
:指定将元素推送到目标列表的位置(LEFT 表示左侧,RIGHT 表示右侧)。
示例
假设我们有以下两个列表:
source
列表成员为:a, b, c
destination
列表成员为:x, y, z
如果我们执行以下命令:
redis-cli LMOVE source destination RIGHT LEFT
那么执行后的结果将是:
source
列表成员变为:a, b
destination
列表成员变为:c, x, y, z
在这个例子中,我们从 source
列表的右侧(RIGHT)移除了元素 c
,并将其推送到了 destination
列表的左侧(LEFT)。
注意点
- 如果
source
列表不存在,LMOVE
命令将返回nil
并且不会执行任何操作。 - 如果
source
和destination
列表相同,并且指定的移除和推送位置也相同(例如LMOVE mylist mylist RIGHT RIGHT
),则这个命令相当于在列表内部移动元素,即实现列表的循环。 - 如果
source
列表为空,则LMOVE
命令同样会返回nil
并且不会执行任何操作。
返回值
- 如果命令成功执行,则返回被移除并推送到目标列表的元素值。
- 如果命令未执行任何操作(例如,因为源列表不存在或为空),则返回
nil
。
总结
LMOVE
命令提供了在 Redis 中从一个列表移除元素并将其推送到另一个列表的功能,同时允许指定移除和推送的位置。这使得在处理列表数据时具有更大的灵活性。
相关文章:

redis数据类型之string,list
华子目录 key操作说明SCAN cursor [MATCH pattern] [COUNT count]dump与restorekeys 通配符 示例演示 string说明setbit key offset valuegetbit key offsetsetrange key offset value List结构图相关命令lrem key count valueltrim key count value示例:使用 LTRIM…...
Android android.os.DeadObjectException aidl通信异常分析及解决
问题描述 做一款音乐播放应用,播放服务是通过AIDL形式对外暴露,允许跨进程调用且多个App同时操作音乐播放,偶现android.os.DeadObjectException问题 12-15 09:28:12.371: W/System.err(5412): android.os.DeadObjectException 12-15 09:28:…...

dp + 计数,1954D - Colored Balls
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1954D - Codeforces 二、解题报告 1、思路分析 本题前置题目: 1953. 你可以工作的最大周数 通过前置题目可以知道如何计算两两不同数对序列的最大长度 我们记最大数量为ma…...

【设计模式深度剖析】【5】【结构型】【桥接模式】| 以电视和遥控器为例加深理解
👈️上一篇:组合模式 设计模式-专栏👈️ 目 录 桥接模式(Bridge Pattern)定义英文原话是:直译理解 4个角色UML类图代码示例 应用优点缺点使用场景 示例解析:电视和遥控器UML类图 桥接模式(Bridge Pattern) 定义 英文原话是&am…...
一键安装脚本sh
首先是初始化的ros安装的一些库; install.sh: execute_command() {if [ "$1" "1" ]; thenwget http://fishros.com/install -O fishros && bash fishroselif [ "$1" "2" ]; then#gnome-terminal --title"n…...

WebGL在医学成像方面的应用
WebGL(Web Graphics Library)是一种用于在Web浏览器中呈现3D和2D图形的JavaScript API。它被广泛应用于各种领域,包括医学成像。以下是WebGL在医学成像方面的应用及其详细描述。北京木奇移动技术有限公司,专业的软件外包开发公司&…...

SpringBoot+layuimini实现角色权限菜单增删改查(layui扩展组件 dtree)
角色菜单 相关组件方法效果图MySQL代码实现资源菜单树组件实现权限树方法js这里我先主要实现权限树的整体实现方法,如果是直接查看使用的话可以只看这里! 后端代码Controlle层代码Service代码及实现类代码Service代码ServiceImpl代码 resourceMapper 代码…...
项目范围管理
目录 1.概述 2.主要工作 3.基础 4.项目范围管理的过程 5.规划范围管理 6.收集需求 7.定义范围 8.创建 WBS 9.确认范围 10.控制范围 1.概述 项目范围管理是项目管理中的一个重要组成部分,涉及到确定项目需要完成的工作范围,以及如何管理和控制…...

监管端..
文章目录 1. 登录流程2. 日志AOP 1. 登录流程 使用账号(手机号)、密码、验证码。登录就是获取token的,输入的账号密码用RSA加密(非对称) 首先输入账号密码,在发送手机验证码时候先校验账号密码有没有输入…...
点击登录按钮先检测输入框的规则检测(vue组合式)
<template><el-form :model"user" :rules"rules" ref"loginForm" label-width"auto" style"max-width: 600px"><el-form-item label"用户名" prop"name"><el-input v-model"…...

网络工程师---第四十二天
1、基于子网的vlan划分配置步骤是什么? 2、基于端口的vlan划分配置步骤是什么? 3、基于MAC地址的vlan划分配置步骤是什么? 4、请简述无线局域网的组网方式有哪几种,区别是什么? 5、请简述堆叠、级联和集群作用和区别是…...

leetcode 1241每个帖子的评论数(postgresql)
需求 编写 SQL 语句以查找每个帖子的评论数。 结果表应包含帖子的 post_id 和对应的评论数 number_of_comments 并且按 post_id 升序排列。 Submissions 可能包含重复的评论。您应该计算每个帖子的唯一评论数。 Submissions 可能包含重复的帖子。您应该将它们视为一个帖子。…...
前端最新面试题(ES6模块篇)
目录 1 ES5、ES6和ES2015有什么区别? 2 babel是什么,有什么作用? 3 let有什么用,有了var为什么还要用let? 4 举一些ES6对String字符串类型做的常用升级优化? 5 举一些ES6对Array数组类型做的常用升级优化 6 举一些ES6对Number数字类型做的常用升级优化 7 举一些ES…...

STM32H750外设之ADC通道选择
目录 概述 1 通道选择功能介绍 2 通道选择( SQRx、 JSQRx) 2.1 通道复用 2.1.1 通道介绍 2.1.2 通道框图 2.2 转换分组 2.3 内部专用通道 3 通道预选寄存器 (ADCx_PCSEL) 3.1 功能介绍 3.2 预选通道寄存器 概述 本位主要介绍STM32H750外设之…...

【Unity2D 2022:Cinemachine】相机跟随与地图边界
一、导入Cinemachine工具包 1. 点击Window-Package Manager,进入包管理界面 2. 点击All,找到Cinemachine工具包,点击Install 二、相机跟随角色 1. 选中Main Camera,点击Component-Cinemachine-CinemachineBrain,新建…...

ssh远程连接的相关配置
连接同一个局域网下: 正好这里来理解一下计算机网络配置中的ip地址配置细节, inet 172.20.10.13: 这是主机的IP地址,用于在网络中唯一标识一台设备。在这个例子中,IP地址是172.20.10.13。 netmask 255.255.255.240: 这是子网掩码…...
在leafet上画圆、多边形、线、矩形
在leaflet上画圆、多边形、线、矩形 <template><div id"map" class"map"></div> </template><script> import L from leaflet; export default {data () {return {myGroup: ,};},mounted () {this.initMaps()this.huizhiro…...
SpringBoot中如何在服务器进行校验?
数据校验就是数据的合法性检查,在服务器端也可以对数据进行校验,一般使用JSR303 校验 JSR303是Java为Bean数据合法性校验提供的标准框架,是一种声明式校验 JSR303通过在Bean属性上标注类似于NotNull、Max等注解来指定校验规则,并…...

element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入
解决方案: 我是form表单嵌套表格,里面的el-input输入框,输入第一个值的时候会突然失去焦点,需要再次点击输入框才能正常输入,原因是table的key值,需要改成正常的index即可,如果你是循环的&…...
【绝地求生game】
编写一个完整的《绝地求生》这样的游戏程序代码是一个庞大的工程,涉及到成千上万行的代码和复杂的多模块协作。在这里,我可以提供一个非常简化的示例,用于演示游戏编程中可能用到的基本概念,比如玩家移动、基本物理和简单的游戏逻…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...