redis常用命令总结,一文足以(5种基本数据结构+bitmap+Geo+HyperLogLog+Streams)
与mysql 的区别
MySQL数据库需要自己去创建数据库,Redis数据库不用自己创建数据库,默认情况下有0-15号数据库
Redis数据库没有表,数据是以key-value键值对的形式存在数据库中
1.对数据库的操作:
select
:选择切换数据库
例如:select 6
dbsize
:查看当前数据库key的数量
flushdb
:清空当前数据库
flushall
:清空所有数据库
2.key键的操作:
keys pattern
:查找所有符合给定模式( pattern)的key
例如:
keys *
:查看当前库中所有的key
type key
:查看这个key的类型
exists key
:判断当前库中是否还有这个key
del key
:删除这个key,如果这个key不存在,则跳过
randomkey
:从当前数据库中随机返回一个 key
dump
:序列化给定的key,并返回序列化的值
例如:dump keyset
输出:
expire key seconds
:给这个已存在的key设置一个过期时间,单位为秒
EXPIREAT key timestamp
:EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)
pexpire key milliseconds
: 设置 key 的过期时间以毫秒计
PEXPIREAT key milliseconds-timestamp
:设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
TTL key
:以秒为单位返回 key 的剩余的过期时间
PTTL key
:以毫秒为单位返回 key 的剩余的过期时间
persist key
:移除key的过期时间,key 将持久保持。
rename key newkey
:把key的名字改为newkey
renamenx key newkey
:仅当 newkey 不存在时,将 key 改名为 newkey
move key db
:将这个key的值移动到db这个数据库中,注意是移动不是复制
例如:move key 12
scan cursor [MATCH pattern] [COUNT count]
分析:
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
例如: scan 0
输出:
SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。 SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。
相关命令:
SSCAN
命令用于迭代集合键中的元素。
HSCAN
命令用于迭代哈希键中的键值对。
ZSCAN
命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
3.五大数据类型的操作:
3.1String: 字符串
SET key value
:设置指定 key 的值
SETNX key value
:只有在 key 不存在时设置 key 的值。
SETEX key seconds value
:将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
PSETEX key milliseconds value
:这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间。
GET key
:获取指定 key 的值
SETRANGE key offset value
:用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始,这里的偏移量为字符串下标。
GETRANGE key start end
:返回 key 中字符串值的子字符
STRLEN key
:返回 key 所储存的字符串值的长度
APPEND key value:
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾
MSET key value [key value ...]
:同时设置一个或多个 key-value 对。
MSETNX key value [key value ...]
:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
MGET key1 [key2..]
:获取所有(一个或多个)给定 key 的值
例如:
127.0.0.1:6379> mget key key1
1) "ysw"
2) "ysw1"
- 1
- 2
- 3
SETBIT key offset value
:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
GETBIT key offset
:对 key 所储存的字符串值,获取指定偏移量上的位(bit)
例如:
127.0.0.1:6379> set key ysw
OK
127.0.0.1:6379> get key
"ysw"
127.0.0.1:6379> getbit key 23
(integer) 1
127.0.0.1:6379> setbit key 23 0
(integer) 1
127.0.0.1:6379> getbit key 23
(integer) 0
127.0.0.1:6379> get key
"ysv"
ps:此时key的值从ysw变成流ysv,ysw在redis中按照ASCII编码进行存储,占三个字节,24bit,偏移量从0到23;
执行了上面的操作,最后一个字节从0101 0111变成了0101 0110,ASCII编码对于的字符即从w变成了v
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
INCR key
:将 key 中储存的数字值增一
INCRBY key increment
:将 key 所储存的值加上给定的增量值(increment)
DECR key
:将 key 中储存的数字值减一
DECRBY key decrement
:key 所储存的值减去给定的减量值(decrement)
3.2Hash: 散列
1.增:
HSET key field value
:将哈希表 key 中的字段 field 的值设为 value
HMSET key field1 value1 [field2 value2 ]
:同时将多个 field-value (域-值)对设置到哈希表 key 中
2.删:
HEXISTS key field
:查看哈希表 key 中,指定的字段是否存在
HDEL key field1 [field2]
:删除一个或多个哈希表字段
3.改:
HSET key field value
:将哈希表 key 中的字段 field 的值设为 value
HSETNX key field value
:只有在字段 field 不存在时,设置哈希表字段的值
4.查
HKEYS key
:获取所有哈希表中的字段
HLEN key
:获取哈希表中字段的数量
HGETALL key
:获取在哈希表中指定 key 的所有字段和值
HGET key field
:获取存储在哈希表中指定字段的值
HMGET key field1 [field2
]:获取所有给定字段的值
HSCAN key cursor [MATCH pattern] [COUNT count]
:迭代哈希表中的键值对
3.3List: 列表
1.增:
LPUSH key value1 [value2]
:将一个或多个值插入到列表头部
RPUSH key value1 [value2]
:在列表中添加一个或多个值
2.删:
LPOP key
:移出并获取列表的第一个元素
RPOP key
:移除列表的最后一个元素,返回值为移除的元素
LREM key count value
:移除列表元素
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
- 1
- 2
- 3
3.改:
LPUSHX key value
:将一个值插入到已存在的列表头部,列表不存在时操作无效
RPUSHX key value
:将一个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效
LTRIM key start stop
:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
4.查:
LLEN key
:获取列表长度
LRANGE key start stop
:获取列表指定范围内的元素
3.4Set: 集合
1.增:
SADD key member1 [member2]
:向集合添加一个或多个成员
2.删:
SPOP key
:移除并返回集合中的一个随机元素
SREM key member1 [member2]
:移除集合中一个或多个成员
3.改:
SMOVE source destination member
:将 member 元素从 source 集合移动到 destination 集合
4.查:
SMEMBERS key
:返回集合中的所有成员
SCARD key
:返回集合中元素的数量
SISMEMBER key member
:判断 member 元素是否是集合 key 的成员
SSCAN key cursor [MATCH pattern] [COUNT count]
:迭代集合中的元素
例如:
127.0.0.1:6379> sadd key 0 1 2 3 4 5 6 7 7
(integer) 8
127.0.0.1:6379> smembers key
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
127.0.0.1:6379> scard key
(integer) 8
127.0.0.1:6379> sismember key 9
(integer) 0
127.0.0.1:6379> sismember key 7
(integer) 1
127.0.0.1:6379> sscan key 0 match *
1) "0"
2) 1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
127.0.0.1:6379> sscan key 0 match 1
1) "0"
2) 1) "1"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
5.并集、交集、差集:
SDIFFSTORE destination key1 [key2]
:返回给定所有集合的差集并存储在 destination 中
SINTERSTORE destination key1 [key2]
:返回给定所有集合的交集并存储在 destination 中
SUNIONSTORE destination key1 [key2]
:所有给定集合的并集存储在 destination 集合中
SDIFF key1 [key2]
:返回第一个集合与其他集合之间的差异
SINTER key1 [key2]
:返回给定所有集合的交集
SUNION key1 [key2]
:返回所有给定集合的并集
例如:
127.0.0.1:6379> sadd key 0 1 2 3 4 5 6 7 7
(integer) 8
127.0.0.1:6379> smembers key
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
127.0.0.1:6379> sadd key1 7 8 9
(integer) 3
127.0.0.1:6379> sdiff key key1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
127.0.0.1:6379> sinter key key1
1) "7"
127.0.0.1:6379> sunion key key1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
9) "8"
10) "9"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
3.5Sorted Set: 有序集合
1.增:
ZADD key score1 member1 [score2 member2]
:向有序集合添加一个或多个成员,或者更新已存在成员的分数
例如:
127.0.0.1:6379> zadd key0 0 member0
(integer) 1
127.0.0.1:6379> zadd key0 1 member1 2 member2 3 member3 4 member
(integer) 4
127.0.0.1:6379> zcard key0
(integer) 5
- 1
- 2
- 3
- 4
- 5
- 6
2.删:
ZREM key member [member ...]
:移除有序集合中的一个或多个成员
ZREMRANGEBYRANK key start stop
:移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max
:移除有序集合中给定的分数区间的所有成员
ZREMRANGEBYLEX key min max
:ZREMRANGEBYLEX 删除名称按字典由低到高排序成员之间所有成员。
不要在成员分数不同的有序集合中使用此命令, 因为它是基于分数一致的有序集合设计的,如果使用,会导致删除的结果不正确。
待删除的有序集合中,分数最好相同,否则删除结果会不正常。
3.改:
ZINCRBY key increment member
:有序集合中对指定成员的分数加上增量 increment
ZINTERSTORE destination numkeys key [key ...]
:计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
4.查:
ZSCORE key member
:返回有序集中,成员的分数值
ZCARD key
:获取有序集合的成员数
例如:
127.0.0.1:6379> zcard key0
(integer) 5
- 1
- 2
ZCOUNT key min max
:分数值在 min 和 max 之间的成员的数量
ZRANGE key start stop [WITHSCORES]
:通过索引区间返回有序集合指定区间内的成员(从小到大)
ZREVRANGEBYSCORE key max min [WITHSCORES]
:返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)
例如:
127.0.0.1:6379> zadd key 10 10 9 9 8 8 7 7 6 6 5 5
(integer) 6
127.0.0.1:6379> zrange key 0 -1
1) "5"
2) "6"
3) "7"
4) "8"
5) "9"
6) "10"
127.0.0.1:6379> zrevrange key 0 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
6) "5"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
:通过分数返回有序集合指定区间内的成员
ZLEXCOUNT key min max
:命令用于计算有序集合中指定成员之间的成员数量
- 成员名称前需要加 [ 符号作为开头, [ 符号与成员之间不能有空格
- 可以使用 - 和 + 表示得分最小值和最大值
- min 和 max 不能反, max 放前面 min放后面会导致返回结果为0
- 计算成员之间的成员数量时,参数 min 和 max 的位置也计算在内。
- min 和 max 参数的含义与 zrangebylex 命令中所描述的相同
ZRANGEBYLEX key min max [LIMIT offset count]
:上面那个是返回数量,这个是返回成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
:通过分数返回有序集合指定区间内的成员
ZRANK key member
:返回有序集合中指定成员的索引
ZREVRANGE key start stop [WITHSCORES]
:返回有序集中指定区间内的成员,通过索引,分数从高到低
在这里插入代码片
- 1
5.并集、交集:
ZINTERSTORE destination numkeys key [key ...]
:计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
ZUNIONSTORE destination numkeys key [key ...]
:计算给定的一个或多个有序集的并集,并存储在新的 key 中
4.新增的几种数据类型
4.1.bitmap
SETBIT
:置位,设置某一位上的值(0或1)
GETBIT
:取值,获取某一位上的值(0或1)
BITCOUNT
:统计为bitmap 中为1的个数
在redis中,存储的字符串都是以二进制的形式存在的。我们可以利用bitmap通过改变字符对应的二进制位的0或1达到对字符串的更改。
比如:
127.0.0.1:6379> set key ysw
OK
127.0.0.1:6379> get key
"ysw"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
上述中的ysw对应的十进制为121、115、119;对应的二进制为:0111 1001、0111 0011、0111 0111,即redis对于字符串ysw底层存储为0111 1001、0111 00
11、0111 0111;我们把其第14位(索引为13)的0改成1,即变成0111 1001、0111 01
11、0111 0111,那么对应的字符串就变为了yww,我们看下是否是这样的效果,如下演示:
127.0.0.1:6379> bitcount key
(integer) 16
127.0.0.1:6379> get key
"ysw"
127.0.0.1:6379> setbit key 13 1
(integer) 0
127.0.0.1:6379> get key
"yww"
127.0.0.1:6379> bitcount key
(integer) 17
127.0.0.1:6379> getbit key 13
(integer) 1
127.0.0.1:6379> bitcount key 0 -1
(integer) 17
127.0.0.1:6379> bitcount key 0 0
(integer) 5
127.0.0.1:6379> bitcount key 0 2
(integer) 17
127.0.0.1:6379> bitcount key 2 2
(integer) 6
127.0.0.1:6379> bitcount key 3 3
(integer) 0
127.0.0.1:6379> bitcount key 2 3
(integer) 6
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
还有一些关于与、或、非、异或操作:
BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数:
BITOP AND destkey srckey1 … srckeyN
,对一个或多个 key 求逻辑与,并将结果保存到 destkey
BITOP OR destkey srckey1 … srckeyN
,对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destkey srckey1 … srckeyN
,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destkey srckey
,对给定 key 求逻辑非,并将结果保存到 destkey
ps:
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入,执行结果将始终保持到destkey里面。
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等。
一些基于 BitMap 的数据结构:
- Bloom Filter ,布隆过滤器,具体参考本人另外一篇博文:https://blog.csdn.net/MrYushiwen/article/details/122493709
- 数据稀疏。又比如要存入(10,8887983,93452134)这三个数据,我们需要建立一个 99999999 长度的 BitMap ,但是实际上只存了3个数据,这时候就有很大的空间浪费,碰到这种问题的话,可以通过引入 Roaring BitMap 来解决。
4.2.GeoHash
4.2.1原理:
-
GeoHash本质上是空间索引的一种方式,其基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码。以GeoHash方式建立空间索引,可以提高对空间poi数据进行经纬度检索的效率。
-
Geohash其实就是将整个地图或者某个分割所得的区域进行一次划分,由于采用的是base32编码方式,即Geohash中的每一个字母或者数字(如wx4g0e中的w)都是由5bits组成(2^5 = 32,base32),这5bits可以有32中不同的组合(0~31),这样我们可以将整个地图区域分为32个区域,通过00000 ~ 11111来标识这32个区域。第一次对地图划分后的情况如下图所示(每个区域中的编号对应于该区域所对应的编码)。
-
Geohash的0、1串序列是经度0、1序列和纬度0、1序列中的数字交替进行排列的,偶数位对应的序列为经度序列,奇数位对应的序列为纬度序列,在进行第一次划分时,Geohash0、1序列中的前5个bits(11100),那么这5bits中有3bits是表示经度,2bits表示纬度,所以第一次划分时,是将经度划分成8个区段(2^3 = 8),将纬度划分为4个区段(2^2 = 4),这样就形成了32个区域。如下图
-
同理,可以按照第一次划分所采用的方式对第一次划分所得的32个区域各自再次划分。
-
但是其存在缺点,如图所示,我们将二进制编码的结果填写到空间中,当将空间划分为四块时候,编码的顺序分别是左下角00,左上角01,右下脚10,右上角11,也就是类似于Z的曲线,当我们递归的将各个块分解成更小的子块时,编码的顺序是自相似的(分形),每一个子快也形成Z曲线,这种类型的曲线被称为Peano空间填充曲线。
-
这种类型的空间填充曲线的优点是将二维空间转换成一维曲线(事实上是分形维),对大部分而言,编码相似的距离也相近,但Peano空间填充曲线最大的缺点就是突变性,有些编码相邻但距离却相差很远,比如0111与1000,编码是相邻的,但距离相差很大。
-
除Peano空间填充曲线外,还有很多空间填充曲线,如图所示,其中效果公认较好是Hilbert空间填充曲线,相较于Peano曲线而言,Hilbert曲线没有较大的突变。但是由于Peano曲线实现更加简单,在使用的时候配合一定的解决手段,可以很好的满足大部分需求,因此TD内部Geohash算法采用的是Peano空间填充曲线。
-
由于GeoHash是将区域划分为一个个规则矩形,并对每个矩形进行编码,这样在查询附近POI信息时会导致以下问题,比如红色的点是我们的位置,绿色的两个点分别是附近的两个餐馆,但是在查询的时候会发现距离较远餐馆的GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆的GeoHash编码与我们不一致。这个问题往往产生在边界处。
以上内容转载自:https://www.jianshu.com/p/1ecf03293b9a
4.2.2用法:
简而言之,这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作。
GEOADD key longitude latitude member [longitude latitude member ...]
:将给定的空间元素(纬度、经度、名字)添加到指定的键里面。 这些数据会以有序集合的形式被储存在键里面, 从而使得像 GEORADIUS 和 GEORADIUSBYMEMBER 这样的命令可以在之后通过位置查询取得这些元素。GEOPOS key member [member ...]
:键里面返回所有给定位置元素的位置(经度和纬度)GEODIST key member1 member2 [unit]
:返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:m 、km 、mi 表示单位为英里、ft 表示单位为英尺(默认为m)GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
:以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。距离单位和上面的一致,其中后面的选项:WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和纬度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试, 实际中的作用并不大。GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
:该命令与 GEORADIUS 完全相同,唯一的区别在于,它不是以查询区域的中心为经度和纬度值,而是采用已存在于有序集合所代表的地理空间索引内的成员的名称,指定成员的位置用作查询的中心。GEOHASH key member [member ...]
:返回表示地理空间索引(使用 GEOADD 添加元素)的排序集值中一个或多个元素位置的有效 Geohash 字符串
127.0.0.1:6379> geoadd key 113.41 29.58 wuhan 113.23 23.16 guangzhou
(integer) 2
127.0.0.1:6379> geopos key wuhan
1) 1) "113.41000109910964966"
2) "29.57999948859571049"
127.0.0.1:6379> geopos key guangzhou
1) 1) "113.22999805212020874"
2) "23.1599994376353493"
127.0.0.1:6379> geodist key wuhan guangzhou km
"714.2977"
127.0.0.1:6379> geodist key wuhan guangzhou m
"714297.7081"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
4.3.HyperLogLog
- Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
- 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
- 但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
- 比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
PFADD key element [element ...]
:添加指定元素到 HyperLogLog 中。
PFCOUNT key [key ...]
:返回给定 HyperLogLog 的基数估算值。
PFMERGE destkey sourcekey [sourcekey ...]
:将多个 HyperLogLog 合并为一个 HyperLogLog
127.0.0.1:6379> pfadd key 0 1 2 3 4 5 5 5 5 6 7
(integer) 1
127.0.0.1:6379> pfadd key1 7 7 7 8 9
(integer) 1
127.0.0.1:6379> pfcount key
(integer) 8
127.0.0.1:6379> pfcount key1
(integer) 3
127.0.0.1:6379> pfmerge key key1
OK
127.0.0.1:6379> pfcount key1
(integer) 3
127.0.0.1:6379> pfcount key
(integer) 10
127.0.0.1:6379> pfmerge key2 key key1
OK
127.0.0.1:6379> pfcount key2
(integer) 10
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
4.4.Stream
- Redis Stream 是 Redis 5.0 版本新增加的数据结构。它和kafka的设计有些类似,可以当作一个简单的消息队列来使用。
- Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
- 而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
相关知识点:
- 消费者组(Consumer Group),可使用
XGROUP CREATE
命令创建,一个消费者组(Consumer Group)中可以存在多个消费者(Consumer),这些消费者(Consumer)之间是竞争关系。- 即同一条消息,只能被这个消费者组(Consumer Group)中的某个消费者(Consumer)获取;last_delivered_id这个id保证了在同一个消费者组中,一个消息只能被一个消费者获取。每当消费者组的某个消费者读取到了这个消息后,这个last_delivered_id的值会往后移动一位,保证消费者不会读取到重复的消息。
- 多个消费者组(Consumer Group)之间是相互独立的,互不干扰。
- pending_ids :消费者(Consumer)的状态变量,作用是维护消费者的未确认的 id。 pending_ids 记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符)。
- 消息内容:是一个键值对的格式。
- Stream 中 消息的 ID: 默认情况下,ID使用 * ,redis可以自动生成一个,格式为 时间戳-序列号,也可以自己指定,一般使用默认生成的即可,且后生成的id号要比之前生成的大。
队列相关操作:
XADD
- 添加消息到末尾,如果指定的队列不存在,则创建一个队列
格式:XADD key ID field value [field value …]- 其中key :队列名称,如果不存在就创建
- ID :消息 id,我们使用 * 表示由 redis 生成,可以自定义,但是要自己保证递增性。
- field value : 记录。
XLEN
- 获取流包含的元素数量,即消息长度XRANGE
- 获取消息列表,会自动过滤已经删除的消息XREVRANGE
- 反向获取消息列表,ID 从大到小
127.0.0.1:6379> xadd ysw0 * name yushiwen age 22 sex m
"1642563063820-0"
127.0.0.1:6379> xadd ysw0 * name xiaocheng age 22 sex f
"1642563072036-0"
127.0.0.1:6379> xlen ysw0
(integer) 2
127.0.0.1:6379> xrange ysw0 - +
1) 1) "1642563063820-0"
2) 1) "name"
2) "yushiwen"
3) "age"
4) "22"
5) "sex"
6) "m"
2) 1) "1642563072036-0"
2) 1) "name"
2) "xiaocheng"
3) "age"
4) "22"
5) "sex"
6) "f"
127.0.0.1:6379> xrevrange ysw0 + -
1) 1) "1642563072036-0"
2) 1) "name"
2) "xiaocheng"
3) "age"
4) "22"
5) "sex"
6) "f"
2) 1) "1642563063820-0"
2) 1) "name"
2) "yushiwen"
3) "age"
4) "22"
5) "sex"
6) "m"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
XREAD
- 以阻塞或非阻塞方式获取消息列表
格式:XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key …] id [id …]- count :数量
- milliseconds :可选,阻塞毫秒数,没有设置就是非阻塞模式
- key :队列名
- id :消息 ID
- XREAD只是读取消息,读取完之后并不会删除消息。 使用XREAD读取消息,是完全独立与消费者组的,多个客户端可以同时读取消息。
127.0.0.1:6379> xread count 2 streams ysw0 0-0
1) 1) "ysw0"
2) 1) 1) "1642563063820-0"
2) 1) "name"
2) "yushiwen"
3) "age"
4) "22"
5) "sex"
6) "m"
2) 1) "1642563072036-0"
2) 1) "name"
2) "xiaocheng"
3) "age"
4) "22"
5) "sex"
6) "f"
127.0.0.1:6379> xread count 1 streams ysw0 0-0
1) 1) "ysw0"
2) 1) 1) "1642563063820-0"
2) 1) "name"
2) "yushiwen"
3) "age"
4) "22"
5) "sex"
6) "m"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
XTRIM
- 对流进行修剪,限制长度
下面的例子的参数为maxlen,表示精确限制,保留最后的1个消息
127.0.0.1:6379> xrange ysw0 - +
1) 1) "1642563063820-0"
2) 1) "name"
2) "yushiwen"
3) "age"
4) "22"
5) "sex"
6) "m"
2) 1) "1642563072036-0"
2) 1) "name"
2) "xiaocheng"
3) "age"
4) "22"
5) "sex"
6) "f"
127.0.0.1:6379> xtrim ysw0 maxlen 1
(integer) 1
127.0.0.1:6379> xrange ysw0 - +
1) 1) "1642563072036-0"
2) 1) "name"
2) "xiaocheng"
3) "age"
4) "22"
5) "sex"
6) "f"
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
XDEL
- 删除消息
需要注意的是,我们从Stream中删除一个消息,这个消息并不是被真正的删除了,而是被标记为删除,这个时候这个消息还是占据着内容空间的。如果所有Stream中所有的消息都被标记删除,这个时候才会回收内存空间。但是这个Stream并不会被删除。
127.0.0.1:6379> xrange ysw0 - +
1) 1) "1642563072036-0"
2) 1) "name"
2) "xiaocheng"
3) "age"
4) "22"
5) "sex"
6) "f"
127.0.0.1:6379> xdel ysw0 1642563072036-0
(integer) 1
127.0.0.1:6379> xrange ysw0 - +
(empty list or set)
127.0.0.1:6379>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
消费者相关操作:
-
XGROUP CREATE
- 创建消费者组
0-0:表示从头开始消费。
$ : 表示从尾部开始消费,只接受新消息,当前 Stream 消息会全部忽略。 -
XREADGROUP GROUP
- 读取消费者组中的消息 -
XACK
- 将消息标记为"已处理" -
XGROUP SETID
- 为消费者组设置新的最后递送消息ID -
XGROUP DELCONSUMER
- 删除消费者 -
XGROUP DESTROY
- 删除消费者组 -
XPENDING
- 显示待处理消息的相关信息 -
XCLAIM
- 转移消息的归属权 -
XINFO
- 查看流和消费者组的相关信息; -
XINFO GROUPS
- 打印消费者组的信息; -
XINFO STREAM
- 打印流信息
文章来源: blog.csdn.net,作者:Mr.Yushiwen,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/MrYushiwen/article/details/122251451
- 点赞
- 收藏
- 关注作者
评论(0)