Redis5学习笔记之二:Redis数据类型介绍及操作

2. Redis数据类型介绍及操作

2.1 数据基本操作

127.0.0.1:6379> set name bruce	
OK
127.0.0.1:6379> exists name		# 判断key是否存在
(integer) 1
127.0.0.1:6379> move name 1		# 将name移走
(integer) 1
127.0.0.1:6379> expire name 10	# 设置超时时间,单位为秒
(integer) 0
127.0.0.1:6379> ttl name		# 查看生存时间
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name bruce
OK
127.0.0.1:6379> type name		# 查看key的类型
string

2.2 Redis基本数据类型

2.2.1 String类型

命令描述
SET key value 设置指定key的值。
GET key 获取指定key的值。
GETRANGE key start end 返回key中字符串值的子字符
GETSET key value 将给定key的值设为value,并返回key的旧值(old value)。
GETBIT key offset 对key所储存的字符串值,获取指定偏移量上的位(bit)。
MGET key1 [key2..] 获取所有(一个或多个)给定key的值。
SETBIT key offset value 对key所储存的字符串值,设置或清除指定偏移量上的位(bit)。
SETEX key seconds value 将值value关联到key,并将key的过期时间设为seconds (以秒为单位)。
SETNX key 只有在key不存在时设置key的值。
SETRANGE key offset value 用value参数覆写给定key所储存的字符串值,从偏移量offset开始。
STRLEN key 返回key所储存的字符串值的长度。
MSET key value [key value ...] 同时设置一个或多个key-value对。
MSETNX key value [key value ...] 同时设置一个或多个key-value对,当且仅当所有给定key都不存在。
PSETEX key milliseconds value 这个命令和 SETEX 命令相似,但它以毫秒为单位设置key的生存时间,而不是像SETEX命令那样,以秒为单位。
INCR key 将key中储存的数字值增一。
INCRBY key increment 将key所储存的值加上给定的增量值(increment) 。
INCRBYFLOAT key increment 将key所储存的值加上给定的浮点增量值(increment) 。
DECR key 将key中储存的数字值减一。
DECRBY key decrement key 所储存的值减去给定的减量值(decrement) 。
APPEND key value 如果key已经存在并且是一个字符串,APPEND命令将指定的value追加到该key原来值(value)的末尾。如果可以不存在则新建
  1. 值的增加和减少
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views		# 增加1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> decr views		# 减少1
(integer) 1
127.0.0.1:6379> incrby views 10	# 指定增加量
(integer) 11
127.0.0.1:6379> decrby views 5	# 指定减少量
(integer) 6
  1. 字符串的范围(查看和修改)
127.0.0.1:6379> set key1 "hello world"
OK
127.0.0.1:6379> getrange key1 1 3		# 某个范围。
"ell"
127.0.0.1:6379> getrange key1 0 -1		# 所有的字符,从零开始,-1结束
"hello world"
127.0.0.1:6379> set key2 abcdef
OK
127.0.0.1:6379> setrange key2 1 cd		# 替换字符串,这里是从第二个字符开始替换,替换两个,因为后面跟了两个字符
(integer) 6
127.0.0.1:6379> get key2
"acddef"
  1. 键值设置(setex, setnx)
127.0.0.1:6379> setex key3 30 hello		# 设置值的同时设置超时时间
OK
127.0.0.1:6379> ttl key3
(integer) 22
127.0.0.1:6379> setnx key4 redis		# key4不存在时,设置值,在分布式锁中经常用到
(integer) 1
127.0.0.1:6379> setnx key4 mongodb		# key4存在时,返回设置失败
(integer) 0
127.0.0.1:6379> get key4
"redis"
  1. 值的批量操作
(nil)
127.0.0.1:6379> mset key1 123 key2 456 key3 789
OK
127.0.0.1:6379> mget key1 key2 key3
1) "123"
2) "456"
3) "789"
127.0.0.1:6379> msetnx key1 111 key4 222 key5 333	# msetnx是原子性操作,要么都成功,要么都失败
(integer) 0
127.0.0.1:6379> mget key1 key2 key3 key4 key5
1) "123"
2) "456"
3) "789"
4) (nil)
5) (nil)
  1. 先获取再设置,多用于数据更新操作
127.0.0.1:6379> getset db redis		# 获取并设置db
(nil)						# 原来没有值,所以返回空,但是会设置新值
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb
"redis"						# 显示原来的值,并设置新值
127.0.0.1:6379> get db
"mongodb"

2.2.2 list类型

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含232−12^{32}-12321个元素 (4294967295, 每个列表超过40亿个元素)。

在redis里面,list可以用作栈、队列、阻塞队列

  1. 设置及获取值
127.0.0.1:6379> lpush list one		# 将一个值加入到列表的头部
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> llen list		# 查看列表长度
(integer) 3
127.0.0.1:6379> lrange list 0 -1	# 获取列表的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list zero		# 将一个值放入到列表的尾部
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "zero"
127.0.0.1:6379> lindex list 1		# 获取某一个值
"one"
  1. 移除列表中的值
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "zero"
127.0.0.1:6379> lpop list
"three"
127.0.0.1:6379> rpop list
"zero"

指定移除的值

127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
5) "zero"
127.0.0.1:6379> lrem list 1 zero		# 移除1个zero
(integer) 1
127.0.0.1:6379> lrem list 2 three		# 移除2个three,从上往下移除
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
  1. 截取列表中的值
127.0.0.1:6379> rpush mylist bruce1 bruce2 bruce3 bruce4
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "bruce1"
2) "bruce2"
3) "bruce3"
4) "bruce4"
127.0.0.1:6379> ltrim mylist 1 2		# 保留第二个和第三个值
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "bruce2"
2) "bruce3"
  1. 列表间操作
127.0.0.1:6379> rpush mylist1 bruce1 bruce2 bruce3
(integer) 3
127.0.0.1:6379> rpush mylist2 jack1 jack2
(integer) 2
127.0.0.1:6379> rpoplpush mylist1 mylist2		# 弹出mylist1的最后一个值,并放到mylist2的最前面,如果mylist2不存在会先创建,然后放值
"bruce3"
127.0.0.1:6379> lrange mylist2 0 -1
1) "bruce3"
2) "jack1"
3) "jack2"
  1. 通过指定下标来设置某一个值
127.0.0.1:6379> lrange mylist2 0 -1
1) "bruce3"
2) "jack1"
3) "jack2"
127.0.0.1:6379> lset mylist2 1 bruce		# 其实就是更新值操作
OK
127.0.0.1:6379> lrange mylist2 1 1
1) "bruce"
127.0.0.1:6379> lset mylist2 5 bruce5		# 不能设置没有的下标
(error) ERR index out of range
  1. 插入某个值
127.0.0.1:6379> linsert mylist2 before bruce hello		# 在bruce前面插入hello
(integer) 4
127.0.0.1:6379> linsert mylist2 after bruce nice		# 在bruce后面插入nice
(integer) 5
127.0.0.1:6379> lrange mylist2 0 -1
1) "bruce3"
2) "hello"
3) "bruce"
4) "nice"
5) "jack2"

2.2.3 set类型

Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是intset或者hashtable。
Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为232−12^{32}-12321(4294967295,每个集合可存储40多亿个成员)。

  1. 添加和查看set中的值
127.0.0.1:6379> sadd myset bruce1 bruce2 bruce3 
(integer) 3
127.0.0.1:6379> smembers myset
1) "bruce1"
2) "bruce2"
3) "bruce3"
127.0.0.1:6379> sismember myset bruce		# 判断set中是否有某个值,有返回1,没有返回0
(integer) 1
127.0.0.1:6379> sismember myset bruce5
(integer) 0
127.0.0.1:6379> scard myset				# 查看set中的元素个数
(integer) 3
  1. 移除set中的值
127.0.0.1:6379> srem myset bruce1
(integer) 1
127.0.0.1:6379> smembers myset
1) "bruce2"
2) "bruce3"
  1. 随机的从set中取一个值
127.0.0.1:6379> srandmember myset 
"bruce2"
127.0.0.1:6379> srandmember myset 
"bruce3"
  1. 随机的移除一个值
127.0.0.1:6379> smembers myset
1) "bruce5"
2) "bruce4"
3) "bruce1"
4) "bruce2"
5) "bruce3"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> spop myset
"bruce2"
  1. 移动指定的值到另一个set
127.0.0.1:6379> sadd myset1 bruce1 bruce2
(integer) 2
127.0.0.1:6379> sadd myset2 test1 test2
(integer) 2
127.0.0.1:6379> smove myset1 myset3 bruce1		# 没有这个set则先创建,再移动
(integer) 1
127.0.0.1:6379> smembers myset2
1) "test1"
2) "test2"
127.0.0.1:6379> smembers myset3
1) "bruce1"
127.0.0.1:6379> smove myset1 myset2 bruce2
(integer) 1
127.0.0.1:6379> smembers myset2
1) "bruce2"
2) "test1"
3) "test2"
  1. set和set之间的关系
127.0.0.1:6379> sadd set1 a b c d
(integer) 4
127.0.0.1:6379> sadd set2 c d e f
(integer) 4
127.0.0.1:6379> sdiff set1 set2			# 比较set2和set1的差集,set1是参照物
1) "a"
2) "b"
127.0.0.1:6379> sinter set1 set2		# 找set2和set1的交集
1) "c"
2) "d"
127.0.0.1:6379> sunion set1 set2		# 找set1和set2的并集
1) "e"
2) "c"
3) "d"
4) "a"
5) "b"
6) "f"

2.2.4 hash类型

Redis hash是一个string类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。

  1. 设置和获取值
127.0.0.1:6379> hset myhash field1 hello
(integer) 1
127.0.0.1:6379> hget myhash field1
"hello"
127.0.0.1:6379> hmset myhash field1 bruce field2 lee		# 批量设置
OK
127.0.0.1:6379> hmget myhash field1 field2			# 批量获取
1) "bruce"
2) "lee"
127.0.0.1:6379> hgetall myhash				# 获取所有
1) "field1"
2) "bruce"
3) "field2"
4) "lee"
127.0.0.1:6379> hkeys myhash					# 只获取key
1) "field1"
127.0.0.1:6379> hvals myhash					# 只获取值
1) "bruce"
127.0.0.1:6379> hsetnx myhash field4 bruce			# 不存在则设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 lee			# 存在则设置失败
(integer) 0

  1. 删除值
127.0.0.1:6379> hdel myhash field2
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "bruce"
  1. 获取数据的长度
127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> hdel myhash field2
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "bruce"
127.0.0.1:6379> hlen myhash
(integer) 1
  1. 判断
127.0.0.1:6379> hexists myhash field1		# 判断指定的值是否存在,存在返回1,不存在返回0
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0
  1. 数字操作
127.0.0.1:6379> hset myhash field3 10
(integer) 1
127.0.0.1:6379> hincrby myhash field3 2
(integer) 12
127.0.0.1:6379> hincrby myhash field3 -3
(integer) 9
127.0.0.1:6379> hincrby myhash field1 2	# 不是数字类型不能做加减操作
(error) ERR hash value is not an integer
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "bruce"
3) "field3"
4) "9"

hash类型主要用于保存变更数据,尤其是用户信息的保存

2.2.5 sorted set数据类型

Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。

  1. 设置和获取值
127.0.0.1:6379> zadd myset 1 bruce1
(integer) 1
127.0.0.1:6379> zadd myset 2 bruce2 3 bruce3
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "bruce1"
2) "bruce2"
3) "bruce3"
127.0.0.1:6379> zcard salary				# 获取集合中值的数量
(integer) 2
  1. 排序
127.0.0.1:6379> zadd salary 1000 bruce 2000 jack 1500 lily
(integer) 3
127.0.0.1:6379> zrangebyscore salary -inf +inf			# 从小到大排序,inf代表无穷大
1) "bruce"
2) "lily"
3) "jack"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores	# 排序时带值
1) "bruce"
2) "1000"
3) "lily"
4) "1500"
5) "jack"
6) "2000"
127.0.0.1:6379> zrangebyscore salary -inf 1500 withscores	
1) "bruce"
2) "1000"
3) "lily"
4) "1500"
127.0.0.1:6379> zrevrangebyscore salary inf -inf withscores	# 倒序排列
1) "jack"
2) "2000"
3) "lily"
4) "1500"
5) "bruce"
6) "1000"
  1. 移除元素
127.0.0.1:6379> zrange salary 0 -1
1) "bruce"
2) "lily"
3) "jack"
127.0.0.1:6379> zrem salary jack
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "bruce"
2) "lily"
  1. 统计区间值
127.0.0.1:6379> zrevrangebyscore salary inf -inf withscores
1) "lily"
2) "1500"
3) "bruce"
4) "1000"
127.0.0.1:6379> zcount salary 900 1000
(integer) 1

2.3 特殊数据类型

2.3.1 geospatial地理位置

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。
该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引:

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。
  • 当坐标位置超出上述指定范围时,该命令将会返回一个错误。

sorted set使用一种称为Geohash的技术进行填充。经度和纬度的位是交错的,以形成一个独特的52位整数. 我们知道,一个sorted set 的double score可以代表一个52位的整数,而不会失去精度。
这种格式允许半径查询检查的1 + 8个领域需要覆盖整个半径,并丢弃元素以外的半径。通过计算该区域的范围,通过计算所涵盖的范围,从不太重要的部分的排序集的得分,并计算得分范围为每个区域的sorted set中的查询。

  1. geoadd

geoadd用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的key中。

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai 106.50 29.53 chongqing 114.05 22.52 shenzheng
(integer) 3
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
  1. geopos

geopos用于从给定的key里返回所有指定名称(member)的位置(经度和纬度),不存在的返回nil。

127.0.0.1:6379> geopos china:city chongqing
1) 1) "106.49999767541885376"
   2) "29.52999957900659211"
127.0.0.1:6379> geopos china:city beijing shanghai
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "121.47000163793563843"
   2) "31.22999903975783553"
  1. geodist

geodist用于返回两个给定位置之间的距离。
member1member2为两个地理位置。
最后一个距离单位参数说明:

  • m:米,默认单位。
  • km:千米。
  • mi:英里。
  • ft:英尺。
127.0.0.1:6379> geodist china:city beijing shanghai
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
  1. georadius、georadiusbymember

georadius以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。
georadiusbymember和GEORADIUS命令一样,都可以找出位于指定范围内的元素,但是georadiusbymember的中心点是由给定的位置元素决定的,而不是使用经度和纬度来决定中心点。

参数说明:

  • m:米,默认单位。
  • km:千米。
  • mi:英里。
  • ft:英尺。
  • WITHDIST:在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。
  • WITHCOORD:将位置元素的经度和纬度也一并返回。
  • WITHHASH:以52位有符号整数的形式,返回位置元素经过原始geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。
  • COUNT:限定返回的记录数。
  • ASC:查找结果根据距离从近到远排序。
  • DESC:查找结果根据从远到近排序。
127.0.0.1:6379> georadius china:city 110 30 1000 km				# 以110 30的经纬度,寻找1000km内的城市
1) "chongqing"
2) "xian"
3) "shenzheng"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist			# 带经纬度
1) 1) "chongqing"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord	# 带距离
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> georadiusbymember china:city chongqing 1000 km withcoord
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
  1. geohash

Redis GEO使用geohash来保存地理位置的坐标。
geohash用于获取一个或多个位置元素的geohash值。

127.0.0.1:6379> geohash china:city xian hangzhou
1) "wqj6zky6bn0"
2) "wtmkn31bfb0"

geospatial类型归根结底还是有序集合,因此可以使用相关的命令来操作

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"

2.3.2 hyperloglog基数统计

Redis在2.8.9版本添加了HyperLogLog结构。
Redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、并且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2642^{64}264个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。

什么是基数?
比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数。

应用
网页的UV:一个人访问一个网站多次,但是还是算作一个人
传统的方式,set保存用户的ID,然后就可以统计set中的元素个数作为标准判断,这个方式如果保存大量的用户ID,就会比较麻烦,我们的目的是为了计数,而不是保存用户ID。

127.0.0.1:6379> pfadd mykey1 a b c d e f g
(integer) 1
127.0.0.1:6379> pfcount mykey1
(integer) 7
127.0.0.1:6379> pfadd mykey2 a b c d e h i j
(integer) 1
127.0.0.1:6379> pfcount mykey1
(integer) 7
127.0.0.1:6379> pfmerge mykey3 mykey1 mykey2
OK
127.0.0.1:6379> pfcount mykey3
(integer) 10

2.3.3 bitmap位图

通过操作二级制位来进行记录,只有0和1两种状态

位存储

应用场景:统计用户信息(活跃和不活跃),登陆记录,打卡记录

  • 应用:记录一周的打卡
127.0.0.1:6379> setbit sign 0 1		# 设置打卡记录,1为打卡
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
127.0.0.1:6379> getbit sign 6		# 查看打卡记录
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0
127.0.0.1:6379> bitcount sign		# 统计打卡记录
(integer) 3

2.3.4 Stream

Redis Stream是Redis5.0版本新增加的数据结构。
Redis Stream主要用于消息队列(MQ,Message Queue),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。
简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息。
而Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
Redis Stream的结构如下所示,它有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的ID和对应的内容:

在这里插入图片描述

每个Stream都有唯一的名称,它就是Redis的key,在我们首次使用xadd指令追加消息时自动创建。

上图解析:

  • Consumer Group:消费组,使用XGROUPCREATE命令创建,一个消费组有多个消费者(Consumer)。
  • last_delivered_id:游标,每个消费组会有个游标last_delivered_id,任意一个消费者读取了消息都会使游标last_delivered_id往前移动。
  • pending_ids:消费者(Consumer)的状态变量,作用是维护消费者的未确认的id。pending_ids记录了当前已经被客户端读取的消息,但是还没有ack(Acknowledge character:确认字符)。

消息队列相关命令:

  • XADD-添加消息到末尾
  • XTRIM-对流进行修剪,限制长度
  • XDEL-删除消息
  • XLEN-获取流包含的元素数量,即消息长度
  • XRANGE-获取消息列表,会自动过滤已经删除的消息
  • XREVRANGE-反向获取消息列表,ID从大到小
  • XREAD-以阻塞或非阻塞方式获取消息列表

消费者组相关命令:

  • XGROUPCREATE-创建消费者组
  • XREADGROUPGROUP-读取消费者组中的消息
  • XACK-将消息标记为"已处理"
  • XGROUPSETID-为消费者组设置新的最后递送消息ID
  • XGROUPDELCONSUMER-删除消费者
  • XGROUPDESTROY-删除消费者组
  • XPENDING-显示待处理消息的相关信息
  • XCLAIM-转移消息的归属权
  • XINFO-查看流和消费者组的相关信息;
  • XINFOGROUPS-打印消费者组的信息;
  • XINFOSTREAM-打印流信息
  1. XADD

使用XADD向队列添加消息,如果指定的队列不存在,则创建一个队列.

  • key:队列名称,如果不存在就创建
  • ID:消息id,我们使用*表示由redis生成,可以自定义,但是要自己保证递增性。
  • fieldvalue:记录。
redis> XADD mystream * name Sara surname OConnor
"1601372323627-0"
redis> XADD mystream * field1 value1 field2 value2 field3 value3
"1601372323627-1"
redis> XLEN mystream
(integer) 2
redis> XRANGE mystream - +
1) 1) "1601372323627-0"
   2) 1) "name"
      2) "Sara"
      3) "surname"
      4) "OConnor"
2) 1) "1601372323627-1"
   2) 1) "field1"
      2) "value1"
      3) "field2"
      4) "value2"
      5) "field3"
      6) "value3"
redis>
  1. XTRIM

使用XTRIM对流进行修剪,限制长度

  • key:队列名称
  • MAXLEN:长度
  • count:数量
127.0.0.1:6379> XADD mystream * field1 A field2 B field3 C field4 D
"1601372434568-0"
127.0.0.1:6379> XTRIM mystream MAXLEN 2
(integer) 0
127.0.0.1:6379> XRANGE mystream - +
1) 1) "1601372434568-0"
   2) 1) "field1"
      2) "A"
      3) "field2"
      4) "B"
      5) "field3"
      6) "C"
      7) "field4"
      8) "D"
127.0.0.1:6379>
  1. XDEL

使用XDEL删除消息

> XADD mystream * a 1
1538561698944-0
> XADD mystream * b 2
1538561700640-0
> XADD mystream * c 3
1538561701744-0
> XDEL mystream 1538561700640-0
(integer) 1
127.0.0.1:6379> XRANGE mystream - +
1) 1) 1538561698944-0
   2) 1) "a"
      2) "1"
2) 1) 1538561701744-0
   2) 1) "c"
      2) "3"
  1. XLEN

使用XLEN获取流包含的元素数量,即消息长度

redis> XADD mystream * item 1
"1601372563177-0"
redis> XADD mystream * item 2
"1601372563178-0"
redis> XADD mystream * item 3
"1601372563178-1"
redis> XLEN mystream
(integer) 3
  1. XRANGE

使用XRANGE获取消息列表,会自动过滤已经删除的消息

  • key:队列名
  • start:开始值,-表示最小值
  • end:结束值,+表示最大值
  • count:数量
redis> XADD writers * name Virginia surname Woolf
"1601372577811-0"
redis> XADD writers * name Jane surname Austen
"1601372577811-1"
redis> XADD writers * name Toni surname Morrison
"1601372577811-2"
redis> XADD writers * name Agatha surname Christie
"1601372577812-0"
redis> XADD writers * name Ngozi surname Adichie
"1601372577812-1"
redis> XLEN writers
(integer) 5
redis> XRANGE writers - + COUNT 2
1) 1) "1601372577811-0"
   2) 1) "name"
      2) "Virginia"
      3) "surname"
      4) "Woolf"
2) 1) "1601372577811-1"
   2) 1) "name"
      2) "Jane"
      3) "surname"
      4) "Austen"
  1. XREVRANGE

使用XREVRANGE获取消息列表,会自动过滤已经删除的消息

  • key:队列名
  • end:结束值,+表示最大值
  • start:开始值,-表示最小值
  • count:数量
redis> XADD writers * name Virginia surname Woolf
"1601372731458-0"
redis> XADD writers * name Jane surname Austen
"1601372731459-0"
redis> XADD writers * name Toni surname Morrison
"1601372731459-1"
redis> XADD writers * name Agatha surname Christie
"1601372731459-2"
redis> XADD writers * name Ngozi surname Adichie
"1601372731459-3"
redis> XLEN writers
(integer) 5
redis> XREVRANGE writers + - COUNT 1
1) 1) "1601372731459-3"
   2) 1) "name"
      2) "Ngozi"
      3) "surname"
      4) "Adichie"
  1. XREAD

使用XREAD以阻塞或非阻塞方式获取消息列表

  • count:数量
  • milliseconds:可选,阻塞毫秒数,没有设置就是非阻塞模式
  • key:队列名
  • id:消息ID
# 从 Stream 头部读取两条消息
> XREAD COUNT 2 STREAMS mystream writers 0-0 0-0
1) 1) "mystream"
   2) 1) 1) 1526984818136-0
         2) 1) "duration"
            2) "1532"
            3) "event-id"
            4) "5"
            5) "user-id"
            6) "7782813"
      2) 1) 1526999352406-0
         2) 1) "duration"
            2) "812"
            3) "event-id"
            4) "9"
            5) "user-id"
            6) "388234"
2) 1) "writers"
   2) 1) 1) 1526985676425-0
         2) 1) "name"
            2) "Virginia"
            3) "surname"
            4) "Woolf"
      2) 1) 1526985685298-0
         2) 1) "name"
            2) "Jane"
            3) "surname"
            4) "Austen"
  1. XGROUP CREATE

使用XGROUP CREATE创建消费者组,语法格式:

XGROUP [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]
  • key:队列名称,如果不存在就创建
  • groupname:组名。
  • $:表示从尾部开始消费,只接受新消息,当前Stream消息会全部忽略。

从头开始消费:

XGROUP CREATE mystream consumer-group-name 0-0  

从尾部开始消费:

XGROUP CREATE mystream consumer-group-name $
  1. XREADGROUP GROUP

使用XREADGROUP GROUP读取消费组中的消息,语法格式:

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]
  • group:消费组名
  • consumer:消费者名。
  • count:读取数量。
  • milliseconds:阻塞毫秒数。
  • key:队列名。
  • ID:消息ID。
XREADGROUP GROUP consumer-group-name consumer-name COUNT 1 STREAMS mystream >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-风中叮铃-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值