赞
踩
数据库系列文章:
关系型数据库 — MySQL:
- 1、基础语法大全(上)—— MySQL概述、SQL
- 2、基础语法大全(中)—— 函数、约束
- 3、基础语法大全(下)—— 多表查询
- 4、基础语法大全(下) ——事务
- 5、MySQL进阶(上)—— 存储引擎、 索引
- 6、MySQL进阶(中)—— SQL 优化、视图/存储过程/触发器
- 7、MySQL进阶(下)—— 锁、InnoDB 引擎、MySQL 管理
非关系型数据库 — Redis:
Redis 根据命令所操作对象的不同,可以分为三大类:对 Redis 进行基础性操作的命令,对 Key
的操作命令,对 Value
的操作命令。
⭐️ 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
0
号 DB ,可以通过 select db
索引来切换 DB 。
select 3
切换到 DB3 ,并会将 age-23
写入到 DB3 中。⭐️ 3.1.4、 查看 key 数量 dbsize
dbsize
命令可以查看 当前数据库 中 key
的数量。key
; DB1 中没有 key
; DB3 中有 1 个 key
。⭐️ 3.1.5、 删除当前库中数据 flushdb
flushdb
命令仅仅 删除的是当前数据库中的数据,不影响其它库。⭐️ 3.1.6、 删除所有库中数据命令 flushall
flushall
命令可以删除所有库中的所有数据。所以该命令的使用一定要慎重。⭐️ 3.1.7、 退出客户端命令
exit
或 quit
命令均可退出 Redis 命令行客户端。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
的时间单位为 毫秒
。key
被称为 "易失的” ( volatile
)。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
从 “易失的” 转换成 “持久的” 。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 中指定有序集合
的所有元素(数值与元素值)
Redis 存储数据的 Value
可以是 一个 String
类型数据。 String
类型的 Value
是 Redis 中最基本,最常见的类型。 String
类型的 Valu
e 中可以存放任意数据, 包括 数值型
,甚至是二进制的 图片
、音频
、视频
、序列化对象
等。一个 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)、数据缓存
2)、计数器
value
为数值型的 key
作为平台计数器、视频播放计数器等。每个有效客户端访问一次,或视频每播放一次,都是直接修改 Redis 中的计数器,然后再以 异步方式 持久化 到其它数据源中,例如持久化到 MySQL 。3)、共享 Session
4)、限速器
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 {
// 限流
}
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
是否存在。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
)。⭐️ 3.4.13、应用场景
Hash型
Value 非常适合存储 对象数据。 key
为对象名称, value
为描述对象属性的 Map
,对对象属性的修改在 Redis 中就可直接完成。String 型
Value 存储对象,那个对象是 序列化过的,例如序列化为 JSON
串,对对象属性值的修改需要先 反序列化为对象后再修改,修改后再序列化为 JSON
串后写入到 Redis 。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 类型
的应用场景很多, 主要是通过 构建不同的数据结构 来实现相应的业务功能。 这里仅对这些 数据结构的实现方式 进行总结,不举具体的例子。
lpush
+ lpop
可以实现 栈 数据结构 效果:先进后出 。lpush
从列表 左侧插入数据 ,通过 lpop
从列表 左侧取出数据 。rpush
+ rpop
也可以实现相同效果 ,只不过操作的是列表右侧 。lpush
+ rpop
可以实现 队列 数据结构效果:先进先出。lpush
从列表 左侧插入数据 ,通过 rpop
从列表 右侧取出数据 。rpush
+ lpop
也可以实现相同效果,只不过操作的方向正好相反。lpush
+ brpop
可以实现 阻塞式消息队列 效果。lpush
从列表左侧插入数据,作为消息消费者的多个客户端使用 brpop
阻塞式 “抢占” 列表尾部数据进行消费,保证了消费的负载均衡与高可用性。brpop
的 timeout
设置为 0
,表示 只要没有数据可弹出,就永久阻塞 。lpush
+ ltrim
可以实现 有限集合 。lpush
从列表左侧向列表中添加数据,通过 ltrim
保持集合的动态有限性。像企业的末位淘汰、学校的重点班等动态管理,都可通过这种动态有限集合来实现。rpush
+ ltrim
也可以实现相同效果,只不过操作的方向正好相反。Value
可以是一个 Set
集合 ,且集合中的每一个元素均 String
类型。Set
与 List
非常似,但不同之处是 Set
中的元素 具有无序性与不可重复性, 而 List 则具有有序性与可重复性。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)、动态黑白名单
2)、有限随机数
spop
或 srandmember
可以实现从指定集合中随机选出元素。3)、用户画像
sadd
添加到该用户对应的集合中。这些标签具有无序、不重复特征。sinter/sinterstore
根据用户画像间的交集进行好友推荐、商品推荐、客户推荐等。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
等。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。