当前位置:   article > 正文

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

redis 操作

数据库系列文章:

关系型数据库 — 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 nx

if(isExists != null || redis.incr(ip) <= 5) {
	// 通过
} else {
	// 限流
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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、ltrim

  • 格式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)、
    • 通过 lpush + lpop 可以实现 数据结构 效果:先进后出
    • 通过 lpush 从列表 左侧插入数据 ,通过 lpop 从列表 左侧取出数据
    • 当然,通过 rpush + rpop 也可以实现相同效果 ,只不过操作的是列表右侧
  • 2)、队列
    • 通过 lpush + rpop 可以实现 队列 数据结构效果:先进先出
    • 通过 lpush 从列表 左侧插入数据 ,通过 rpop 从列表 右侧取出数据 。
    • 当然,通过 rpush + lpop 也可以实现相同效果,只不过操作的方向正好相反。
  • 3)、阻塞式消息队列
    • 通过 lpush + brpop 可以实现 阻塞式消息队列 效果。
    • 作为消息生产者的客户端使用 lpush 从列表左侧插入数据,作为消息消费者的多个客户端使用 brpop 阻塞式 “抢占” 列表尾部数据进行消费,保证了消费的负载均衡与高可用性。
    • brpoptimeout 设置为 0 ,表示 只要没有数据可弹出,就永久阻塞
  • 4)、动态有限集合
    • 通过 lpush + ltrim 可以实现 有限集合
    • 通过 lpush 从列表左侧向列表中添加数据,通过 ltrim 保持集合的动态有限性。像企业的末位淘汰、学校的重点班等动态管理,都可通过这种动态有限集合来实现。
    • 当然,通过 rpush + ltrim 也可以实现相同效果,只不过操作的方向正好相反。

3.6 Set 型 Value 操作命令

  • Redis 存储数据的 Value 可以是一个 Set 集合 ,且集合中的每一个元素均 String 类型。
  • SetList 非常似,但不同之处是 Set 中的元素 具有无序性与不可重复性, 而 List 则具有有序性与可重复性。
  • Redis 中的 Set 集合与 Java 中的 Set 集合的实现相似,其底层都是 valuenullhash表。 也正因为此,才会引发无序性与不可重复性

⭐️ 3.6.1、sadd

  • 格式SADD key member [member ...]
  • 功能:将 一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member元素将被忽略。
  • 说明:假如 key 不存在,则创建一个只包含 member 元素作成员的集合。当 key 不是集合类型时,返回一个错误。

⭐️ 3.6.2、smembers

  • 格式SMEMBERS key
  • 功能:返回集合 key 中的所有成员。
  • 说明:不存在的 key 被视为 空集合。 若 key 中包含大量元素,则该命令可能会 阻塞 Redis服务。 所以生产环境中一般不使用该命令,而使用 sscan 命令代替。

⭐️ 3.6.3、scard

  • 格式SCARD key
  • 功能:返回 Set 集合的长度
  • 说明:当 key 不存在时,返回 0 。

⭐️ 3.6.4、sismember

  • 格式SISMEMBER key member
  • 功能:判断 member 元素是否为集合 key 的成员。
  • 说明:如果 member 元素是集合的成员,返回 1 。如果 member 元素不是集合的成员,或 key 不存在,返回 0

在这里插入图片描述

⭐️ 3.6.5、smove

  • 格式SMOVE source destination member
  • 功能:将 member 元素从 source 集合移动到 destination 集合。
  • 说明:如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去,返回 1 。当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。当 sourcedestination 不是集合类型时,返回一个错误

在这里插入图片描述

⭐️ 3.6.6、srem

  • 格式SREM key member [member ...]
  • 功能移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略, 且返回成功移除的元素个数。
  • 说明:当 key 不是集合类型,返回一个错误。

在这里插入图片描述

⭐️ 3.6.7、srandmember

  • 格式SRANDMEMBER key [count]
  • 功能返回集合中的 count 个随机元素。 count 默认值为 1
  • 说明:若 count 为正数,且小于集合长度,那么返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合长度,那么返回整个集合。如果 count为负数,那么返回一个包含 count 绝对值个元素的数组, 但数组中的元素可能会出现重复

在这里插入图片描述

⭐️ 3.6.8、spop

  • 格式SPOP key [count]
  • 功能移除并返回集合中的 count 个随机元素。 count 必须为正数,且默认值为 1
  • 说明:如果 count 大于等于集合长度,那么移除并返回整个集合。

在这里插入图片描述

⭐️ 3.6.9、sdiff / sdiffstore

  • 格式SDIFF key [key ...]SDIFFSTORE destination key [key ...]
  • 功能:返回 第一个集合 与其它集合之间的差集。 差集, difference
  • 说明:这两个命令的不同之处在于, sdiffstore 不仅能够显示差集,还能将差集 存储到指定的集合 destination 中。 如果 destination 集合已经存在,则将其覆盖。 不存在的 key 被视为空集。

在这里插入图片描述

⭐️ 3.6.10、sinter / sinterstore

  • 格式SINTER key [key ...]SINTERSTORE destination key [key ...]
  • 功能:返回多个集合间的交集。 交集, intersection
  • 说明:这两个命令的不同之处在于, sinterstore 不仅能够显示交集,还能将交集存储到指定的集合 destination 中。 如果 destination 集合已经存在,则将其覆盖。 不存在的 key 被视为空集。

在这里插入图片描述

⭐️ 3.6.11、sunion / sunionstore

  • 格式SUNION key [key ...]SUNIONSTORE destination key [key ...]
  • 功能:返回多个集合间的并集。 并集, union
  • 说明:这两个命令的不同之处在于, sunion store 不仅能够显示并集,还能将并集存储到指定的集合 destination 中。 如果 destination 集合已经存在,则将其覆盖。 不存在的 key 被视为空集。

在这里插入图片描述

⭐️ 3.6.12、应用场景

ValueSet 类型的应用场景很多,这里对这些场景仅进行总结。

  • 1)、动态黑白名单
    在这里插入图片描述

    • 例如某服务器中要设置用于访问控制的黑名单。如果直接将黑名单写入服务器的配置文件,那么存在的问题是,无法动态修改黑名单。此时可以将黑名单直接写入 Redis ,只要有客户端来访问服务器,服务器在获取到客户端 IP 后先从 Redis 的黑名单中查看是否存在该 IP如果存在,则拒绝访问,否则访问通过。
  • 2)、有限随机数

    • 有限随机数是指返回的随机数是基于某一集合范围内的随机数,例如抽奖随机选人
    • 通过 spopsrandmember 可以实现从指定集合中随机选出元素。
  • 3)、用户画像

    • 社交平台、电商平台等各种需要用户注册登录的平台,会根据用户提供的资料与用户使用习惯,为每个用户进行画像,即为每个用户定义很多可以反映该用户特征的标签,这些标签就可以使用 sadd 添加到该用户对应的集合中。这些标签具有无序不重复特征
    • 同时平台还可以使用 sinter/sinterstore 根据用户画像间的交集进行好友推荐、商品推荐、客户推荐等。

3.7 有序Set 型 Value 操作命令

Redis 存储数据的 Value 可以是一个 有序Set ,这个 有序Set 中的每个元素均 String 类型。有序 SetSet 的不同之处是,有序 Set 中的每一个元素都有一个分值 score, Redis 会根据 score 的值对集合进行由小到大的排序。其与 Set 集合要求相同,元素不能重复,但元素的 score 可以重复。由于该类型的所有命令均是字母 z 开头,所以该 Set 也称为 ZSet

⭐️ 3.7.1、zadd

  • 格式ZADD key score member [[score member] [score member] ...]
  • 功能:将一个或多个 member 元素及其 score 值加入到有序集 key 中的适当位置。
  • 说明score 值可以是整数值双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。若写入的 member 值已经存在,但 score 值不同,则新的 score 值将覆盖score

⭐️ 3.7.2、zrange 与 zrevrange

  • 格式ZRANGE key start stop [WITHSCORES]ZREVRANGE key start stop [WITHSCORES]
  • 功能:返回有序集 key 中,指定区间内的成员。 zrange 命令会按 score递增排序zrevrange 命令会按 score 递减排序 。具有相同 score 值的成员按字典序 / 逆字典序 排列。可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回。
  • 说明:下标参数从 0 开始 ,即 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。也可以使用负数下标, -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

在这里插入图片描述

超出范围的下标并不会引起错误。

  • 例如,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是 简单地返回一个空列表
  • 再比如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。

key 中指定范围内包含大量元素,则该命令可能会阻塞 Redis 服务。 所以生产环境中如果要查询有序集合中的所有元素,一般不使用该命令,而使用 zscan 命令代替。

⭐️ 3.7.3、zrangebyscore 与 zrevrangebyscore

  • 格式ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
  • 功能:返回有序集 key 中,所有 score 值介于 minmax 之间 (包括等于 minmax) 的成员。有序集成员按 score递增 / 递减次序排列。具有相同 score 值的成员按字典序 / 逆字典序 排列。可选的 LIMIT 参数指定返回结果的 数量及区间 (就像 SQL 中的 SELECT LIMIT offset, count ),注意当 offset(偏移量) 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程效率可能会较低。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
  • 说明minmax 的取值是 正负无穷大 (+inf-inf) 的。默认情况下,区间的取值使用闭区间 (小于等于大于等于 ),也可以通过给参数前增加左括号 "("来使用 可选的开区间 (小于或大于) 。

在这里插入图片描述

⭐️ 3.7.4、zcard

  • 格式ZCARD key
  • 功能:返回集合的长度
  • 说明:当 key 不存在时,返回 0 。

⭐️ 3.7.5、zcount

  • 格式ZCOUNT key min max
  • 功能:返回有序集 key 中, score 值在 minmax 之间 (默认包括 score 值等于 minmax ) 的成员的数量。

⭐️ 3.7.6、zscore

  • 格式ZSCORE key member
  • 功能:返回有序集 key 中,成员 memberscore 值。
  • 说明:如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil

在这里插入图片描述

⭐️ 3.7.7、zincrby

  • 格式ZINCRBY key increment member
  • 功能:为有序集 key 的成员 memberscore 值加上增量 incrementincrement 值可以是 整数值双精度浮点数
  • 说明:可以通过传递一个负数值 increment ,让 score 减去相应的值。当 key 不存在, 或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。当 key 不是有序集类型时,返回一个错误。命令执行成功,则返回 member 成员的新 score 值。

⭐️ 3.7.8、zrank 与 zrevrank

  • 格式ZRANK key memberZREVRANK key member
  • 功能:返回有序集 key 中成员 member 的排名。 zrank 命令会按 score递增排序zrevrank 命令会按 score 递减排序
  • 说明score 值最小的成员排名为 0 。如果 member 不是有序集 key 的成员,返回 nil

在这里插入图片描述

⭐️ 3.7.9、zrem

  • 格式ZREM key member [member ...]
  • 功能移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
  • 说明:当 key 存在但不是有序集类型 时,返回一个错误。执行成功,则返回 被成功移除的成员的数量,不包括被忽略的成员。

⭐️ 3.7.10、zremrangebyrank

  • 格式ZREMRANGEBYRANK key start stop
  • 功能移除有序集 key 中,指定排名 (rank) 区间内的所有成员。
  • 说明:排名区间分别以下标参数 startstop 指出,包含 startstop 在内。排名区间参数从 0 开始 ,即 0 表示排名第一的成员, 1 表示排名第二的成员,以此类推。也可以使用负数表示, -1 表示最后一个成员, -2 表示倒数第二个成员,以此类 推。 命令执行成功,则返回被移除成员的数量。

在这里插入图片描述

⭐️ 3.7.11、zremrangebyscore

  • 格式ZREMRANGEBYSCORE key min max
  • 功能:移除有序集 key 中,所有 score 值介于 minmax 之间 (包括等于 minmax ) 的成员。
  • 说明:命令执行成功,则返回被移除成员的数量。

在这里插入图片描述

⭐️ 3.7.12、zrangebylex

  • 格式ZRANGEBYLEX key min max [LIMIT offset count]
  • 功能:该命令仅适用于集合中所有成员 都具有相同分值 的情况。当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的 字典序lexicographical ordering )来进行排序。即这个命令返回给定集合中元素值介于 minmax 之间的成员。如果有序集合里面的成员带有不同的分值, 那么命令的执行结果与 zrange key 效果相同 。
  • 说明:合法的 minmax 参数必须包含 左小括号 “(” 或 左中括号 “[”,其中 左小括号 “(” 表示开区间, 而 左中括号 “[” 则表示闭区间minmax 也可使用特殊字符+” 和 “-” 分别表示 正无穷大负无穷大

在这里插入图片描述

⭐️ 3.7.13、zlexcount

  • 格式ZLEXCOUNT key min max
  • 功能:该命令仅适用于集合中所有成员 都具有相同分值 的情况。 该命令返回该集合中元素值本身(而非 score 值) 介于 minmax 范围内的元素数量。
  • 说明

⭐️ 3.7.14、zremrangebylex

  • 格式ZREMRANGEBYLEX key min max
  • 功能:该命令仅适用于集合中所有成员 都具有相同分值 的情况。 该命令会移除该集合中元素值本身介于 minmax 范围内的所有元素。

在这里插入图片描述

⭐️ 3.7.15、应用场景

  • 有序 Set 最为典型 的应用场景就是 排行榜
    • 例如音乐、视频平台中根据播放量进行排序的排行榜;
    • 电商平台根据用户评价或销售量进行排序的排行榜等。
  • 将播放量作为 score ,将作品 id 作为 member ,将用户评价积分或销售量作为 score ,将商家 id 作为 member
  • 使用 zincrby 增加排序 score ,使用 zrevrange 获取 Top 前几名,使用 zrevrank 查询当前排名,使用 zscore 查询当前排序 score 等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/658630
推荐阅读
相关标签