Redis 还可以做哪些事?

| 选择喜欢的代码风格  

一、Bitmaps


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

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

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

语法:
SETBIT key offset value
# id为3的员工访问了官网
setbit user:2020-11-04 3 1

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

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

语法:
GETBIT key offset

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

getbit user:2020-11-04 1

查询指定范围(字节)内值为 1 的个数

语法:
BITCOUNT key [start] [end]

比如我想查看 id 从 1-30 之间有多少员工访问了官网

bitcount user:2020-11-04 0 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中

四、发布订阅模式消息


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

发布消息

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

pulish channel:message hi

取消订阅

unsubscribe channel:message

查看活跃信道

pubsub channels

查看订阅数

查看信道 channel:message 订阅个数

pubsub numsub channel:message

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

五、Bloom Filter


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

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

Redis 扩展阅读:




发表评论