Redis 命令—— 超详细操作演示!!!

内存数据库 Redis7

    • 三、Redis 命令
      • 3.1 Redis 基本命令
      • 3.2 Key 操作命令
      • 3.3 String 型 Value 操作命令
      • 3.4 Hash 型 Value 操作命令
      • 3.5 List 型 Value 操作命令
      • 3.6 Set 型 Value 操作命令
      • 3.7 有序Set 型 Value 操作命令
      • 3.8 benchmark 测试工具
      • 3.9 简单动态字符串SDS
      • 3.10 集合的底层实现原理
      • 3.11 BitMap 操作命令
      • 3.12 HyperLogLog 操作命令
      • 3.13 Geospatial 操作命令
      • 3.14 发布/订阅命令
      • 3.15 Redis 事务
    • 四、Redis 持久化
    • 五、Redis 主从集群
    • 六、Redis 分布式系统
    • 七、Redis 缓存
    • 八、Lua脚本详解
    • 九、分布式锁

数据库系列文章:

关系型数据库:

  • MySQL —— 基础语法大全
  • MySQL —— 进阶


非关系型数据库:

  • Redis 的安装与配置

三、Redis 命令

Redis 根据命令所操作对象的不同,可以分为三大类:对 Redis 进行基础性操作的命令,对 Key 的操作命令,对 Value 的操作命令。

3.1 Redis 基本命令

⭐️ 3.1.1、 心跳命令 ping

  • 键入 ping 命令,会看到 PONG 响应,则说明该客户端与 Redis 的连接是正常的。该命令亦称为 心跳命令

在这里插入图片描述

⭐️ 3.1.2、读写键值命令

  • set key value 会将指定 key value 写入到 DB 。 get key 则会读取指定 keyvalue 值。关于更多 setget 命令格式,后面会详细学习。

在这里插入图片描述

⭐️ 3.1.3、 DB切换 select

  • Redis 默认有 16 个数据库。这个在 Redis Desktop Manager (RDM)图形客户端中可以直观地看到。

在这里插入图片描述

  • 默认使用的是 0 号 DB ,可以通过 select db 索引来切换 DB 。
    • 例如,如下命令会 select 3 切换到 DB3 ,并会将 age-23 写入到 DB3 中。

在这里插入图片描述

  • 并且 这个结果在 RDM 中是可以直观地看到的。

在这里插入图片描述

⭐️ 3.1.4、 查看 key 数量 dbsize

  • dbsize 命令可以查看 当前数据库key数量

在这里插入图片描述

  • 从以上查看情况看, DB0 中有 2 个 key; DB1 中没有 key; DB3 中有 1 个 key

⭐️ 3.1.5、 删除当前库中数据 flushdb

  • flushdb 命令仅仅 删除的是当前数据库中的数据,不影响其它库。

在这里插入图片描述

⭐️ 3.1.6、 删除所有库中数据命令 flushall

  • flushall 命令可以删除所有库中的所有数据。所以该命令的使用一定要慎重。

在这里插入图片描述

⭐️ 3.1.7、 退出客户端命令

  • 使用 exitquit 命令均可退出 Redis 命令行客户端。

在这里插入图片描述

3.2 Key 操作命令

Redis 中 存储的数据整体 是一个 Map ,其 keyString 类型,而 value 则可以是 StringHash 表ListSet 等类型。

⭐️ 3.2.1、keys

  • 格式KEYS pattern
  • 功能查找所有符合给定模式 patternkeypattern正则表达式
  • 说明KEYS 的速度非常快,但在一个 大的数据库 中使用它 可能会 阻塞 当前服务器的服务 。 所以生产环境中一般不使用该命令,而使用 scan 命令代替

在这里插入图片描述

⭐️ 3.2.2、exists

  • 格式EXISTS key
  • 功能检查给定 key 是否存在
  • 说明:若 key 存在,返回 1 ,否则返回 0

在这里插入图片描述

⭐️ 3.2.3、del

  • 格式DEL key [key ...]
  • 功能删除给定的一个或多个 key 。不存在的 key 会被忽略。
  • 说明: 返回 被删除 key数量

keys

⭐️ 3.2.4、rename

  • 格式RENAME key newkey
  • 功能:将 key 改名为 newkey
  • 说明:当 keynewkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME 命令将覆盖旧值。改名成功时提示 OK ,失败时候返回一个错误。

⭐️ 3.2.5、move

  • 格式MOVE key db
  • 功能:将当前数据库key 移动给定的数据库 db 当中。
  • 说明: 如果 当前数据库(源数据库) 和 给定数据库(目标数据库) 有相同名字的给定 key,或者 key不存在于 当前数据库,那么 MOVE 没有任何效果。 移动成功返回 1 ,失败则返回 0

在这里插入图片描述

⭐️ 3.2.6、type

  • 格式TYPE key
  • 功能:返回 key 所储存的 值的类型
  • 说明: 返回值有以下六种
    • none (key 不存在)
    • string 字符串
    • list 列表
    • set 集合
    • zset 有序集
    • hash 哈希表

在这里插入图片描述

⭐️ 3.2.7、expire 与 pexpire

  • 格式EXPIRE key seconds
  • 功能:为给定 key 设置生存时间 。 当 key 过期时 (生存时间为 0),它会被自动删除
    • expire 的时间单位为 pexpire 的时间单位为 毫秒
    • 在 Redis 中,带有生存时间的 key 被称为 "易失的” ( volatile )。
  • 说明: 生存时间 设置成功返回 1 。 若 key 不存在时 返回 0 。 rename 操作不会改变 key 的生存时间。

在这里插入图片描述

⭐️ 3.2.8、ttl 与 pttl

  • 格式TTL key
  • 功能TTL, time to live ,返回给定 key剩余生存时间
  • 说明:其返回值存在三种可能:
    • key 不存在时,返回 -2
    • key 存在但没有设置剩余生存时间时,返回 -1
    • 否则,返回 key 的剩余生存时间。 ttl 命令返回的时间单位为 ,而 pttl 命令返回的时间单位为 毫秒

在这里插入图片描述

⭐️ 3.2.9、persist

  • 格式PERSIST key
  • 功能:去除给定 key 的生存时间,将这个 key 从 “易失的” 转换成 “持久的” 。
  • 说明: 当生存时间移除成功时,返回 1 ;若 key 不存在或 key 没有设置生存时间, 则返回 0 。

在这里插入图片描述

⭐️ 3.2.10、randomkey

  • 格式RANDOMKEY
  • 功能:从当前数据库中随机返回 不删除 一个 key
  • 说明: 当数据库不为空时,返回一个 key当数据库为空时,返回 nil

在这里插入图片描述

⭐️ 3.2.11、scan

  • 格式SCAN cursor [MATCH pattern] [COUNT count] [TYPE]
  • 功能:用于迭代数据库中的 数据库键。 其各个选项的意义为:
    • cursor :本次迭代开始的 游标
    • pattern :本次迭代要 匹配的 key 的模式
    • count :本次迭代要从数据集里返回多少元素,默认值为 10
    • type 本次迭代要返回的 value 的类型,默认为所有类型

SCAN 命令是一个基于游标 cursor迭代器

  • SCAN 命令每次被调用之后,都会向用户返回一个 包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标,而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数,以此来延续之前的迭代程。
  • SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代。 如果新游标返回 0 表示迭代已结束。
  • 说明: 使用间断的负数超出范围 或者 其他非正常 的游标来执行 增量式迭代 不会造成服务器崩溃

在这里插入图片描述

当数据量很大时,count 的数量的指定可能会不起作用, Redis 会自动调整每次的遍历数目。 由于 scan 命令 每次执行都只会返回少量元素,所以该命令可以用于生产环境,而不会出现像 KEYS 命令带来的服务器阻塞问题。

增量式迭代命令 所使用的算法只保证在数据集的大小有界的情况下迭代才会停止,换句话说,如果被迭代数据集的大小不断地增长的话,增量式迭代命令可能永远也无法完成一次完整迭代。 即 当一个数据集不断地变大时,想要访问这个数据集中 的所有元素就需要做越来越多的工作, 能否结束一个迭代取决于用户执行迭代的速度是否比数据集增长的速度更快。

相关命令:另外还有 3 个 scan 命令用于对三种类型的 value 进行遍历。

  • hscan :属于 HashValue 操作命令集合,用于遍历当前 db 中指定 Hash 表 的所有 field-value 对。
  • sscan :属于 SetValue 操作命令集合,用于 遍历当前 db 中指定 set 集合 的所有元素
  • zscan :属于 ZSetValue 操作命令集合,用于 遍历当前 db 中指定 有序集合 的所有元素(数值元素值

3.3 String 型 Value 操作命令

Redis 存储数据的 Value 可以是 一个 String 类型数据。 String 类型的 Value 是 Redis 中最基本,最常见的类型。 String 类型的 Value 中可以存放任意数据, 包括 数值型,甚至是二进制图片音频视频序列化对象等。一个 String 类型的 Value 最大是 512M 大小。

⭐️ 3.3.1、set

  • 格式SET key value [EX seconds | PX milliseconds] [NX|XX]
  • 功能SET 除了可以直接将 key 的值设为 value 外,还可以指定一些参数
    • EX seconds :为当前 key 设置过期时间,单位 。等价于 SETEX 命令。
    • PX milliseconds :为当前 key 设置过期时间,单位 毫秒。等价于 PSETEX 命令。
    • NX :(No eXist) 指定的 key 不存在才会设置成功,用于添加指定key 。等价于 SETNX 命令。
    • XX :指定的 key 必须存在才会设置成功,用于更新指定 keyvalue
  • 说明:如果 value 字符串中带有空格,则该字符串需要使用双引号或单引号引起来,否则会认为 set 命令的参数数量不正确,报错。

在这里插入图片描述

⭐️ 3.3.2、setex 与 psetex

  • 格式SETEX / PSETEX key seconds value
  • 功能set expire ,其不仅为 key 指定了 value ,还为其设置了生存时间setex 的单位为psetex 的单位为毫秒
  • 说明:如果 key 已经存在, 则覆写旧值。该命令类似于以下两个命令,不同之处是,SETEX 是一个原子性操作关联值设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
    • SET key value
    • EXPIRE key seconds #设置生存时间

在这里插入图片描述

⭐️ 3.3.3、setnx

  • 格式SETNX key value
  • 功能SET if Not eXists ,将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key已经存在,则 SETNX 不做任何动作。 成功,返回 1 ,否则 ,返回 0 。
  • 说明:该命令等价于 set key value nx

⭐️ 3.3.4、getset

  • 格式GETSET key value
  • 功能:将给定 key 的值设为 value ,并返回 key旧值
  • 说明:当 key 存在但不是字符串类型时,返回一个错误; 当 key 不存在时,返回 nil

在这里插入图片描述

⭐️ 3.3.5、mset 与 msetnx

  • 格式MSET / MSETNX key value [key value ...]
  • 功能:同时设置一个或多个 key-value 对。
  • 说明:如果某个给定 key 已经存在,那么 MSET 会用 新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX命令:它只会在所有给定 key 都不存在的情况下进行设置操作。 MSET/MSETNX是一个原子性 (atomic) 操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况不可能发生。该命令永不失败。

在这里插入图片描述

⭐️ 3.3.6、mget

  • 格式MGET key [key ...]
  • 功能:返回所有 (一个或多个) 给定 key 的值。
  • 说明:说明:如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。

⭐️ 3.3.7、append

  • 格式APPEND key value
  • 功能:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
  • 说明:追加 value 之后, key 中字符串的长度。

⭐️ 3.3.8、incr 与 decr

  • 格式INCR keyDECR key
  • 功能increment自动递增。 将 key 中存储的数字值增一decrement自动递减。将 key 中存储的数字值减一
  • 说明:如果 key 不存在,那么 key 的值会先被初始化0 ,然后再执行 增一/减一 操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增一/减一 后的值。

在这里插入图片描述

⭐️ 3.3.9、incrby 与 decrby

  • 格式INCRBY key incrementDECRBY key decrement
  • 功能:将 key 中存储的数字值 增加/减少 指定的数值,这个数值只能是整数,可以是负数,但不能是小数。
  • 说明:如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 增/减 操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回 增/减 后的

在这里插入图片描述

⭐️ 3.3.10、incrbyfloat

  • 格式INCRBYFLOAT key increment
  • 功能:为 key 中所储存的值加上 浮点数增量 increment
  • 说明:与之前的说明相同。没有 decrbyfloat 命令,但 increment负数可以实现减操作效果。

在这里插入图片描述

⭐️ 3.3.11、strlen

  • 格式STRLEN key
  • 功能:返回 key 所储存的字符串值的长度。
  • 说明:当 key 储存的不是字符串值时,返回一个错误,当 key 不存在时,返回 0

⭐️ 3.3.12、getrange

  • 格式GETRANGE key start end
  • 功能:返回 key 中字符串值的 子字符串,字符串的截取范围由 startend 两个偏移量决定 包括 startend 在内
  • 说明end 必须要比 start。支持 负数偏移量 表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。

在这里插入图片描述

⭐️ 3.3.13、setrange

  • 格式SETRANGE key offset value
  • 功能:用 value 参数替换给定 key 所储存的字符串值 str ,从偏移量 offset 开始。
  • 说明:当 offset 值大于 str 长度时,中间使用零字节 \x00 填充,即 0000 0000 字节填充;对于不存在key 当作空串处理。

在这里插入图片描述

⭐️ 3.3.14、位运算命令

  • 名称中包含 BIT 的命令,都是对二进制位的操作命令,例如, setbitgetbitbitcountbittopbitfield ,这些命令不常用。

⭐️ 3.3.15、典型应用场景

ValueString 类型的 应用场景很多,这里仅举这种 典型应用场景 的例子:

  • 1)、数据缓存

    • Redis 作为数据缓存层, MySQL 作为 数据存储层。应用服务器首先从 Redis 中获取数据,如果缓存层中没有,则从 MySQL 中获取后先存入缓存层再返回给应用服务器。
  • 2)、计数器

    • Redis 中写入一个 value 为数值型的 key 作为平台计数器、视频播放计数器等。每个有效客户端访问一次,或视频每播放一次,都是直接修改 Redis 中的计数器,然后再以 异步方式 持久化 到其它数据源中,例如持久化到 MySQL
  • 3)、共享 Session
    在这里插入图片描述

    • 对于一个分布式应用系统,如果将类似用户登录信息这样的 Session 数据保存在提供登录服务的服务器中,那么如果用户再次提交像收藏、支付等请求时可能会出现问题:在提供收藏、支付等服务的服务器中并没有该用户的 Session 数据,从而导致该用户需要重新登录。对于用户来说,这是不能接受的。
    • 此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从 Redis 中查找相应的 Session 数据,如果存在,则再进行相关操作,否则跳转到 登录页面。这样就不会引发“重新登录”问题。
  • 4)、限速器

    • 现在很多平台为了 防止DoS (Denial of Service拒绝服务) 攻击,一般都会限制一个 IP 不能在一秒内访问超过 n 次。而 Redis 可以可以结合 key过期时间incr 命令来完成 限速功能,充当限速器。

注意,其无法 防止 DDoS (Distributed Denial of Service分布式拒绝服务攻击。( 多个ip同时访问 )

//客户端每提交一次请求,都会执行下面的代码//指定新 ip 作为 key 的缓存过期时间为 60 秒
boolean isExists = redis.set(ip, 1, "EX 60", "NX"); //等价于 set 192.168.192.55 1 ex 60 nxif(isExists != null || redis.incr(ip) <= 5) {// 通过
} else {// 限流
}

3.4 Hash 型 Value 操作命令

Redis 存储数据的 Value 可以是一个 Hash 类型Hash 类型 也称为 Hash 表字典等。

  • Hash表 就是一个 映射表 Map 也是由 键-值 对构成 ,为了与整体的 key 进行区分,这里的键称为 field ,值称为 value 。 注意, Redis 的 Hash 表中的 field-value均为 String 类型。

⭐️ 3.4.1、hset

  • 格式HSET key field value
  • 功能:将哈希表 key 中的域 field 的值设为 value
  • 说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。 如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域 field 已经存在旧值已被新值覆盖,返回 0

⭐️ 3.4.2、hget

  • 格式HGET key field
  • 功能:返回哈希表 key给定域 field 的值。
  • 说明:当给定域 不存在 或是 给定 key 不存在时,返回 nil

⭐️ 3.4.3、hmset

  • 格式HMSET key field value [field value ...]
  • 功能:同时将多个 field-value (域-值) 对设置到哈希表 key 中。
  • 说明:此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。 如果命令执行成功,返回 OK 。当 key 不是哈希表 (hash) 类型时,返回一个错误。

⭐️ 3.4.4、hmget

  • 格式HMGET key field [field ...]
  • 功能:按照给出顺序返回哈希表 key 中一个或多个域的值。
  • 说明:如果给定的域不存在于哈希表,那么返回一个 nil 值。因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。

⭐️ 3.4.5、hgetall

  • 格式HGETALL key
  • 功能:返回哈希表 key所有的 域和值
  • 说明:在返回值里,紧跟每个域名 ( field name) 之后是域的 ( value),所以返回值的长度是哈希表大小的两倍。若 key 不存在,返回空列表。 若 key 中包含大量元素,则该命令 可能会阻塞 Redis 服务。 所以生产环境中 一般不使用该命令,而使用 hscan 命令代替。

在这里插入图片描述

⭐️ 3.4.6、hsetnx

  • 格式HSETNX key field value
  • 功能:将哈希表 key 中的域 field 的值设置为 value当且仅当 field 不存在
  • 说明:若域 field 已经存在,该操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

在这里插入图片描述

⭐️ 3.4.7、hdel

  • 格式HDEL key field [field ...]
  • 功能删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
  • 说明:返回被成功移除的域的数量,不包括被忽略的域。

⭐️ 3.4.8、hexists

  • 格式HEXISTS key field
  • 功能:查看哈希表 key 中给定域 field 是否存在
  • 说明:如果哈希表含有给定域,返回 1 。如果不含有给定域,或 key 不存在,返回 0

在这里插入图片描述

⭐️ 3.4.9、hincrby 与 hincrbyfloat

  • 格式HINCRBY key field increment
  • 功能:为哈希表 key 中的域 field 的值加上增量 incrementhincrby 命令只能增加整数值,而 hincrbyfloat 可以增加小数值
  • 说明:增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值 被初始化为 0 。对一个储存字符串值的域 field 执行 HINCRBY 命令将 造成一个错误。

在这里插入图片描述

⭐️ 3.4.10、hkeys 与 hvals

  • 格式HKEYS keyHVALS key
  • 功能:返回哈希表 key 中的所有域 / 值
  • 说明:当 key 不存在时,返回一个空表

⭐️ 3.4.11、hlen

  • 格式HLEN key
  • 功能:返回哈希表 key域的数量
  • 说明:当 key 不存在时,返回 0 。

在这里插入图片描述

⭐️ 3.4.12、hstrlen

  • 格式HSTRLEN key field
  • 功能:返回哈希表 key 中, 与给定域 field 相关联的 的字符串长度string length )。
  • 说明:如果给定的 或者 不存在, 那么命令返回 0。

在这里插入图片描述

⭐️ 3.4.13、应用场景

  • Hash型 Value 非常适合存储 对象数据key 为对象名称, value 为描述对象属性Map,对对象属性的修改在 Redis 中就可直接完成。
  • 其不像 String 型 Value 存储对象,那个对象是 序列化过的,例如序列化为 JSON 串,对对象属性值的修改需要先 反序列化为对象后再修改,修改后再序列化为 JSON 串后写入到 Redis 。

3.5 List 型 Value 操作命令

Redis 存储数据的 Value 可以是 一个 String 列表 类型数据。 即该 列表中的每个元素 均为 String 类型数据。

  • 列表中的数据会按照插入顺序 进行排序。
  • 不过,该列表的底层实际是一个 无头节点双向链表,所以对列表 表头与表尾 的操作性能较高,但对 中间元素 的插入与删除的 操作的性能相对较差。

⭐️ 3.5.1、lpush/rpush

  • 格式LPUSH key value [value ...]RPUSH key value [value ...]
  • 功能:将一个或多个值 value 插入到列表 key表头 / 表尾(表头在左,表尾在右)
  • 说明:如果有多个 value 值,对于 lpush 来说, 各个 value 会按 从左到右的顺序 依次插入到表头;对于 rpush 来说, 各个 value 会按 从左到右的顺序 依次插入到表尾。如果 key 不存在,一个空列表会被创建并执行操作。当 key 存在但不是列表类型时,返回一个错误。执行成功时返回列表的长度。

在这里插入图片描述

⭐️ 3.5.2、llen

  • 格式LLEN key
  • 功能:返回列表 key 的长度。
  • 说明:如果 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。

⭐️ 3.5.3、lindex

  • 格式LINDEX key index
  • 功能:返回列表 key 中,下标为 index 的元素。 列表从 0 开始计数。
  • 说明:如果 index 参数的值不在列表的区间范围内 (out of range),返回 nil

在这里插入图片描述

⭐️ 3.5.4、lset

  • 格式LSET key index value
  • 功能:将列表 key 下标为 index 的元素的值设置为 value
  • 说明:当 index 参数超出范围,或对一个 空列表key 不存在)进行 LSET 时,返回一个错误。

⭐️ 3.5.5、lrange

  • 格式LRANGE key start stop
  • 功能:返回列表 key 中指定区间 [start, stop] 内的元素 ,即包含两个端点
  • 说明List 的下标从 0 开始,即 以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 超出范围的下标值不会引起错误。如果 start 下标比列表的最大下标 还要大,那么 LRANGE 返回一个空列表。如果 stop 下标比最大下标还要大, Redis 将 stop 的值设置为最大下标

在这里插入图片描述

⭐️ 3.5.6、lpushx 与 rpushx

  • 格式LPUSHX key valueRPUSHX key value
  • 功能:将值 value 插入到列表 key表头 / 表尾 ,当且仅当 key 存在并且是一个列表。
  • 说明:当 key 不存在时,命令什么也不做。若执行成功,则输出表的长度。

在这里插入图片描述

⭐️ 3.5.7、linsert

  • 格式LINSERT key BEFORE | AFTER pivot value
  • 功能:将值 value 插入到列表 key 当中,位于元素 pivot 之前或之后。
  • 说明:当 pivot 元素 不存在 于列表中时,不执行任何操作,返回 -1; 当 key 不存在时, key 被视为空列表,不执行任何操作,返回 0 ;如果 key 不是列表类型,返回一个错误;如果命令执行成功,返回插入操作完成之后,列表的长度

在这里插入图片描述

⭐️ 3.5.8、lpop / rpop

  • 格式LPOP key [count]RPOP key [count]
  • 功能:从列表 key表头 / 表尾 移除 count 个元素, 并返回 移除的元素count 默认值 1
  • 说明:当 key 不存在时,返回 nil

⭐️ 3.5.9、blpop / brpop

  • 格式BLPOP key [key ...] timeoutBRPOP key [key ...] timeout
  • 功能BLPOP / BRPOP 是列表的阻塞式 ( blocking ) 弹出命令。它们是 LPOP / RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP / BRPOP 命令 阻塞,直到等待 timeout 超时发现可弹出元素为止。当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。 timeout阻塞时长,单位为 ,其值若为 0 ,则表示只要没有可弹出元素,则一直阻塞。
  • 说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

在这里插入图片描述

⭐️ 3.5.10、rpoplpush

  • 格式RPOPLPUSH source destination
  • 功能:命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
    • 将列表 source 中的最后一个元素 (尾元素) 弹出,并返回给客户端。
    • source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素
  • 说明:如果 source 不存在,值 nil 被返回,并且不执行其他动作。如果 sourcedestination
    相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转 (rotation) 操作。

⭐️ 3.5.11、brpoplpush

  • 格式BRPOPLPUSH source destination timeout
  • 功能BRPOPLPUSHRPOPLPUSH阻塞版本,当给定列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接直到等待超时,或有另一个客户端对 source 执行 LPUSHRPUSH 命令为止。 timeout阻塞时长,单位为 ,其值若为 0 ,则表示只要没有可弹出元素,则一直阻塞
  • 说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil等待时长。反之,返回一个含有两个元素的列表,第一个元素是 被弹出元素的值,第二个元素是 等待时长

⭐️ 3.5.12、lrem

  • 格式LREM key count value
  • 功能:根据参数 count 的值,移除列表中与参数 value 相等的元素。 count 的值可以是以下几种:
    • count > 0 : 从 表头开始向表尾 搜索,移除与 value 相等的元素,数量为 count
    • count < 0 : 从 表尾开始向表头 搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    • count = 0 : 移除 表中所有value 相等的值。
  • 说明:返回被移除元素的数量。当 key 不存在时, LREM 命令返回 0 ,因为不存在的 key 被视作空表 (empty list) 。

⭐️ 3.5.13、itrim

  • 格式LTRIM key start stop
  • 功能:对一个列表进行修剪 ( trim ),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
  • 说明:下标 (index) 参数 startstop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 也 可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。当 key 不是列表类型时,返回一个错误。 如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 ) 还要大,或者 start > stopLTRIM 返回 一个空列表, 因为 LTRIM 已经将整个列表清空。如果 stop 下标比 end 下标还要大, Redis 将 stop 的值设置为 end

⭐️ 3.5.14、应用场景
Value 为 List 类型 的应用场景很多, 主要是通过 构建不同的数据结构 来实现相应的业务功能。 这里仅对这些 数据结构的实现方式 进行总结,不举具体的例子。

  • 1)、栈

  • 2)、队列

  • 3)、阻塞式消息队列

  • 4)、动态有限集合

3.6 Set 型 Value 操作命令

⭐️ 3.6.1、sadd

  • 格式:``
  • 功能
  • 说明

⭐️ 3.6.2、smembers
⭐️ 3.6.3、scard
⭐️ 3.6.4、sismember
⭐️ 3.6.5、smove
⭐️ 3.6.6、srem
⭐️ 3.6.7、srandmember
⭐️ 3.6.8、spop
⭐️ 3.6.9、sdiff / sdiffstore
⭐️ 3.6.10、sinter / sinterstore
⭐️ 3.6.11、sunion / sunionstore
⭐️ 3.6.12、应用场景

3.7 有序Set 型 Value 操作命令

⭐️ 3.7.1、zadd
⭐️ 3.7.2、zrange 与 zrevrange

⭐️ 3.7.3、zrangebyscore 与 zrevrangebyscore
⭐️ 3.7.4、zcard
⭐️ 3.7.5、zcount
⭐️ 3.7.6、zscore
⭐️ 3.7.7、zincrby
⭐️ 3.7.8、zrank 与 zrevrank
⭐️ 3.7.9、zrem
⭐️ 3.7.10、zremrangebyrank
⭐️ 3.7.11、zremrangebyscore
⭐️ 3.7.12、zrangebylex
⭐️ 3.7.13、zlexcount
⭐️ 3.7.14、zremrangebylex
⭐️ 3.7.、
⭐️ 3.7.、
⭐️ 3.7.、

3.8 benchmark 测试工具

3.9 简单动态字符串SDS

3.10 集合的底层实现原理

3.11 BitMap 操作命令

3.12 HyperLogLog 操作命令

3.13 Geospatial 操作命令

3.14 发布/订阅命令

3.15 Redis 事务

🚀🚀🚀 Redis 命令 快速食用:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------->


四、Redis 持久化

🚀🚀🚀 Redis 持久化 快速食用:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------->


五、Redis 主从集群

六、Redis 分布式系统

七、Redis 缓存

八、Lua脚本详解

九、分布式锁

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins环境部署与任务构建

一、CI/CD 1、CI/CD 概念&#xff1a; CI/CD 是一种软件开发和交付方法&#xff0c;旨在加速应用程序的开发、测试和部署过程&#xff0c;以提高软件交付的质量和效率。 (1) 持续集成 (CI Continuous Integration): 持续集成是开发团队频繁集成其代码更改的过程。开发者将其…

04.Finetune vs. Prompt

目录 语言模型回顾大模型的两种路线专才通才二者的比较 专才养成记通才养成记Instruction LearningIn-context Learning 自动Prompt 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索 语言模型回顾 GPT&#xff1a;文字接龙 How are __. Bert&a…

【LSTM-Attention】基于长短期记忆网络融合注意力机制的多变量时间序列预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic

前言 今天推荐一款基于DMSkin框架开发的网易云音乐播放器&#xff1a;DMSkin-CloudMusic。 DMSkin 框架介绍 DMSkin是一个开源的WPF样式UI框架&#xff0c;可以帮助开发者快速创建漂亮的用户界面。 下载体验 下载地址&#xff1a;https://github.com/944095635/DMSkin-Clou…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-HMI人机交互

书接上回 2.3.7HMI人机交互 2.3.7.1显示 (1)图标 序号 图标状态 (图形、颜色供参考) 含义说明 备注 1 辅助驾驶功能READY (允许激活) 2 辅助驾驶功能激活 3 辅助驾驶系统故障 4

ATPCS:ARM-Thumb程序调用的基本规则

为了使单独编译的c文件和汇编文件之间能够互相调用&#xff0c;需要制定一系列的规则&#xff0c;AAPCS就是ARM程序和Thumb程序中子程序调用的基本规则。 1、ATPCS概述 ATPCS规定了子程序调用过程中寄存器的使用规程、数据站的使用规则、参数的传递规则。为了适应一些特殊的需…

03、Python 字符串高级用法

目录 Python 字符串高级用法转义字符字符串格式化序列相关的方法大小写相关的方法dir 可以查看某个类的所有方法删除空白查找、替换相关方法 Python 字符串高级用法 转义字符 字符串格式化 序列相关的方法 字符串本质就是由多个字符组成&#xff0c;字符串的本质就是不可变序…

SpringBoot连接MySQL密码错误,报错:Access denied for user

记&#xff1a;一次连接MySQL报密码错误&#xff0c;Access denied for user 检查步骤&#xff1a; 核对用户和密码是否正确&#xff0c;用工具登陆试下。如果配置文件是yml格式&#xff0c;配置密码是123456这种纯数字&#xff0c;记得加上单/双引号。检查云上数据库配置&am…

基于PHP的创意设计分享系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

力扣每日一题59:螺旋矩阵||

题目描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&am…

【C语言小游戏--猜数字】

文章目录 前言1.游戏描述2.代码实现2.1打印菜单2.2构建基础框架2.3玩游戏2.3.1生成随机数2.3.1.1rand()2.3.1.2srand()2.3.1.3time() 2.3.2game() 2.4自己设定猜的次数 3.完整代码 前言 猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏&#xff0c;下…

Javascript命令模式

Javascript命令模式 1 什么是命令模式2 命令模式的例子—菜单程序3 JavaScript 中的命令模式4 撤销命令5 宏命令 1 什么是命令模式 在一个餐厅中&#xff0c;当客人现场点餐或者打电话订餐时&#xff0c;老板会把客人的需求写在清单上&#xff0c;厨师会按照清单的顺序给客人炒…

驱动开发3 ioctl函数的使用+3个实例(不传递第三个参数、第三个参数为整型、第三个参数为地址)

开发板&#xff1a;stm32mp157aaa&#xff08;Cortex-A7*2 Cortex-M4*1&#xff09;开发环境&#xff1a;vscode、串口工具 1 引入ioctl函数的意义 linux操作系统中有意将数据的读写和读写功能的选择分别交给不同的函数去完成。就让read/write函数只进行数据的读写即可&#x…

多版本并发控制MVCC

什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;&#xff0c;多版本并发控制。顾名思义&#xff0c;MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之&#xff0c;…

SolidWorks模型导入到Gazebo中

首先建立好solidworks模型&#xff0c;然后另存为stl格式&#xff0c; 导出为STL文件时&#xff0c;文件名最好不要是中文&#xff0c;并且要将后缀STL改为stl&#xff0c;否则Gazebo无法识别 这是我创建好的机器人充电桩模型&#xff1a; 尺寸是单位是mm&#xff1a; 135mm …

【图像误差测量】测量 2 张图像之间的差异,并测量图像质量(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

图论06-【无权无向】-图的遍历并查集Union Find-力扣695为例

文章目录 1. 代码仓库2. 思路2.1 UF变量设计2.2 UF合并两个集合2.3 查找当前顶点的父节点 find(element) 3. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 思路 2.1 UF变量设计 parent数组保存着每个节点所指向的父节点的索引&#xff0c;初始值为…

面向对象(基础)特征一:封装性(encapsulation)

文章目录 一、介绍&#xff08;1&#xff09;封装性&#xff08;2&#xff09;权限修饰符 二、案例&#xff08;1&#xff09;案例1 三、练习&#xff08;1&#xff09;练习1&#xff08;2&#xff09;练习2&#xff08;3&#xff09;练习3&#xff08;4&#xff09;练习4 面向…

数据丢失恢复怎么操作好?五种方法帮您恢复数据

丢失文件可能会造成灾难性的后果&#xff0c;因此您绝对需要最好的 PC 恢复软件。数据恢复软件必须快速、可靠并涵盖大多数文件格式。我们列表中最好的工具是一个甚至可以检索隐藏文件的解决方案。我们选择的另一个解决方案能够恢复700 多种独特的文件格式。 这种噩梦可能发生…

【PyTorch实战演练】自调整学习率实例应用(附代码)

目录 0. 前言 1. 自调整学习率的常用方法 1.1 ExponentialLR 指数衰减方法 1.2 CosineAnnealingLR 余弦退火方法 1.3 ChainedScheduler 链式方法 2. 实例说明 3. 结果说明 3.1 余弦退火法训练过程 3.2 指数衰减法训练过程 3.3 恒定学习率训练过程 3.4 结果解读 4. …