Redis还可以做哪些事?

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis还可以做哪些事?

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

四 发布订阅模式消息

上一篇文章中讲到了可以使用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一定存在吗?显然不能!


点关注、不迷路

如果觉得文章不错,欢迎关注点赞收藏,你们的支持是我创作的动力,感谢大家。

如果文章写的有问题,请不要吝惜文笔,欢迎留言指出,我会及时核查修改。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
目录
相关文章
|
8月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
163 10
|
缓存 计算机视觉 数据格式
成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决
成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决)
成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决
|
11月前
|
异构计算
请拥有edu邮箱的同学来领取专(免)属(费)GPU!
300小时免费GPU等你来领!魔搭GPU资源福利社,为你注入动力!
|
12月前
axios全局做节流,解决多次点击导致多次请求接口
本文介绍了如何在Axios请求中实现全局节流,以防止用户快速多次点击导致重复发送相同请求的问题。
227 2
|
11月前
|
监控 数据可视化 项目管理
关键链项目管理是什么?它如何优化传统项目管理?
关键链项目管理(CCPM)由艾利·高德拉特提出,通过优化资源分配和减少多任务并行的浪费,显著提高项目执行效率与成功率。本文介绍CCPM的核心理念、与传统项目管理的区别及优势,并推荐几款支持CCPM的项目管理软件,如ProChain、板栗看板等,帮助企业更好地实施这一高效管理方法。
483 0
|
11月前
|
存储 缓存 并行计算
yolov5的train.py的参数信息解析
这篇文章解析了YOLOv5的`train.py`脚本中的参数信息,详细介绍了每个参数的功能和默认值,包括权重路径、模型配置、数据源、超参数、训练轮数、批量大小、图像尺寸、训练选项、设备选择、优化器设置等,以便用户可以根据需要自定义训练过程。
410 0
|
SQL 数据库 数据安全/隐私保护
【Python】已解决:(SqlServer报错)SQL错误(208):对象名‘string_split’无效
【Python】已解决:(SqlServer报错)SQL错误(208):对象名‘string_split’无效
457 2
|
程序员 计算机视觉
程序员的“防御性编程”
最近都在聊程序员要做好“防御性编程”,"防御性编程"的概念从之前的“保护程序”一下子变成了现在的“保护程序员”,一字之差,千差万别。
程序员的“防御性编程”
|
SQL 监控 Java
Flink报错问题之Flink sql tinyint类型使用in报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。