Redis -- 消息流、地理空间、HyperLogLog、位图、位域

消息流stream

消息流stream是是 Redis 5.0 版本引入的一种数据结构,用于处理消息流和事件数据

使用 xadd 向stream中添加消息,返回值为消息的ID,stream中的ID将会是递增的

使用 xlen 查看stream中消息的数量

使用 xrange 查看strem中消息的详细信息

使用 xdel 删除指定ID的消息,也可以使用 xtrim 来删除消息

使用 xread 来读取消息

使用 xgroup create 创建消费者组,使用 xgroup createconsumer 来添加消费者,使用 xgroup destroy 删除消费者组,使用 xgroup delconsumer 删除消费者

使用 xinfo groups 查看消费者组的信息

使用 xreadgroup 来消费消息

如果redis版本不足5.0,没有stream,那么就要升级,也可以在docker中启动版本在5.0或以上的redis容器,参考https://blog.csdn.net/qq_45742976/article/details/132128999?spm=1001.2014.3001.5501

# 使用*表示随机产生ID,但系统会自动保持这个ID是递增的
127.0.0.1:6379> xadd my_stream * course math
"1694834220368-0"
127.0.0.1:6379> xadd my_stream * course english
"1694834225564-0"
# 查看stream长度(消息个数)
127.0.0.1:6379> xlen my_stream
(integer) 2
# 所有消息的信息
# - 表示最早的消息,+ 表示最新的消息
127.0.0.1:6379> xrange my_stream - +
1) 1) "1694834220368-0"
   2) 1) "course"
      2) "math"
2) 1) "1694834225564-0"
   2) 1) "course"
      2) "english"
# 删除消息
127.0.0.1:6379> xdel my_stream 1694834220368-0
(integer) 1
127.0.0.1:6379> xrange my_stream - +
1) 1) "1694834225564-0"
   2) 1) "course"
      2) "english"
127.0.0.1:6379> xtrim my_stream maxlen 0
(integer) 1
127.0.0.1:6379> xrange my_stream - +
(empty array)
# 自定义ID,但必须手动保持这个ID是递增的
127.0.0.1:6379> xadd mystream 1-0 course redis
"1-0"
127.0.0.1:6379> xadd mystream 2-0 course mysql
"2-0"
# count 10 表示最多列出10条消息
127.0.0.1:6379> xrange mystream - + count 10
1) 1) "1-0"
   2) 1) "course"
      2) "redis"
2) 1) "2-0"
   2) 1) "course"
      2) "mysql"
# 一次读取1条消息,block 1000 表示如果没有消息的话就阻塞1000ms,streams后加上消息流的名称,1表示从下标为1的位置开始读取
127.0.0.1:6379> xread count 1 block 1000 streams mystream 1
1) 1) "mystream"
   2) 1) 1) "2-0"
         2) 1) "course"
            2) "mysql"
# 创建的消费者组的key必须与已存在的stream相关联
127.0.0.1:6379> xgroup create mystream person 0
OK
# 往消费者组里添加消费者
127.0.0.1:6379> xgroup createconsumer mystream person chen
(integer) 1
127.0.0.1:6379> xgroup createconsumer mystream person wang
(integer) 1
127.0.0.1:6379> xgroup createconsumer mystream person li
(integer) 1
# 查看消费者组的信息
127.0.0.1:6379> xinfo groups mystream
1) 1) "name"
   2) "person"
   3) "consumers"
   4) (integer) 3
   5) "pending"
   6) (integer) 0
   7) "last-delivered-id"
   8) "0-0"
# > 表示从这个消息中读取最新的消息
127.0.0.1:6379> xreadgroup group person chen count 2 block 3000 streams mystream >
1) 1) "mystream"
   2) 1) 1) "1-0"
         2) 1) "course"
            2) "redis"
      2) 1) "2-0"
         2) 1) "course"
            2) "mysql"

地理空间geospatial

geospatial是Redis3.2版本中的新特性,他提供了一种存储地理位置信息的数据结构,同时支持对地理位置进行各种计算操作

地理空间数据通常包括地理坐标(经度和纬度),允许存储和查询位置信息

Redis 使用有序集合(Sorted Set)来存储地理位置数据,每个成员都有一个相关的地理坐标

使用 geoadd 为有序集合中添加一个带有位置信息的成员

使用 geopos 获取成员的位置信息

使用 geodist 计算两个位置之间的距离,返回的值是两个位置之间的直线距离,默认单位是米

使用 georadiusgeoradiusbymember 搜指定范围内的成员

# 创建city里的成员beijing,并添加位置信息
127.0.0.1:6379> geoadd city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> geoadd city 121.472664 31.231706 shanghai
(integer) 1
# 获取beijing的位置信息
127.0.0.1:6379> geopos city beijing
1) 1) "116.40528291463851929"
   2) "39.9049884229125027"
# beijing和shanghai之间的直线距离
127.0.0.1:6379> geodist city beijing shanghai
"1067598.5887"
# 获取以shanghai为中心,半径为300km的圆内的位置信息
127.0.0.1:6379> georadiusbymember city shanghai 300 km
1) "shanghai"
127.0.0.1:6379> georadiusbymember city shanghai 2000 km
1) "shanghai"
2) "beijing"
127.0.0.1:6379> 

HyperLogLog

HyperLogLog(简称 HLL)是一种概率性数据结构,用于估算一个集合中不同元素的基数(cardinality),也就是集合中的唯一元素数量,而不需要将所有元素存储在内存中。

优点就是内存小,但精确度不高

它通常用于处理大规模数据集合的基数估计问题,例如统计网站的独立访问者数量、大规模事件日志的不同事件类型数量等

HyperLogLog 的核心思想是通过哈希函数将集合中的元素映射到一个固定大小的位数组(通常是 2^k 个位,k 是一个可配置的参数),然后通过统计位数组中前导零的数量(位数组Bit Array中从左向右数的连续零位的数量)应用不同的估算函数来估算基数。前导零的数量越多,基数估计的准确性越高。

使用 pfadd 添加一个元素

使用 pfcount 来查看基数

使用 pfmerge 合并多个HyperLogLog

127.0.0.1:6379> pfadd course git docker redis
(integer) 1
127.0.0.1:6379> pfcount course
(integer) 3
127.0.0.1:6379> pfadd course git 
(integer) 0
127.0.0.1:6379> pfadd course1 mysql
(integer) 1
# 合并course和course1,结果放在res中
127.0.0.1:6379> pfmerge res course course1
OK
127.0.0.1:6379> pfcount res
(integer) 4

位图bitmap

位图是字符串类型的扩展,可以使用一个string类型来模拟一个bit数组,数组的下标就是偏移量,只有0和1,也支持一些位运算

位图可以用来表示状态、计数、布隆过滤器等信息

使用 setbit 来设置某个偏移量的值为0或1

使用 getbit 获取位图中某个偏移量的值

可以使用 set 命令一次性设置多个位的值,可以使用16进制来表示二进制的数

使用 bitcount 命令来统计指定key(或key的某个范围)的值里有多少个bit是1

使用 bitpos 来获取指定key(或key的某个范围)里面第一个出现的0或1的位置

# 将键ch中的位0设置为0
127.0.0.1:6379> setbit ch 0 0
(integer) 0
# 将键ch中的位1设置为1
127.0.0.1:6379> setbit ch 1 1
(integer) 0
127.0.0.1:6379> getbit ch 0
(integer) 0
127.0.0.1:6379> getbit ch 1
(integer) 1
# 将键ch的值设置为十六进制字符 \xF0,对应二进制为 11110000
127.0.0.1:6379> set ch "\xF0"
OK
127.0.0.1:6379> getbit ch 0
(integer) 1
127.0.0.1:6379> getbit ch 4
(integer) 0
127.0.0.1:6379> bitcount ch
(integer) 4
127.0.0.1:6379> bitpos ch 0
(integer) 4

在 Redis 中,不同数据类型的键之间是不兼容的,不能在相同的键名上存储不同数据类型的值。如果尝试在一个键上存储一个数据类型的值,然后再尝试将另一种数据类型的值存储在相同的键上,Redis 会覆盖前一个值,并将其替换为新值,从而导致数据丢失

位域bitfiled

位域能够将很多小整数存到一个较大的位图中,这样就可以高效的使用内存

可以使用位域来读取、设置、翻转、计数和其他操作一组位,而无需多次执行单个位的操作

位域命令是 BITFIELD

使用 set 子命令来设置位域中的位值

使用 get 子命令来获取位域中的位值

使用 incrby 子命令来修改位域中的值

# 在名为player_1的位域中,将偏移量为0处的8位设置为1,u8表示8位无符号整数
# 这表示将player_1的第一个字节的第一个位设置为1
127.0.0.1:6379> bitfield player_1 set u8 #0 1
1) (integer) 0
# 获取player_1的值,结果是二进制 00000001 的表示
127.0.0.1:6379> get player_1
"\x01"
127.0.0.1:6379> bitfield player_1 get u8 #0
1) (integer) 1
# 在player_1中的偏移量1处设置一个32位无符号整数,值为 100
127.0.0.1:6379> bitfield player_1 set u32 #1 100
1) (integer) 0
127.0.0.1:6379> get player_1
"\x01\x00\x00\x00\x00\x00\x00d"
127.0.0.1:6379> bitfield player_1 get u32 #1
1) (integer) 100
# 在player_1中的偏移量1处对32位整数执行增量操作,增加200
127.0.0.1:6379> bitfield player_1 incrby u32 #1 200
1) (integer) 300
127.0.0.1:6379> bitfield player_1 get u32 #1
1) (integer) 300

"\x01\x00\x00\x00\x00\x00\x00d" 是一个十六进制字符串的表示,它表示一个包含二进制数据的字符串。每个字符都对应一个字节,因此该字符串共包含 8 个字节(64 位),每个字节由两个十六进制数字表示。

以下是该字符串中每个字节的解释:

\x01:二进制表示为 00000001,表示第一个字节的值为 1。
\x00:二进制表示为 00000000,表示第二个字节的值为 0。
\x00:二进制表示为 00000000,表示第三个字节的值为 0。
\x00:二进制表示为 00000000,表示第四个字节的值为 0。
\x00:二进制表示为 00000000,表示第五个字节的值为 0。
\x00:二进制表示为 00000000,表示第六个字节的值为 0。
\x00:二进制表示为 00000000,表示第七个字节的值为 0。
d:这是 ASCII 字符,二进制表示为 01100100,表示第八个字节的值为 100。

这个字符串的二进制表示为 00000001 00000000 00000000 00000000 00000000 00000000 00000000 01100100

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值