关于后端:Redis还可以做哪些事

41次阅读

共计 2500 个字符,预计需要花费 7 分钟才能阅读完成。

在上一篇文章中,讲到了 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 拜访的 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 还反对公布订阅模式,即一个音讯由所有订阅者生产,比方播送、布告等等,公布一条布告后,所有关注了我的用户都能够收到这条布告。

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

正文完
 0