04-redis发布与订阅与新数据类型

什么是发布和订阅

 

目录

什么是发布和订阅

发布订阅命令行实现

Redis6新数据类型

一、Bitmaps

二、HyperLogLog

三、Geospatial


Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub) 发送消息,订阅者(sub)接收消息。
Redis客户端可以订阅任意数量的频道。


发布订阅命令行实现

1.打开一个客户端订阅channel1
SUBSCRIBE channel1

2.打开另一个客户端,给channel1发布消息hello
publish channel1 hellos

注:发布的消息没有持久化,如果在订阅的客户端收不到hello ,只能收到订阅后发布的消息

Redis6新数据类型

一、Bitmaps


合理地使用操作位能够有效地提高内存使用率和开发效率。Redis提供了Bitmaps这个“数据类型”可以实现对位的操作
(1)  Bitmaps本身不是一种数据类型 ,实际上它就是字符串( key-value )但是它可以对字符串的位进行操作。
(2) Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把 Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量
 

setbit <key> <offset> <value>        设置Bitmaps中某个偏移量的值(0或1 )


实例
每个独立用户是否访问过网站存放在Bitrmaps 中,将访问的用户记做1,没有访问的用户记做0,用偏移量作为用户的id。


getbit <key> <offset>        获取Bitmaps中某个偏移量的值

bitcount
统计字符串被设置为1的bit数。一般情况下,给定的整个字符串都会被进行计数,通
过指定额外的start 或end参数,可以让计数只在特定的位上进行。start 和end
参数.
的设置,都可以使用负数值:比如-1 表示最后一个位, 而-2 表示倒数第二个位,
start、end 指bit组的字节的下标数,二者皆包含。。

举例:

bitcount K1 1 3 : 统计下标1、2字节组中bit=1的个数,即01000000 00000000
001000014
--》bitcount K1 1 3
--》3

bitcount K1 0 -2:统计下标0到下标倒数第2,字节组中bit=1的个数,即
01000001 01000000 00000000
--》bitcount K1 0 -2
-->3。

注意: redis的setbit设置或清除的是bit位置,而bitcount计算的是byte位置。。
 


bitop and(or/not/xor) <destkey>[ ke...
计算出两天都访问过网站的用户数量
bitop and unique:users:and:20201104 _03
unique:users:20201103 unique:users:20201 104

Bitmaps与set对比

二、HyperLogLog

解决基数问题
在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV( PageView页面访问量) ,可以使用Redis的incr. incrby 轻松实现。但像UV ( UniqueVisitor ,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。
解决基数问题有很多种方案: 
( 1 )数据存储在MySQL表中,使用distinct count计算不重复个数。
( 2 )使用Redis提供的hash、set、bitmaps等数据结构来处理.
以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。
能否能够降低一定的精度来平衡存储空间? Redis推出了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 中
将所有元愫添加到指定HyperLogLog数据结构中。如果执行命令后HLL估计的
近似基数发生变化,则返回1 ,否则返回0。。

pfcount<key> [key ..        计算HLL的近似基数,可以计算多个HLL ,比如用HLL存储每天的UV,计算--周的UV可以使用7天的UV合并计算即可,

pfmerge<destkey> <sourcekey> [sourcekey ..        将-个或多 个HLL合并后的结果存储在另一个HLL中,比如每月活跃用户可以使用每天的活跃用户来合并计算可得

三、Geospatial

针对地理信息、经纬度操作

geoadd<key> < longitude> <latitude> <member> [longitude latitude member..]

添加地理位置(经度,纬度,名称)。
 

两极无法直接添加, -般会下载城市数据,直接通过Java程序-次性导入。 有效的经度从-180 度到180 度。有效的纬度从-85.05112878 度到85.05112878度。
当坐标位置超出指定范围时,该命令将会返回一个错误。已经添加的数据,是无法再次往里面添加的。

geopos <key> <member> 

获取地理位置

geodist <key> <member1> <member2> [m|km|ft|mi ]

获取两个位置 之间的直线距离

单位:

  • m表示单位为米[默认值]
  • km表示单位为千米
  • mi表示单位为英里
  • ft表示单位为英尺

如果用户没有显式地指定单位参数,那么GEODIST默认使用米作为单位


georadius<key>< longitude> <latitude>radius m|km|ft|mi

以给定的经纬度为中心找出某一半径内的元素。
 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZuckD

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

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

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

打赏作者

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

抵扣说明:

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

余额充值