在上一篇文章中,讲到了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-24之间有多少员工拜访了官网

bitcount user:2020-11-04 1 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准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!