在上一篇文章中,讲到了redis五大基本数据类型的使用场景,除了string,hash,list,set,zset之外,redis还提供了一些其他的数据结构(当然,严格意义上也不算数据结构),一起来看看redis还可以做哪些事?
一 Bitmaps
在计算机中,使用二进制做为信息的基础单元,也就是输入的任何信息,最终在计算机底层都会转会为一串二进制的数字。在redis中,提供了Bitmaps来进行位操作。我们可以把Bitmaps想象成一个以位为单位的数组,数组的下标叫做偏移量。使用Bitmaps的优势就是占用空间更少。
假如我们想记录员工今天是否登录过公司官网,我们可以日期做为key,员工id做为偏移量(这里员工id在数据库中是自增的),如果id是从1000开始,为了节省空间,一般会将员工id减去这个初始值来做为偏移量,偏移量一般从0开始。是否访问官网用0和1来表示。
这样的话,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-24之间有多少员工访问了官网
- bitcount user:2020-11-04 1 3
二 HyperLogLog
HyperLogLog可以利用极小的内存空间完成数据统计,无法获取单条数据,只能做为统计使用,会有一定的误差率。
假如我想统计访问官网的IP地址
添加官网今天访问的ip列表
- # 2020-11-04访问的ip
- pfadd 2020-11-04:ip "ip1" "ip2" "ip3"
- # 2020-11-05访问的ip
- pfadd 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表示距离单位是公里,支持的单位有以下几个:
获取附近的位置有两个命令,georadius根据经纬度获取,georadiusbymember根据成员获取
- georadius key longitude laitude [单位]
- georadiusbymember key member [单位]
后面还可以跟非必须参数,参数分别如下
四 发布订阅模式消息
在上一篇文章中讲到了可以使用list和zset来实现消息队列,但是上面实现的消息队列是点对点模式,也就是一条消息只能由一个消费者来消费。除此之外,redis还支持发布订阅模式,即一个消息由所有订阅者消费,比如广播、公告等等,发布一条公告后,所有关注了我的用户都可以收到这条公告。
1.发布消息
发布到信道channel:message一条消息,消息内容为hi
- pulish channel:message hi
2.订阅信道
订阅者可以订阅一个或多个信道,比如订阅channel:message
- subscribe channel:message
3.取消订阅
- unsubscribe channel:message
4.查看活跃信道
- pubsub channels
5.查看订阅数
查看信道channel:message订阅个数
- pubsub numsub channel:message
redis的发布订阅模式和专业的消息中间件相比,略显粗糙,但是实现起来非常简单,学习成本较低。
五 Bloom Filter
布隆过滤器是redis4版本中新增的一个功能。其实现原理和Bitmaps差不多,也是利用一个位数组,将你的值经过多个hash函数,得到对应的位数组的位置,将这些值设置为1。布隆过滤器经常别用来防止缓存穿透。
存在的问题,如果说某个元素不存在,则一定不存在,如果说某个元素存在,则可能不存在。这是因为如果有三个元素a,b,c要放入同一个数组中去,假设a经过三次hash,得到1,5,7三个位置,那么就会将这三个位置修改成1,b经过三次hash,得到2,4,6三个位置,将这三个位置修改成1。c经过三次hash得到2,5,7三个位置,但是经过前两个元素hash后,这三个位置已经修改成1了,那么我们能说c一定存在吗?显然不能!
本文转载自微信公众号「Java旅途」,可以通过以下二维码关注。转载本文请联系Java旅途公众号。
根据TrendForce的最新调查,自2020年初以来,COVID-19流感大流行加速了世界各地...
2020年11月26日深圳潮数科技于石家庄成功召开数据安全 新时代新基建信息应用之基...
在疫情的影响下,人们的工作和生活方式在过去的一年发生了前所未有的变化。为了...
在VMworld 2020,VMware宣布与NVIDIA进行全面合作,共同推出新一代的混合云架构...
2020年以来,由疫情停工减产所导致的缺芯困局影响着全球汽车发展,而本以为2021...
【51CTO.com快译】数字化转型使应用程序领导人必须找到有效的方法来更新改造遗留...
本文中的五个步骤有助于您掌握转型的总体需求,并有助于您处理一些真正重要的事...
时间真快呀!转眼又至周一。让我们卯足干劲继续前行,先来看看上周有哪些不容错...
根据调查,随着用户对计算能力、存储和网络容量的需求增长,服务器需求比经济不...
人头马君度(Rmy Cointreau)的历史非常重要,这家酒业公司以将最好的酒陈化100年...