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名 timestampkey 设置过期时间,时间参数是 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 服务器的情况下,以增量方式检索键。

这里是命令的各个部分的解释:

  1. SCAN cursor

    • cursor 是一个无符号的 64 位整数,用于迭代过程。在第一次调用 SCAN 时,应将其设置为 0。每次调用 SCAN 后,它都会返回一个新的 cursor 值,你可以在下一次调用时使用这个值来继续迭代。
    • cursor 返回 0 时,表示迭代已完成。
  2. [MATCH pattern]

    • 这是一个可选参数,允许你指定一个模式来过滤返回的键。模式使用 glob 风格的通配符,其中 ? 匹配一个字符,而 * 匹配零个或多个字符。
    • 例如,MATCH user:* 将只返回以 “user:” 开头的键。
  3. [COUNT count]

    • 这也是一个可选参数,它告诉 Redis 在每次迭代中尝试返回的键的数量。请注意,这是一个提示,而不是一个严格的限制。Redis 可能会返回更多的键,也可能会返回更少的键。
    • 使用 COUNT 可以帮助你更好地控制迭代的速度和资源的使用。例如,如果你希望迭代进行得慢一些以减少对 Redis 的压力,你可以设置一个较小的 count 值。

示例:

假设你有一个包含大量键的 Redis 数据库,并且你想迭代并打印出所有以 “user:” 开头的键。你可以使用如下的 Lua 脚本来完成这个任务(这里使用 Redis 的 Lua 脚本只是为了演示目的,实际上你可以直接在 Redis 命令行或客户端中调用 SCAN 命令):

local cursor = '0'
local pattern = 'user:*'
local count = 100

repeat
    local res = redis.call('SCAN', cursor, 'MATCH', pattern, 'COUNT', count)
    cursor = res[1]
    local keys = res[2]
    for i, key in ipairs(keys) do
        print(key)
    end
until cursor == '0'

这个脚本会不断调用 SCAN 命令,直到迭代完成(即 cursor 变为 0)。在每次迭代中,它都会打印出返回的键。

dumprestore

  • 在 Redis 中,DUMP 命令用于序列化给定的键(key),并返回一个包含键值的序列化版本的二进制字符串。这个命令对于迁移或备份特定键的值非常有用。

DUMP 命令的语法如下:

DUMP key

其中 key 是你想要序列化的键的名称。

如果键存在,DUMP 命令将返回一个包含两个元素的字符串数组:

  1. 第一个元素是一个字符串,表示该键值的序列化版本。
  2. 第二个元素是一个整数,表示该键值的 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-valueDUMP 命令返回的序列化值。
  • [REPLACE] 是一个可选参数,如果键已经存在并且设置了该参数,则替换旧值。
  • [ABSTTL] 是一个可选参数,如果设置,则 ttl 是绝对时间戳(以 UNIX 时间戳表示)。
  • [IDLETIME idle-time] 是一个可选参数,用于设置键的空闲时间。
  • [FREQ freq] 是一个可选参数,用于设置访问频率(仅在 Redis 6.0 及更高版本中可用)。

请注意,DUMPRESTORE 命令通常用于高级用例,如跨 Redis 实例迁移数据。对于常规的数据备份和恢复操作,你可能需要使用其他方法,如 Redis 的持久化功能(RDB 快照或 AOF 日志)或 Redis 的复制和集群功能。

keys 通配符

  • keys * 匹配数据库中所有key
  • keys h?llo 匹配hello,hallo,hxllo等key
  • keys h*llo 匹配hllo,heeello等key
  • keys 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) -1

127.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

  • Stringredis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value
  • String 类型是二进制安全的意思是 redisstring 可以包含任何数据。比如jpg图片或者序列化的对象。
  • String 类型是 Redis 最基本的数据类型,String类型的值最大能存储 512MB。
  • String类型一般用于缓存、限流、计数器、分布式锁、分布式Session。
命令说明
set key value设置指定 key 的值
get key获取指定 key 的值
getrange key start end返回 key 中字符串值的子字符end=-1时表示全部
setbit key offset valuekey 所储存的字符串值,设置或清除指定偏移量上的位(bit)
getbit key offsetkey 所储存的字符串值,获取指定偏移量上的位(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 valuevalue 参数覆盖给定 key 所储存的字符串值,从偏移量 offset 开始,默认从下标0开始
strlen key返回 key 所储存的字符串值的长度
msetnx key value [key value...]同时设置一个或多个 key-value 对,当且仅当所有给定 key不存在
psetex key milliseconds valuesetex 命令相似,但它以毫秒为单位设置 key 的生存时间
incr keykey 中储存的数字值增一
incrby key incrementkey 所储存的值加上给定的增量值(increment)
incrbyfloat key incrementkey 所储存的值加上给定的浮点增量值(increment)
decr keykey 中储存的数字值减一
decrby key decrementkey 所储存的值减去给定的减量值(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 命令的详细解释:

  1. 基本语法

    SETRANGE key offset value
    
    • key:需要修改的字符串键名。
    • offset:开始覆盖的偏移量。
    • value:要覆盖的字符串值。
  2. 返回值
    命令执行后,返回被修改后的字符串总长度。

  3. 注意事项

    • 如果 key 原来储存的字符串长度比 offset 小,那么在原字符串offset 之间的空白部分将用零字节(“\x00”)来填充。
    • 最大偏移量是 2^29-1(即 536,870,911),因为 Redis 字符串的大小被限制在 512 兆以内。如果需要更大的空间,可以使用多个 key 来实现。
    • 当生成一个很长的字符串时,Redis 需要分配内存空间,这有时候可能会造成服务器阻塞。
  4. 命令示例

    • 假设当前 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" 覆盖了原来的字符串。
  5. 内存分配

    • 当首次为 key 分配内存空间时,Redis 会根据需要分配足够的内存来存储字符串。如果之后再次对该 key 使用 SETRANGE 命令,并且新的字符串长度没有超过已分配的内存大小,Redis 则不会重新分配内存。
  6. 版本要求

    • 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 leftsource的右边的值移动到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:列表的键名。
  • startstop:要保留的元素的索引范围。索引从 0 开始。例如,0 表示列表的第一个元素,-1 表示列表的最后一个元素,-2 表示倒数第二个元素,依此类推。

示例

假设我们有一个名为 mylist 的 Redis 列表,它包含以下元素:

redis-cli RPUSH mylist 1 2 3 4 5

此时,mylist 的内容为 [1, 2, 3, 4, 5]

示例:使用 LTRIM 裁剪列表

如果我们想要保留索引从 13(包含)的元素(即 [2, 3, 4]),我们可以这样做:

redis-cli LTRIM mylist 1 3

执行后,mylist 的内容将变为 [2, 3, 4]

请注意,如果 start 的值大于列表的实际长度,或者 start 大于 stop,则列表将被清空。

例如,如果我们执行以下命令:

redis-cli LTRIM mylist 10 15

由于列表 mylist 只有 5 个元素,索引从 04,所以执行上述命令后,mylist 将被清空。

另外,如果你之前提到的 lrem key count value 是一个误解或笔误,请忽略,因为我已经在之前的回答中解释了 LREM 命令的用法。

blpop key1 [key2...] timeout

  • BLPOPRedis 中的一个命令,用于从列表的左侧移除并获取一个或多个列表中的第一个元素,如果列表为空,则阻塞等待直到有元素可获取或者超过指定的超时时间。

命令语法

blpop key1 [key2 ...] timeout
  • key1 [key2 ...]:一个或多个列表的键名。BLPOP 会按照给定的 key 顺序检查列表,并在找到第一个非空列表时从中弹出一个元素。
  • timeout:阻塞等待的时间(以秒为单位),或者为 0 表示永远阻塞。

返回值

  • 如果在 timeout 秒内找到了一个非空列表并成功弹出元素,则返回包含两个元素的列表:第一个元素是被弹出元素的列表名,第二个元素是被弹出的元素值。
  • 如果在 timeout 秒内没有找到任何非空列表,则返回 nil

示例

假设我们有两个列表 list1list2,它们的内容分别为:

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

但是,如果我们清空 list1list2,并尝试执行以下命令:

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 列表中有元素可用或超时。
  • 如果 sourcedestination 是同一个列表,这个命令可以看作是列表的翻转操作,将尾部元素移动到头部。
  • timeout 参数允许你指定一个最大等待时间。如果在这个时间内没有元素被弹出,命令将返回 nil 和等待时长。
  • BRPOPLPUSH 命令的时间复杂度为 O(1),因为它只涉及常数时间的操作。

示例

假设我们有两个列表 list1list2,其中 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

  • RPOPLPUSHRedis 中的一个命令,它从一个列表(source)的尾部移除并获取一个元素,然后将这个元素推送到另一个列表(destination)的头部。这个命令是一个原子操作,即它在执行过程中不会被其他命令打断。

命令语法

RPOPLPUSH source destination
  • source:要弹出最后一个元素的列表的键名。
  • destination:要将弹出的元素插入的列表的键名。

返回值

  • 如果 source 列表不为空,命令将返回被弹出元素的值。
  • 如果 source 列表为空,命令将返回 nil

示例

假设我们有两个列表 list1list2,其中 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

LMOVERedis 中的一个命令,用于从一个列表(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 并且不会执行任何操作。
  • 如果 sourcedestination 列表相同,并且指定的移除和推送位置也相同(例如 LMOVE mylist mylist RIGHT RIGHT),则这个命令相当于在列表内部移动元素,即实现列表的循环。
  • 如果 source 列表为空,则 LMOVE 命令同样会返回 nil 并且不会执行任何操作。

返回值

  • 如果命令成功执行,则返回被移除并推送到目标列表的元素值。
  • 如果命令未执行任何操作(例如,因为源列表不存在或为空),则返回 nil

总结

LMOVE 命令提供了在 Redis 中从一个列表移除元素并将其推送到另一个列表的功能,同时允许指定移除和推送的位置。这使得在处理列表数据时具有更大的灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/651496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图形学概述

图形学应用 游戏 游戏的画面好坏如何鉴定呢&#xff1f; 看游戏画面是否够亮&#xff1a;渲染中全局光照的好坏 《只狼》 为什么卡通游戏画面看起来是卡通的呢&#xff1f; 《无主之地3》 这些都是图形学需要着手解决的问题 电影 电影《黑客帝国》的特效也是通过计算机…

Python 全栈体系【四阶】(五十四)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 3. 文字识别技术 3.1 CRNNCTC(2015) CRNN&#xff08;Convolutional Recurrent Neural Network&#xff09;即卷积递归神经网络&#xff0c;是DCNN和RNN的组合&#xff0c;专门用于识别图像中的序列式对象。…

《python编程从入门到实践》day40

# 昨日知识点回顾 编辑条目及创建用户账户 暂没能解决bug&#xff1a; The view learning_logs.views.edit_entry didnt return an HttpResponse object. It returned None instead.# 今日知识点学习 19.2.5 注销 提供让用户注销的途径 1.在base.html中添加注销链接 …

[笔试强训day09]

文章目录 BC146 添加逗号DP2 跳台阶JZ61 扑克牌顺子解法一&#xff1a;排序模拟解法二&#xff1a;规律哈希 BC146 添加逗号 BC146 添加逗号 #include<iostream> #include<string>using namespace std;int main() {string s;cin>>s;string ans;for(int i0;i…

2024年上半年系统架构设计师——案例第二题——UML相关

这个只记到一个大概了 主题干&#xff0c;说明人员访客系统 题目1 9分 问序列图信息类型和特点 题目2 序列图填空 好像是10分吧 访客系统的序列图 题目3 6分 说明软件分析和设计时的和UML图有关原则&#xff1f;

揭秘爬虫技术:从请求到存储的全方位解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、爬虫初探&#xff1a;请求与响应 二、数据解析&#xff1a;从混乱中提炼价值 三、数据…

微软发布多模态模型Phi-3-vision,仅4.2B,小模型大潜力

前言 在大型语言模型&#xff08;LLM&#xff09;领域&#xff0c;模型参数规模与性能之间一直存在着密切的联系。近年来&#xff0c;虽然参数规模不断攀升&#xff0c;但随之而来的训练成本和推理成本也成为了制约模型发展的瓶颈。为了打破这一困境&#xff0c;微软推出了 Ph…

Livox-SDK2 用vs2017编译

Livox-SDK2 Livox-SDK2代码去上面下载&#xff0c;文章中给出的是用vs2019进行编译的&#xff0c;生成项目时用的 > cmake .. -G "Visual Studio 16 2019" -A x64 但如果我想用vs2017进行编译&#xff0c;那么只需要将上面语句改为如下&#xff1a; cmake .. -…

【数据结构】快速排序C语言

目录 前言 一、快排思想过程 二、算法思路 三、代码实现 C语言实现&#xff1a; C实现: 总结 前言 排序是一个相对复杂的过程,进一步思考排序这个问题,我们可以借助分治的思想来解决这个问题, 什么叫分治呢?就是把大问题化成小问题,进而缩小问题的规模,并且大问题和小问…

牛客NC166 连续子数组的最大和(二)【中等 前缀和数组+动态规划 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21 思路 前缀和数组动态规划Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

课时138:变量进阶_变量实践_综合案例

2.1.3 综合案例 学习目标 这一节&#xff0c;我们从 免密认证、脚本实践、小结 三个方面来学习 免密认证 案例需求 A 以主机免密码认证 连接到 远程主机B我们要做主机间免密码认证需要做三个动作1、本机生成密钥对2、对端机器使用公钥文件认证3、验证手工演示 本地主机生成…

MyBatis报错:TypeException Could not set parameters for mapping问题解决

MyBatis报错&#xff1a;TypeException: Could not set parameters for mapping问题解决 问题收录 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{proper…

【详细介绍下PostgreSQL】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

考研数学|强化跟「张宇」还是「武忠祥」?看这一篇!

考研数学强化阶段是备考过程中非常关键的一环&#xff0c;它不仅要求学生巩固和深化基础知识&#xff0c;还要求学生能够灵活运用所学知识解决复杂问题。 在选择张宇老师或武忠祥老师的高数强化课时&#xff0c;你可以考虑以下几个方面。 首先每位学生都有自己独特的学习风格…

图片数据增强-resize(不同插值)、各种模糊

各种不同的模糊处理 import os import cv2def apply_blur_to_images(input_folder_path, output_folder_path):# 遍历文件夹下的所有文件for filename in os.listdir(input_folder_path):# 检查文件类型是否为图片if filename.endswith(.jpg) or filename.endswith(.jpeg) or …

探索演进:了解IPv4和IPv6之间的区别

探索演进&#xff1a;了解IPv4和IPv6之间的区别 在广阔的互联网领域中&#xff0c;设备之间的通信依赖于一组独特的协议来促进连接。前景协议中&#xff0c;IPv4&#xff08;Internet 协议版本 4&#xff09;和 IPv6&#xff08;Internet 协议版本 6&#xff09;是数字基础设施…

ThreadLocal简介

Thread类中&#xff0c;有个ThreadLocal.ThreadLocalMap 的成员变量。 ThreadLocalMap内部维护了Entry数组&#xff0c;每个Entry代表一个完整的对象&#xff0c;key是ThreadLocal本身&#xff0c;value是ThreadLocal的泛型对象值 public void set(T value) {Thread t Thread…

【Text2SQL 论文】IncSQL:通过增量式生成 action 序列来得到 SQL

论文&#xff1a;IncSQL: Training Incremental Text-to-SQL Parsers with Non-Deterministic Oracles ⭐⭐⭐ ICLR 2019&#xff0c;arXiv:1809.05054, Microsoft Research 一、论文速读 本文提出了 IncSQL&#xff0c;一个使用 Non-Deterministic Oracles 思路的增量式 Text…

问题记录_stm32“No target connected“

问题描述&#xff1a; 基于HAL库和stm32cubeMX生成的代码&#xff0c;烧录时出现如下报错窗口&#xff1a; 问题原因&#xff1a; stm32cubeMX生成代码时关闭了SWJ调试功能 解决方法&#xff1a; 在项目中找到__HAL_AFIO_REMAP_SWJ_DISABLE();并注释掉 然后短按复位键的…

电脑技巧:一台主机两个显示器的连接设置方法

目录 一、先与电脑连接好两个显示器 二、先来看看WIN7连接两个显示器设置方法 三、再来看看WIN10连接两个显示器设置方法 在日常办公场景中&#xff0c;为了提高工作效率和增强交互体验&#xff0c;常需一台电脑同时连接两个显示器&#xff0c;正如我们在营业厅常见到的那样…