Redis 根本下令—— 超详细操纵演示!!!

打印 上一主题 下一主题

主题 491|帖子 491|积分 1473

数据库系列文章:

关系型数据库 — MySQL:
  

  • 1、基础语法大全(上)—— MySQL概述、SQL
  • 2、基础语法大全(中)—— 函数、约束
  • 3、基础语法大全(下)—— 多表查询
  • 4、基础语法大全(下) ——事务
  • 5、MySQL进阶(上)—— 存储引擎、 索引
  • 6、MySQL进阶(中)—— SQL 优化、视图/存储过程/触发器
  • 7、MySQL进阶(下)—— 锁、InnoDB 引擎、MySQL 管理
  
非关系型数据库 — Redis:
  

  • 1、Redis 的安装与设置
  • 2、Redis 根本下令(上)
  • 3、Redis 根本下令(下)
  • 4、Redis 持久化
  • 5、Redis 主从集群
  • 6、Redis 分布式体系
  • 7、Redis 缓存
  • 8、Lua脚本详解
  • 9、分布式锁
  三、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 则会读取指定 key 的 value 值。关于更多 set 与 get 下令格式,背面会详细学习。

⭐️ 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、 退出客户端下令


  • 使用 exit 或 quit 下令均可退出 Redis 下令行客户端。

3.2 Key 操纵下令

Redis 中 存储的数据整体 是一个 Map ,其 key 为 String 范例,而 value 则可以是 String 、Hash 表、 List 、 Set 等范例。
⭐️ 3.2.1、keys


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

⭐️ 3.2.2、exists


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

⭐️ 3.2.3、del


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

⭐️ 3.2.4、rename


  • 格式: RENAME key newkey
  • 功能:将 key 改名为 newkey 。
  • 说明:当 key 和 newkey 相同,或者 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 :属于 Hash 型 Value 操纵下令聚集,用于遍历当前 db 中指定 Hash 表 的所有 field-value 对。
  • sscan :属于 Set 型 Value 操纵下令聚集,用于 遍历当前 db 中指定 set 聚集 的所有元素
  • zscan :属于 ZSet 型 Value 操纵下令聚集,用于 遍历当前 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 必须存在才会设置成功,用于更新指定 key 的 value 。

  • 说明:如果 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 key 或 DECR key
  • 功能:increment ,自动递增。 将 key 中存储的数字值增一。decrement ,自动递减。将 key 中存储的数字值减一
  • 说明:如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 增一/减一 操纵。如果值不能表示为数字,那么返回一个错误提示。如果执行精确,则返回增一/减一 后的值。

⭐️ 3.3.9、incrby 与 decrby


  • 格式:INCRBY key increment 或 DECRBY 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 中字符串值的 子字符串,字符串的截取范围由 start 和 end 两个偏移量决定 包罗 start 和 end 在内
  • 说明: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 的下令,都是对二进制位的操纵下令,例如, setbit 、 getbit 、 bitcount 、bittop 、 bitfield ,这些下令不常用。
⭐️ 3.3.15、范例应用场景
Value 为 String 范例的 应用场景许多,这里仅举这种 范例应用场景 的例子:


  • 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同时访问 )
  1. //客户端每提交一次请求,都会执行下面的代码
  2. //指定新 ip 作为 key 的缓存过期时间为 60 秒
  3. boolean isExists = redis.set(ip, 1, "EX 60", "NX"); //等价于 set 192.168.192.55 1 ex 60 nx
  4. if(isExists != null || redis.incr(ip) <= 5) {
  5.         // 通过
  6. } else {
  7.         // 限流
  8. }
复制代码
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 的值加上增量 increment 。 hincrby 下令只能增加整数值,而 hincrbyfloat 可以增加小数值
  • 说明:增量也可以为负数,相当于对给定域举行减法操纵。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 下令。如果域 field 不存在,那么在执行下令前,域的值 被初始化为 0 。对一个储存字符串值的域 field 执行 HINCRBY 下令将 造成一个错误。

⭐️ 3.4.10、hkeys 与 hvals


  • 格式:HKEYS key 或 HVALS 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 value 或 RPUSHX 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 ...] timeout 或 BRPOP 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 被返回,并且不执行其他动作。如果 source 和 destination
    相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊环境视作列表的旋转 (rotation) 操纵。

⭐️ 3.5.11、brpoplpush


  • 格式:BRPOPLPUSH source destination timeout
  • 功能:BRPOPLPUSH 是 RPOPLPUSH 的 阻塞版本,当给定列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。当列表 source 为空时, BRPOPLPUSH 下令将阻塞毗连直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 下令为止。 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) 参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 也 可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。当 key 不是列表范例时,返回一个错误。 如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 ) 还要大,或者 start > stop, LTRIM 返回 一个空列表, 因为 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 阻塞式 “抢占” 列表尾部数据举行消耗,包管了消耗的负载均衡与高可用性。
    • brpop 的 timeout 设置为 0 ,表示 只要没有数据可弹出,就永久阻塞

  • 4)、动态有限聚集

    • 通过 lpush + ltrim 可以实现 有限聚集
    • 通过 lpush 从列表左侧向列表中添加数据,通过 ltrim 保持聚集的动态有限性。像企业的末位淘汰、学校的重点班等动态管理,都可通过这种动态有限聚集来实现。
    • 固然,通过 rpush + ltrim 也可以实现相同效果,只不过操纵的方向正好相反。

3.6 Set 型 Value 操纵下令



  • Redis 存储数据的 Value 可以是一个 Set 聚集 ,且聚集中的每一个元素均 String 范例。
  • Set 与 List 非常似,但不同之处是 Set 中的元素 具有无序性与不可重复性, 而 List 则具有有序性与可重复性。
  • Redis 中的 Set 聚集与 Java 中的 Set 聚集的实现相似,其底层都是 value 为 null 的 hash表。 也正因为此,才会引发无序性与不可重复性。
⭐️ 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 元素删除。当 source 或 destination 不是聚集范例时,返回一个错误

⭐️ 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、应用场景
Value 为 Set 范例的应用场景许多,这里对这些场景仅举行总结。


  • 1)、动态优劣名单


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

  • 2)、有限随机数

    • 有限随机数是指返回的随机数是基于某一聚集范围内的随机数,例如抽奖随机选人
    • 通过 spop 或 srandmember 可以实现从指定聚集中随机选出元素。

  • 3)、用户画像

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

3.7 有序Set 型 Value 操纵下令

Redis 存储数据的 Value 可以是一个 有序Set ,这个 有序Set 中的每个元素均 String 范例。有序 Set 与 Set 的不同之处是,有序 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 值介于 min 和 max 之间 (包罗等于 min 或 max) 的成员。有序集成员按 score 值递增 / 递减次序排列。具有相同 score 值的成员按字典序 / 逆字典序 排列。可选的 LIMIT 参数指定返回效果的 数量及区间 (就像 SQL 中的 SELECT LIMIT offset, count ),注意当 offset(偏移量) 很大时,定位 offset 的操纵大概需要遍历整个有序集,此过程服从大概会较低。可选的 WITHSCORES 参数决定效果集是单单返回有序集的成员,照旧将有序集成员及其 score 值一起返回。
  • 说明:min 和 max 的取值是 正负无穷大 (+inf、-inf) 的。默认环境下,区间的取值使用闭区间 (小于等于大于等于 ),也可以通过给参数前增加左括号 "("来使用 可选的开区间 (小于或大于) 。

⭐️ 3.7.4、zcard


  • 格式:ZCARD key
  • 功能:返回聚集的长度
  • 说明:当 key 不存在时,返回 0 。
⭐️ 3.7.5、zcount


  • 格式:ZCOUNT key min max
  • 功能:返回有序集 key 中, score 值在 min 和 max 之间 (默认包罗 score 值等于 min 或 max ) 的成员的数量。
⭐️ 3.7.6、zscore


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

⭐️ 3.7.7、zincrby


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


  • 格式:ZRANK key member 或 ZREVRANK 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) 区间内的所有成员。
  • 说明:排名区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。排名区间参数从 0 开始 ,即 0 表示排名第一的成员, 1 表示排名第二的成员,以此类推。也可以使用负数表示, -1 表示最后一个成员, -2 表示倒数第二个成员,以此类 推。 下令执行成功,则返回被移除成员的数量。

⭐️ 3.7.11、zremrangebyscore


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

⭐️ 3.7.12、zrangebylex


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

⭐️ 3.7.13、zlexcount


  • 格式:ZLEXCOUNT key min max
  • 功能:该下令仅适用于聚集中所有成员 都具有相同分值 的环境。 该下令返回该聚集中元素值本身(而非 score 值) 介于 min 和 max 范围内的元素数量。
  • 说明
⭐️ 3.7.14、zremrangebylex


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

⭐️ 3.7.15、应用场景


  • 有序 Set 最为范例 的应用场景就是 排行榜

    • 例如音乐、视频平台中根据播放量举行排序的排行榜;
    • 电商平台根据用户评价或贩卖量举行排序的排行榜等。

  • 将播放量作为 score ,将作品 id 作为 member ,将用户评价积分或贩卖量作为 score ,将商家 id 作为 member 。
  • 使用 zincrby 增加排序 score ,使用 zrevrange 获取 Top 前几名,使用 zrevrank 查询当前排名,使用 zscore 查询当前排序 score 等。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表