在上一篇文章中,讲到了 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 示意间隔单位是公里,反对的单位有以下几个:
- 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 还反对公布订阅模式,即一个音讯由所有订阅者生产,比方播送、布告等等,公布一条布告后,所有关注了我的用户都能够收到这条布告。
- 公布音讯
公布到信道 channel:message 一条音讯,音讯内容为hi
pulish channel:message hi
- 订阅信道
订阅者能够订阅一个或多个信道,比方订阅 channel:message
subscribe channel:message
- 勾销订阅
unsubscribe channel:message
- 查看沉闷信道
pubsub channels
- 查看订阅数
查看信道 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 旅途」进行关注。回复「1024」即可取得学习视频及精美电子书。每天 7:30 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!