写点什么

Redis 还可以做哪些事?

用户头像
Java旅途
关注
发布于: 2020 年 11 月 03 日

上一篇文章中,讲到了 redis 五大基本数据类型的使用场景,除了 string,hash,list,set,zset 之外,redis 还提供了一些其他的数据结构(当然,严格意义上也不算数据结构),一起来看看 redis 还可以做哪些事?


一 Bitmaps


在计算机中,使用二进制做为信息的基础单元,也就是输入的任何信息,最终在计算机底层都会转会为一串二进制的数字。在 redis 中,提供了 Bitmaps 来进行位操作。我们可以把 Bitmaps 想象成一个以位为单位的数组,数组的下标叫做偏移量。使用 Bitmaps 的优势就是占用空间更少。


假如我们想记录员工今天是否登录过公司官网,我们可以日期做为 key,员工 id 做为偏移量(这里员工 id 在数据库中是自增的),如果 id 是从 1000 开始,为了节省空间,一般会将员工 id 减去这个初始值来做为偏移量,偏移量一般从0开始。是否访问官网用01来表示。


这样的话,id 为3的员工访问了官网,就将他的值写成1


# id为3的员工访问了官网setbit user:2020-11-04 3 1# id为18的员工访问了官网setbit user:2020-11-04 18 1
复制代码


查看某个员工是否访问过官网


getbit user:2020-11-04 1
复制代码


查询指定范围(字节)内值为 1 的个数,比如我想查看 id 从 1-30 之间有多少员工访问了官网


bitcount user:2020-11-04 0 3
复制代码


二 HyperLogLog


HyperLogLog可以利用极小的内存空间完成数据统计,无法获取单条数据,只能做为统计使用,会有一定的误差率。


假如我想统计访问官网的 IP 地址


添加官网今天访问的 ip 列表


# 2020-11-04访问的ippfadd 2020-11-04:ip "ip1" "ip2" "ip3" # 2020-11-05访问的ippfadd 2020-11-05:ip "ip3" "ip4" "ip5" 
复制代码


计算今天官网访问的 ip 数


pfcount 2020-11-04:ip
复制代码


返回结果为 3


查看 2020-11-04 和 2020-11-05 这两天总共有多少个独立 ip 访问过网站


先将两天的数据做并集,并复制给某个值


pfmerge 2020-11:ip 2020-11-04:ip 2020-11-05:ip
复制代码


然后使用 pfcount 命令查询,获得的值为 5


pfcount 2020-11:ip
复制代码


三 GEO


Redis3.2版本中增加了 GEO(地理位置定位)功能,可以使用此功能来获取附近的人。


添加命令如下,可批量添加


geoadd city longitud latitude member
复制代码


我们添加几个城市的位置信息,来获取某个城市附近的城市


geoadd city 116.28 39.55 beijing 117.12 39.08 tianjin
复制代码


获取北京的经纬度命令如下


geopos city beijing
复制代码


查看 beijing 和 tianjin 两座城市的距离


geodist city beijing tianjin km
复制代码


最后面的 km 表示距离单位是公里,支持的单位有以下几个:


  • m,米

  • km,千米

  • mi,英里

  • ft,尺


获取附近的位置有两个命令,georadius根据经纬度获取,georadiusbymember根据成员获取


georadius key longitude laitude [单位]georadiusbymember key member [单位]
复制代码


后面还可以跟非必须参数,参数分别如下


  • withcoord:返回结果中包含经纬度

  • withdist:返回结果中包含距离中心位置的距离

  • withhash:返回结果中包含 geohash(就是将经纬度转换为 hash 值)

  • COUNT count:指定返回结果的数量

  • asc|desc:返回结果按距离中心位置的距离排序

  • store key:将返回结果的地理位置信息保存到指定 key 中

  • storedist key:将返回结果距离中心位置的距离保存到指定 key 中


四 发布订阅模式消息


上一篇文章中讲到了可以使用 list 和 zset 来实现消息队列,但是上面实现的消息队列是点对点模式,也就是一条消息只能由一个消费者来消费。除此之外,redis 还支持发布订阅模式,即一个消息由所有订阅者消费,比如广播、公告等等,发布一条公告后,所有关注了我的用户都可以收到这条公告。


  1. 发布消息


发布到信道 channel:message 一条消息,消息内容为hi


pulish channel:message hi
复制代码


  1. 订阅信道


订阅者可以订阅一个或多个信道,比如订阅 channel:message


subscribe channel:message
复制代码


  1. 取消订阅


unsubscribe channel:message
复制代码


  1. 查看活跃信道


pubsub channels
复制代码


  1. 查看订阅数


查看信道 channel:message 订阅个数


pubsub numsub channel:message
复制代码


redis 的发布订阅模式和专业的消息中间件相比,略显粗糙,但是实现起来非常简单,学习成本较低。


五 Bloom Filter


布隆过滤器是redis4版本中新增的一个功能。其实现原理和 Bitmaps 差不多,也是利用一个位数组,将你的值经过多个 hash 函数,得到对应的位数组的位置,将这些值设置为 1。布隆过滤器经常别用来防止缓存穿透。


存在的问题,如果说某个元素不存在,则一定不存在,如果说某个元素存在,则可能不存在。这是因为如果有三个元素abc要放入同一个数组中去,假设a经过三次 hash,得到 1,5,7 三个位置,那么就会将这三个位置修改成1b经过三次 hash,得到 2,4,6 三个位置,将这三个位置修改成1c经过三次 hash 得到 2,5,7 三个位置,但是经过前两个元素 hash 后,这三个位置已经修改成1了,那么我们能说c一定存在吗?显然不能!




点关注、不迷路


如果觉得文章不错,欢迎关注、*点赞*、收藏,你们的支持是我创作的动力,感谢大家。


如果文章写的有问题,请不要吝惜文笔,欢迎留言指出,我会及时核查修改。


如果你还想更加深入的了解我,可以微信搜索「Java 旅途」进行关注。回复「1024」即可获得学习视频及精美电子书。每天 7:30 准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!


发布于: 2020 年 11 月 03 日阅读数: 766
用户头像

Java旅途

关注

还未添加个人签名 2020.06.17 加入

公众号:Java旅途

评论 (2 条评论)

发布
用户头像
大佬写的真不错
2020 年 11 月 12 日 16:59
回复
哈哈,上一篇也不错
2020 年 12 月 16 日 09:03
回复
没有更多了
Redis还可以做哪些事?