3.Redis命令

Redis命令

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

1.1 Redis

首先通过 redis-cli 命令进入到 Redis 命令行客户端,然后再运行下面的命令。

1.1.1心跳命令PING

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

在这里插入图片描述

1.1.2 读写键值命令

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

在这里插入图片描述

1.1.3 DB 切换 select

Redis 默认有 16 个数据库。这个在 Redis Desktop Manager(RDM)图形客户端中可以直观地看到。
在这里插入图片描述
默认使用的是 0 号 DB,可以通过 select db 索引来切换 DB。例如,如下命令会切换到DB3,并会将 age-23 写入到 DB3 中。
在这里插入图片描述

并且这个结果在 RDM 中是可以直观地看到的
在这里插入图片描述

1.1.4 查看 key 数量 dbsize

dbsize 命令可以查看当前数据库中 key 的数量。

在这里插入图片描述
从以上查看情况看,DB0 中有 2 个 key,DB1 中没有 key,DB3 中有 1 个 key。

1.1.5 删除当前库中数据 flushdb

flushdb 命令仅仅删除的是当前数据库中的数据,不影响其它库。
在这里插入图片描述

1.1.6 删除所有库中数据命令 flushall

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

在这里插入图片描述

1.2 Key 操作命令

Redis 中存储的数据整体是一个 Map,其 key 为 String 类型,而 value 则可以是 String、Hash 表、List、Set 等类型。

1.2.1 keys
  • 格式:KEYS pattern
  • 功能:查找所有符合给定模式 pattern 的 key,pattern 为正则表达式。
  • 说明:KEYS 的速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。所以生产环境中一般不使用该命令,而使用 scan 命令代替。
1.2.2 exists
  • 格式:EXISTS key
  • 功能:检查给定 key 是否存在。
  • 说明:若 key 存在,返回 1 ,否则返回 0 。
1.2.3 del
  • 格式:DEL key [key …]
  • 功能:删除给定的一个或多个 key 。不存在的 key 会被忽略。
  • 说明:返回被删除 key 的数量。
1.2.4 rename
  • 格式:RENAME key newkey
  • 功能:将 key 改名为 newkey。
  • 说明:当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME 命令将覆盖旧值。改名成功时提示 OK ,失败时候返回一个错误。
1.2.5 move
  • 格式:MOVE key db
  • 功能:将当前数据库的 key 移动到给定的数据库 db 当中。
  • 说明:如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。移动成功返回 1 ,失败则返回 0 。
1.2.6 type
  • 格式:TYPE key
  • 功能:返回 key 所储存的值的类型。
  • 说明:返回值有以下六种
    • none (key 不存在)
    • string (字符串)
    • list (列表)
    • set (集合)
    • zset (有序集)
    • hash (哈希表)
1.2.7 expire 与 pexpire
  • 格式:EXPIRE key seconds

  • 功能:为给定 key 设置生存时间。当 key 过期时(生存时间为 0),它会被自动删除。
    expire 的时间单位为秒,pexpire 的时间单位为毫秒。在 Redis 中,带有生存时 间的 key被称为“易失的”(volatile)。

  • 说明:生存时间设置成功返回 1。若 key 不存在时返回 0 。rename 操作不会改变 key的生存时间。

1.2.8 ttl 与 pttl
  • 格式:TTL key
  • 功能:TTL, time to live,返回给定 key 的剩余生存时间。
  • 说明:其返回值存在三种可能:
    • 当 key 不存在时,返回 -2 。
    • 当 key 存在但没有设置剩余生存时间时,返回 -1 。
    • 否则,返回 key 的剩余生存时间。ttl 命令返回的时间单位为秒,而 pttl 命令
      返回的时间单位为毫秒。
1.2.9 persist
  • 格式:PERSIST key
  • 功能:去除给定 key 的生存时间,将这个 key 从“易失的”转换成“持久的”。
  • 说明:当生存时间移除成功时,返回 1;若 key 不存在或 key 没有设置生存时间,则返回 0

1.3 String型Value操作命令

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

1.3.1 set
  • 格式:SET key value [EX seconds | PX milliseconds] [NX|XX]
  • 功能:SET 除了可以直接将 key 的值设为 value 外,还可以指定一些参数。
    • EX seconds:为当前 key 设置过期时间,单位秒。等价于 SETEX 命令。
    • PX milliseconds:为当前 key 设置过期时间,单位毫秒。等价于 PSETEX 命令。
    • NX:指定的 key 不存在才会设置成功,用于添加指定的 key。等价于 SETNX 命令。
    • XX:指定的 key 必须存在才会设置成功,用于更新指定 key 的 value。
  • 说明:如果 value 字符串中带有空格,则该字符串需要使用双引号或单引号引起来,否则会认为 set 命令的参数数量不正确,报错。
1.3.2 setex 与 与 psetex
  • 格式:SETEX/PSETEX key seconds value
  • 功能:set expire,其不仅为 key 指定了 value,还为其设置了生存时间。setex 的单位为秒,psetex 的单位为毫秒。
  • 说明:如果 key 已经存在, 则覆写旧值。该命令类似于以下两个命令,不同之处是,SETEX 是一个原子性操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
    SET key value
    EXPIRE key seconds # 设置生存时间
1.3.3 setnx
  • 格式:SETNX key value
  • 功能:SET if Not eXists,将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key已经存在,则 SETNX 不做任何动作。成功,返回 1,否则,返回 0。
  • 说明:该命令等价于 set key value nx
1.3.4 getset
  • 格式:GETSET key value
  • 功能:将给定 key 的值设为 value ,并返回 key 的旧值。
  • 说明: 当 key 存在但不是字符串类型时, 返回一个错误; 当 key 不存在时, 返回 nil 。
1.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 strlen
  • 格式:STRLEN key
  • 功能:返回 key 所储存的字符串值的长度。
  • 说明:当 key 储存的不是字符串值时,返回一个错误;当 key 不存在时,返回 0 。

1.4 String典型应用场景

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,分布式拒绝服务)攻击。

2.1 Hash型 Value

Redis 存储数据的 Value 可以是一个 Hash 类型。Hash 类型也称为 Hash 表、字典等。Hash 表就是一个映射表 Map,也是由键-值对构成,为了与整体的 key 进行区分,这里的键称为 field,值称为 value。注意,Redis 的 Hash 表中的 field-value 对均为 String 类型。

2.1.1 hset
  • 格式:HSET key field value
  • 功能:将哈希表 key 中的域 field 的值设为 value 。
  • 说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。如果 field 是哈希表中的一个新建域,并且值设置
    成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。
2.1.2 hget
  • 格式:HGET key field
  • 功能:返回哈希表 key 中给定域 field 的值。
  • 说明:当给定域不存在或是给定 key 不存在时,返回 nil 。
2.1.3 hmset
  • 格式:HMSET key field value [field value …]
  • 功能:同时将多个 field-value (域-值)对设置到哈希表 key 中。
  • 说明:此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时,返回一个错误。
2.1.4 hmget
  • 格式:HMGET key field [field …]
  • 功能:按照给出顺序返回哈希表 key 中一个或多个域的值。
  • 说明:如果给定的域不存在于哈希表,那么返回一个 nil 值。因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
2.1.5 hgetall
  • 格式:HGETALL key
  • 功能:返回哈希表 key 中所有的域和值。
  • 说明:在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。若 key 不存在,返回空列表。若 key 中包含大量元素,则该命令可能会阻塞 Redis 服务。 所以生产环境中一般不使用该命令, 而使用 hscan 命令代替。
2.1.6 hsetnx
  • 格式:HSETNX key field value
  • 功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。
  • 说明:若域 field 已经存在,该操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。
2.1.7 hdel
  • 格式:HDEL key field [field …]
  • 功能:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
  • 说明:返回被成功移除的域的数量,不包括被忽略的域。
2.1.8 hexits
  • 格式:HEXISTS key field
  • 功能:查看哈希表 key 中给定域 field 是否存在。
  • 说明: 如果哈希表含有给定域, 返回 1 。 如果不含有给定域, 或 key 不存在, 返回 0 。
2.1.9 hlen
  • 格式:HLEN key
  • 功能:返回哈希表 key 中域的数量。
  • 说明:当 key 不存在时,返回 0 。
2.1.10 hstrlen
  • 格式:HSTRLEN key field
  • 功能: 返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度 (string length) 。
  • 说明:如果给定的键或者域不存在, 那么命令返回 0 。

2.2 应用场景

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

3.1 Lis型Value操作命令

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

3.1.1 lpush/rpush
  • 格式:LPUSH key value [value …] 或 RPUSH key value [value …]
  • 功能:将一个或多个值 value 插入到列表 key 的表头/表尾(表头在左表尾在右)
  • 说明:如果有多个 value 值,对于 lpush 来说,各个 value 会按从左到右的顺序依次插入到表头; 对于 rpush 来说, 各个 value 会按从左到右的顺序依次插入到表尾。 如果 key不存在,一个空列表会被创建并执行操作。当 key 存在但不是列表类型时,返回一个错误。执行成功时返回列表的长度。
3.1.2 llen
  • 格式:LLEN key
  • 功能:返回列表 key 的长度。
  • 说明:如果 key 不存在,则 key 被解释为一个空列表,返回 0 。如果 key 不是列表类型,返回一个错误。
3.1.3 lindex
  • 格式:LINDEX key index
  • 功能:返回列表 key 中,下标为 index 的元素。列表从 0 开始计数。
  • 说明:如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。
3.1.4 lset
  • 格式:LSET key index value
  • 功能:将列表 key 下标为 index 的元素的值设置为 value 。
  • 说明:当 index 参数超出范围,或对一个空列表(key 不存在)进行 LSET 时,返回一个错误。
3.1.5 lrange
  • 格式:LRANGE key start stop
  • 功能:返回列表 key 中指定区间[start, stop]内的元素,即包含两个端点。
  • 说明:List 的下标从 0 开始,即以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
3.1.6 lpushx与rpushx
  • 格式:LPUSHX key value 或 RPUSHX key value
  • 功能: 将值 value 插入到列表 key 的表头/表尾, 当且仅当 key 存在并且是一个列表。
  • 说明:当 key 不存在时,命令什么也不做。若执行成功,则输出表的长度。
3.1.7 blpop / brpop
  • 格式:BLPOP key [key …] timeout 或 BRPOP key [key …] timeout
  • 功能:BLPOP/BRPOP 是列表的阻塞式(blocking)弹出命令。它们是 LPOP/RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP/BRPOP 命令阻塞, 直到等待 timeout 超时或发现可弹出元素为止。
  • 说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
3.1.8 rpoplpush
  • 格式:RPOPLPUSH source destination
  • 功能:命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
  • 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
  • 将 source 弹出的元素插入到列表 destination , 作为 destination 列表的的头元素。如果 source 不存在, 值 nil 被返回, 并且不执行其他动作。 如果 source 和 destination相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。
3.1.9 brpoplpush
  • 格式:BRPOPLPUSH source destination timeout
  • 功能:BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。
3.2 应用场景

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 也可以实现相同效果,只不过操作的方向正好相反。

4.1 Set 型 Value 操作命令

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

4.1.1 sadd
  • 格式:SADD key member [member …]
  • 功能:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member元素将被忽略。
  • 说明:假如 key 不存在,则创建一个只包含 member 元素作成员的集合。当 key 不是集合类型时,返回一个错误。
4.1.2 smembers
  • 格式:SMEMBERS key
  • 功能:返回集合 key 中的所有成员。
  • 说明: 不存在的 key 被视为空集合。 若 key 中包含大量元素, 则该命令可能会阻塞 Redis服务。所以生产环境中一般不使用该命令,而使用 sscan 命令代替。
4.1.3 scard
  • 格式:SCARD key
  • 功能:返回 Set 集合的长度
  • 说明:当 key 不存在时,返回 0 。
4.1.4 sismember
  • 格式:SISMEMBER key member
  • 功能:判断 member 元素是否集合 key 的成员。
  • 说明:如果 member 元素是集合的成员,返回 1 。如果 member 元素不是集合的成员,或 key 不存在,返回 0 。
4.1.5 smove
  • 格式:SMOVE source destination member
  • 功能:将 member 元素从 source 集合移动到 destination 集合。
  • 说明:如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到destination 集合中去, 返回 1。 当 destination 集合已经包含 member 元素时, SMOVE命令只是简单地将 source 集合中的 member 元素删除。当 source 或 destination 不是集合类型时,返回一个错误。
4.1.6 srem
  • 格式:SREM key member [member …]
  • 功能:移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略,且返回成功移除的元素个数。
  • 说明:当 key 不是集合类型,返回一个错误。
4.1.7 srandmember
  • 格式:SRANDMEMBER key [count]
  • 功能:返回集合中的 count 个随机元素。count 默认值为 1。
  • 说明:若 count 为正数,且小于集合长度,那么返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合长度,那么返回整个集合。如果
4.2 应用场景

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

(1 ) 动态黑白名单

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

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

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

5.1 有序 Set 型 Value 操作命令

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

5.1.1 zadd
  • 格式:ZADD key score member [[score member] [score member] …]
  • 功能:将一个或多个 member 元素及其 score 值加入到有序集 key 中的适当位置。
  • 说明:score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。若写入的 member 值已经存在,但 score 值不同,则新的 score 值将覆盖老 score。
5.1.2 zcard
  • 格式:ZCARD key
  • 功能:返回集合的长度
  • 说明:当 key 不存在时,返回 0 。
5.1.3 zcount
  • 格式:ZCOUNT key min max
  • 功能: 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min或 max )的成员的数量。
5.1.4 zscore
  • 格式:ZSCORE key member
  • 功能:返回有序集 key 中,成员 member 的 score 值。
  • 说明:如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
5.1.5 zincrby
  • 格式:ZINCRBY key increment member
  • 功能:为有序集 key 的成员 member 的 score 值加上增量 increment 。increment 值可以是整数值或双精度浮点数。
  • 说明: 可以通过传递一个负数值 increment , 让 score 减去相应的值。 当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD keyincrement member 。当 key 不是有序集类型时,返回一个错误。命令执行成功,则返回 member 成员的新 score 值。
5.1.6 zrank 与 与 zrevrank
  • 格式:ZRANK key member 或 ZREVRANK key member
  • 功能:返回有序集 key 中成员 member 的排名。zrank 命令会按 score 值递增排序,zrevrank 命令会按 score 递减排序。
  • 说明: score 值最小的成员排名为 0 。 如果 member 不是有序集 key 的成员, 返回 nil 。

5.2 应用场景

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

6 benchmark 测试工具

6.1 简介

在Redis安装完毕后会自动安装一个redis-benchmark测试工具, 其是一个压力测试工具,用于测试 Redis 的性能。
在这里插入图片描述
通过 redis-benchmark –help 命令可以查看到其用法:

在这里插入图片描述

6.2 测试 1

(1 ) 命令解析
以上命令中选项的意义:

  • -h:指定要测试的 Redis 的 IP,若为本机,则可省略
  • -p:指定要测试的 Redis 的 port,若为 6379,则可省略
  • -c:指定模拟有客户端的数量,默认值为 50
  • -n:指定这些客户端发出的请求的总量,默认值为 100000
  • -d:指定测试 get/set 命令时其操作的 value 的数据长度,单位字节,默认值为 3。在测试其它命令时该指定没有用处。
    以上命令的意义是,使用 100 个客户端连接该 Redis,这些客户端总共会发起 100000个请求,set/get 的 value 为 8 字节数据。
6.3 测试结果分析

该命令会逐个测试所有 Redis 命令,每个命令都会给出一份测试报告,每个测试报告由四部分构成:
A 、 测试环境报告

首先就是测试环境:
在这里插入图片描述
B 、 延迟百分比分布
这是按照百分比进行的统计报告:每完成一次剩余测试量的 50%就给出一个统计数据。
在这里插入图片描述
C 、 延迟的累积分布
这是按照时间间隔统计的报告:基本是每 0.1 毫秒统计一次。
在这里插入图片描述
D 、 总述报告

这是总述性报告。
在这里插入图片描述

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

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

相关文章

STM32基础--使用寄存器点亮流水灯

GPIO 简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO被分成很多组,每组有 16 个引脚&#xf…

多源BFS

目录 算法原理 多源BFS步骤: 1、542. 01 矩阵 2、1020. 飞地的数量 3、1765. 地图中的最高点 4、1162. 地图分析 多源BFS(Breadth-First Search,广度优先搜索)是解决边权为1的多源最短路径问题的有效算法。在这种情况下&…

【模拟string函数的实现】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 模拟string函数的实现 浅拷贝 深拷贝 vs和g下string结构的说明 总结 前言 模拟string函数的实现 浅拷贝 深拷贝 总结 前言 世上有两种耀眼的光芒&#…

Java面向对象案例之描述专业和学生(4)

类的方法图 学生类: 属性:学号,姓名,年龄,所学习的专业方法:学习的方法,描述学习状态。描述内容包括姓名、学号、年龄、所学习的专业信息 专业类: 属性:专业编号&#xf…

2024年【天津市安全员C证】考试资料及天津市安全员C证考试试题

题库来源:安全生产模拟考试一点通公众号小程序 天津市安全员C证考试资料根据新天津市安全员C证考试大纲要求,安全生产模拟考试一点通将天津市安全员C证模拟考试试题进行汇编,组成一套天津市安全员C证全真模拟考试试题,学员可通过…

链表快慢指针合集(力扣)

876. 链表的中间结点 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x…

C++提高笔记(五)---STL容器(set/multiset、map/multimap)

1、set / multiset容器 1.1set基本概念 简介:所有元素都会在插入时自动被排序 本质:set和multiset属于关联式容器,底层结构是用二叉树实现 set和multiset区别: set不允许容器中有重复的元素 multiset允许容器中有重复的元素 …

uniapp——第2篇:编写vue语法

前提,建议先学会前端几大基础:HTML、CSS、JS、Ajax,还有一定要会Vue!(Vue2\Vue3)都要会!!!不然不好懂 一、去哪写? 就在【pages】的你的人一个页面文件夹里的【.vue】文…

多站合一的音乐搜索下载助手PHP源码l亲测

源码获取方式 回复:031601 搭建教程: 将源码下载上传至宝塔面板,直接运行即可~ 说明: 该源码进行测试,测试成功源码无加密优化相关其他采集问题。

langchain+chatglm3+BGE+Faiss Linux环境安装依赖

前言 本篇默认读者已经看过之前windows版本,代码就不赘述,本次讲述是linux环境配置 超短代码实现!!基于langchainchatglm3BGEFaiss创建拥有自己知识库的大语言模型(准智能体)本人python版本3.11.0(windows环境篇&…

Go微服务实战——服务的配置获取(nacos做配置中心)

nacos做配置中心 demo仓库 docker安装nacos docker pull nacos/nacos-server 使用docker每次需要sudo可以执行如下命令 sudo groupadd docker #添加用户组 sudo gpasswd -a username docker #将当前用户添加至用户组-d就是删除该组中的用户 newgrp docker…

L1-070 吃火锅分数 15

我们老师的话说就是,你学长睡了四年的床板子你不收拾收拾就往上躺着睡觉吗???一定要记得用到计数变量时首先要赋初值0或者其他,按题目要求来。 用 输入样例 1: Hello! are you there? wantta chi1 huo3…

排序链表的三种写法

题目链接:https://leetcode.cn/problems/sort-list/?envTypestudy-plan-v2&envIdtop-100-liked 第一种,插入排序,会超时 class Solution {public ListNode sortList(ListNode head) {//插入排序,用较为简单的方式解决ListNo…

程序人生——Java泛型和反射的使用建议

目录 引出泛型和反射建议93:Java的泛型是类型擦除的建议94:不能初始化泛型参数和数组建议95:强制声明泛型的实际类型 建议96:不同的场景使用不同的泛型通配符建议97:警惕泛型是不能协变和逆变的 建议98:建议…

快速幂求逆元-C语言

快速幂求逆元 文章目录 快速幂求逆元算法描述算法步骤复杂度分析代码实现输入输出样例注意事项 算法描述 快速幂求逆元是指对于一个数 a a a 和一个质数 p p p,求 a p a^p ap 的逆元,即 a − 1 a^{-1} a−1。 算法步骤 首先判断 a a a 是否为 p p…

内网 IP 地址泄漏原理以及修复方法

漏洞名称:内网IP地址泄漏 漏洞描述: 网站的内部IP地址,常常被攻击者通过信息收集,得到其内网的IP地址,对于渗透攻击,打下良好基础,如内网Ip地址段,IP路由等等。IIS为常见的泄露内网…

C++:类之六脉神剑——默认成员函数

个人主页:日刷百题 系列专栏:〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 🌎欢迎各位→点赞👍收藏⭐️留言📝 ​ ​ 一、默认成员函数 如果一个类中什么成员都没有,简称为 空类 。 空类中真的什么都…

【Poi-tl Documentation】自定义占位符来设置图片大小

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板文件&#xff1a; image_test.docx package run.siyuan.poi.tl.policy;imp…

双路控制比例方向阀放大器

该模块比例放大器用于控制一个带有两个螺线管的比例方向控制阀或一个/两个独立的比例压力阀或比例节流阀&#xff0c;每个阀带有一个或二个螺线管。 各种可调参数允许对相应阀门的最佳适应。单路双路四路控制&#xff0c;供电24VDC&#xff0c;输入指令兼容多种可选&#xff0c…

2403d,无串插件传播uda

原文 是否可在没有串插件时传播UDA? 为了让它没有模板插件运行,我需要编写一个递归模板(在模板参数和UDA实例化结构上递归),它考虑了以下情况:普通类型,模板化类型,枚举(C风格),枚举值编译时常量等. 这是正确的,还是有无法只抓取编译时别名或枚举,而不给每个"类型"…