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.rhkb.cn/news/277427.html

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

相关文章

MIT线性代数-方程组的几何解释

文章目录 1. 二维空间1.1 行方向1.2 列方向 2. 三维空间2.1 行方向2.2 列方向 假设有一个方程组 A X B AXB AXB表示如下 2 x − y 0 (1) 2x-y0\tag{1} 2x−y0(1) − x 2 y 3 (2) -x2y3\tag{2} −x2y3(2) 矩阵表示如下: [ 2 − 1 − 1 2 ] [ x y ] [ 0 3 ] (3)…

redis瘦身版

高可用: 主从 哨兵:sentinel: 集群监控 消息通知 故障转移 配置中心 redis cluster :livu livechat中使用了 人家有槽slot 16384个呢 请求发送任意节点 该节点会将请求发送到正确节点上-相亲相爱 1.哈希的方式,将数据…

如何在CasaOS系统玩客云中安装内网穿透工具实现远程访问内网主机下载资源

文章目录 1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 2月底,玩客云APP正式停止运营,不再提供上传、云添加功能。3月初,有用户进行了测试,局域网内的各种服务还能继续使用,但…

RK3568平台开发系列讲解(基础篇)内核是如何发送事件到用户空间

🚀返回专栏总目录 文章目录 一、相关接口函数二、udevadm 命令三、实验沉淀、分享、成长,让自己和他人都能有所收获!😄 一、相关接口函数 kobject_uevent 是 Linux 内核中的一个函数, 用于生成和发送 uevent 事件。 它是 udev 和其他设备管理工具与内核通信的一种方式。…

Day40:安全开发-JavaEE应用SpringBoot框架JWT身份鉴权打包部署JARWAR

目录 SpringBoot-身份鉴权-JWT技术 SpringBoot-打包部署-JAR&WAR 思维导图 Java知识点 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等. 框架库:MyBatis&…

Navicat 面试题及答案整理,最新面试题

Navicat 在数据库管理中的主要用途有哪些? Navicat 是一款数据库管理工具,其主要用途包括: 1、多数据库支持: Navicat 支持多种数据库连接,包括 MySQL、Oracle、PostgreSQL、SQLite、SQL Server 等,方便用…

湖南麒麟SSH服务漏洞

针对湖南麒麟操作系统进行漏洞检测时,会报SSH漏洞风险提醒,具体如下: 针对这些漏洞,可以关闭SSH服务(前提是应用已经部署完毕不再需要通过SSH远程访问传输文件的情况下,此时可以通过VNC远程登录方法&#x…

Github Copilot 工具,无需账号,一键激活

① 无需账号,100%认证成功!0风险,可联网可更新,,支持copilot版本升级,支持chat ② 支持windows、mac、linux系统等设备 ③一号通用,支持所有IDE(AppCode,CLion,DataGrip,GoLand,IntelliJ IDEA …

51单片机-AT24C02(I2C总线)

目录 一,介绍及元件工作原理 7.时序结构(重要) 8.i2C总线数据帧(重要) 二,应用 一,介绍及元件工作原理 1.元件介绍 2.存储器 3.地址总线和数据总线 地址总线只能一次选中一行 4.引脚及应用…

java上传和下载文件使用教程

文章目录 前言一、引入库二、上传文件1.前台2.后台3.测试 三、下载文件(chrome)1.前台2.后台3.测试 总结 前言 本篇文章介绍java中文件的上传和下载&#xff0c;亲测可用&#xff0c;所用案例为springboot项目。 一、引入库 <!-- SpringBoot Web容器 --> <dependenc…

【原创】java+swing+mysql二手车交易管理系统

前言&#xff1a; 本文主要介绍了二手车交易管理设计与实现。首先&#xff0c;通过市场需求&#xff0c;我们确定了二手车的功能&#xff0c;通常的二手车交易系统都是B/S架构&#xff0c;然而我们今天要用javaswing去开发一个C/S架构的二手车交易管理系统&#xff0c;主要功能…

【QT入门】VS2019+QT的开发环境配置

声明&#xff1a;该专栏为本人学习Qt知识点时候的笔记汇总&#xff0c;希望能给初学的朋友们一点帮助(加油&#xff01;) 往期回顾&#xff1a; 【QT入门】什么是qt&#xff0c;发展历史&#xff0c;特征&#xff0c;应用&#xff0c;QtCreator-CSDN博客【QT入门】Windows平台下…

Spark-Scala语言实战(2)(在IDEA中安装Scala,超详细配图)

之前的文章中&#xff0c;我们学习了如何在windows下下载及使用Scala&#xff0c;但那对一个真正想深入学习Scala的人来说&#xff0c;是不够的&#xff0c;今天我会给大家带来如何在IDEA中安装Scala。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的…

嵌入式硬件设计(一)|利用 NodeMCU-ESP8266 开发板和继电器结合APP“点灯•blinker”制作Wi-Fi智能开关(附有关硬件详细资料)

概述 本文主要讲述利用 NodeMCU-ESP8266 开发板和继电器通过手机 APP “ 点灯 • Blinker ” 制作一款能够由手机控制的WiFi 智能开关&#xff0c;从而实现智能物联。NodeMCU 是基于 Lua 的开源固件&#xff0c;ESP8266-NodeMCU是一个开源硬件开发板&#xff0c;支持WiFi功能&a…

springboot基于spring boot的在线答题微信小程序

摘 要 在线答题微信小程序是考试中重要的一环&#xff0c;在线答题是学生获取任务信息的主要渠道。为了方便学生能够在网站上查看任务信息、考试&#xff0c;于是开发了基于 springboot框架设计与实现了一款简洁、轻便的在线答题微信小程序。本微信小程序解决了在线答题事务中的…

【RS422】基于未来科技FT4232HL芯片的多波特率串口通信收发实现

功能简介 串行通信接口常常用于在计算机和低速外部设备之间传输数据。串口通信存在多种标准&#xff0c;以RS422为例&#xff0c;它将数据分成多个位&#xff0c;采用异步通信方式进行传输。   本文基于Xilinx VCU128 FPGA开发板&#xff0c;对RS422串口通信进行学习。   根…

面向控制台编程?Java的GUI开发

记得之前刚开始学习Java&#xff0c;按部就班去阅读《Java核心技术》这本书的时候&#xff0c;总是听别人提起&#xff0c;java swing那一章不用看了。然后直到对着控制台编程了半年&#xff0c;回来捡起了Swing图形界面&#xff0c;跟着网上搞了坦克大战的游戏&#xff0c;总觉…

关于数据通信知识的补充——第二篇

目录 四.二层交换机 5.实现不同vlan通信的原理 方法一&#xff1a;路由器网关 方法二&#xff1a;单臂路由 方法三&#xff1a;三层交换机 五.三层路由技术 &#xff08;1&#xff09;直连路由 &#xff08;2&#xff09;静态路由 &#xff08;3&#xff09;动态路由 …

【Poi-tl Documentation】区块对标签显示隐藏改造

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板&#xff1a; 删除行表格测试.docx 改造前测试效果 package run.siyuan…

爬虫学习 Scrapy中间件代理UA随机selenium使用

目录 中间件UA、代理处理---process_requestUA随机 代理处理seleniumscrapy 中间件 控制台操作 (百度只起个名 scrapy startproject mid scrapy genspider baidu baidu.com setting.py内 ROBOTSTXT_OBEY FalseLOG_LEVEL "WARNING"运行 scrapy crawl baidu middle…