Redis还可以做哪些事?

存储 存储软件 Redis
讲到了redis五大基本数据类型的使用场景,除了string,hash,list,set,zset之外,redis还提供了一些其他的数据结构(当然,严格意义上也不算数据结构),一起来看看redis还可以做哪些事?

[[350258]]

 在上一篇文章中,讲到了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

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

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

  1. getbit user:2020-11-04 1 

查询指定范围(字节)内值为1的个数,比如我想查看id从1-24之间有多少员工访问了官网

  1. bitcount user:2020-11-04 1 3 

二 HyperLogLog

HyperLogLog可以利用极小的内存空间完成数据统计,无法获取单条数据,只能做为统计使用,会有一定的误差率。

假如我想统计访问官网的IP地址

添加官网今天访问的ip列表

  1. # 2020-11-04访问的ip 
  2. pfadd 2020-11-04:ip "ip1" "ip2" "ip3"  
  3. # 2020-11-05访问的ip 
  4. pfadd 2020-11-05:ip "ip3" "ip4" "ip5"  

计算今天官网访问的ip数

  1. pfcount 2020-11-04:ip 

返回结果为3

查看2020-11-04和2020-11-05这两天总共有多少个独立ip访问过网站

先将两天的数据做并集,并复制给某个值

  1. pfmerge 2020-11:ip 2020-11-04:ip 2020-11-05:ip 

然后使用pfcount命令查询,获得的值为5

  1. pfcount 2020-11:ip 

三 GEO

在Redis3.2版本中增加了GEO(地理位置定位)功能,可以使用此功能来获取附近的人。

添加命令如下,可批量添加

  1. geoadd city longitud latitude member 

我们添加几个城市的位置信息,来获取某个城市附近的城市

  1. geoadd city 116.28 39.55 beijing 117.12 39.08 tianjin 

获取北京的经纬度命令如下

  1. geopos city beijing 

查看beijing和tianjin两座城市的距离

  1. geodist city beijing tianjin km 

最后面的km表示距离单位是公里,支持的单位有以下几个:

  • m,米
  • km,千米
  • mi,英里
  • ft,尺

获取附近的位置有两个命令,georadius根据经纬度获取,georadiusbymember根据成员获取

  1. georadius key longitude laitude [单位] 
  2. 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

  1. pulish channel:message hi 

2.订阅信道

订阅者可以订阅一个或多个信道,比如订阅channel:message

  1. subscribe channel:message 

3.取消订阅

  1. unsubscribe channel:message 

4.查看活跃信道

  1. pubsub channels 

5.查看订阅数

查看信道channel:message订阅个数

  1. 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旅途公众号。 

 

责任编辑:武晓燕 来源: Java旅途
相关推荐

2024-03-12 08:44:56

WebWorkerTypeScript语法

2012-02-23 13:01:12

JavaPlay Framew

2021-03-03 08:05:53

C++项目函数

2020-07-16 08:32:16

JavaScript语言语句

2022-05-16 10:45:22

Redis接口限流缓存

2018-04-10 14:58:15

笔记本配件键盘

2021-02-01 13:35:28

微信Python技巧

2022-07-29 16:50:30

网络带宽

2022-12-06 17:30:04

2022-07-30 23:45:09

内存泄漏检测工具工具

2022-10-09 10:02:09

Python3.12

2022-04-21 14:50:50

Python农历命令

2015-04-17 09:27:04

程序员

2022-05-10 10:39:51

初创企业技术债务

2020-05-07 10:26:17

备份文件存储备份

2023-03-29 18:39:50

自动化平台case

2019-05-20 08:43:56

Nginx限流缓存

2022-05-17 07:26:33

动画CSS前端

2018-08-08 14:25:17

2023-07-03 16:49:47

5G
点赞
收藏

51CTO技术栈公众号