上一篇讲了redis的五种基本数据类型的使用场景。除了string、hash、list、set、zset之外,redis还提供了一些其他的数据结构(当然,严格意义上不算数据结构),我们来看看redis还能做什么?位图以二进制作为计算机中信息的基本单位,即任何输入的信息最终都会被转换成一串二进制在计算机中的数字。在redis中,提供了Bitmaps来进行位操作。我们可以把Bitmaps看成一个以位为单位的数组,数组的下标称为偏移量。使用位图的优点是它们占用的空间更少。如果我们要记录某个员工今天是否登录了公司官网,可以以日期为key,以员工id为偏移量(这里员工id在数据库中是自增的)。如果id从1000开始,为了节省篇幅,一般会在这个初始值中减去employeeid作为偏移量,偏移量一般从0开始。是否访问官网用0和1表示。在本例如果id为3的员工访问了官网,则将他的值写为1#id为3的员工访问了官网setbituser:2020-11-0431#id为18的员工访问了官网setbituser:2020-11-04181查询某员工是否访问过官网getbituser:2020-11-041查询指定范围(byte)内1的个数,比如我想查询id为1-24的员工有多少人访问过官网websitebitcountuser:2020-11-04132HyperLogLogHyperLogLog可以用非常小的内存空间完成数据统计,无法获取到单条数据。只能用于统计,会有一定的误差率。如果我想统计访问官网的IP地址,加上今天访问官网的ip列表#2020-11-04ippfadd2020-11-04:ip"ip1""ip2""ip3"#2020-11-05ippfadd2020-11-05:ip"ip3""ip4""ip5"计算今天官网访问的ips个数pfcount2020-11-04:ip的返回结果为3查看2020-的总数11-04和2020-11-05两个独立的ip访问了网站。首先合并两天的数据,复制到某个值pfmerge2020-11:ip2020-11-04:ip2020-11-05:ip,然后使用pfcount命令查询,得到的值为5pfcount2020-11:ip3GEO在Redis3.2版本中增加了GEO(GeographicLocation)功能,可以使用该功能获取附近的人。添加的命令如下,geoaddcitylongitudlatitudemember可以批量添加,我们添加几个城市的位置信息得到某个城市附近的城市geoaddcity116.2839.55beijing117.1239.08tianjin得到北京的经纬度命令如下surface中的km表示距离单位为千米,支持的单位有:m,meterkm,kilometermi,milesft,feet获取附近位置有两个命令,georadius根据纬度获取longitude,georadiusbymember根据成员georadiuskeylongitudelatitude[Unit]georadiusbymemberkeymember[unit]后面可以跟非必需参数,参数如下withcoord:返回结果包含经纬度withdist:返回结果包含距离centerlocationwithhash:返回结果包含geohash(即经纬度转换成hash值)COUNTcount:指定返回结果个数asc|desc:将返回结果按照离中心的距离排序到上一篇文章中提到的可以使用list和zset来实现消息队列的指定key中的四个发布订阅模式的消息,但是上面实现的消息队列是点对点的模式,也就是一个消息只能被一个消费者消费。另外,redis还支持发布-订阅模式,即一条消息被所有订阅者消费,比如广播、公告等,一个公告发布后,所有关注我的用户都能收到这个公告。1.发布消息发布消息到频道channel:message,消息内容为hibulishchannel:messagehi2。一个频道的订阅者可以订阅一个或多个频道,例如订阅频道:消息订阅频道:消息3。取消订阅unsubscribechannel:message4。查看活跃频道pubsubchannels5.查看订阅数查看频道数channel:消息订阅数pubsubnumsubchannel:messageredis的发布-订阅模型和专业的消息中间件相比有点粗糙,但是实现起来非常简单,学习成本低.五BloomFilterBloomfilter是redis4版本新增的特性。它的实现原理类似于Bitmaps。它还使用一个位数组,将你的值通过多个哈希函数得到对应位数组的位置,并将这些值设置为1。布隆过滤器常用于防止缓存穿透。存在的问题,如果说某个元素不存在,它一定不存在,如果说某个元素存在,它可能不存在。这是因为如果要将a、b、c三个元素放入同一个数组中,假设a经过3次哈希得到1、5、7三个位置,那么这三个位置会被修改为1、b经过三次哈希得到2、4、6三个位置,将这三个位置改为1。经过三次哈希,c得到2、5、7三个位置,但是前两个元素后hashed,这三个位置都变成了1,那能说c一定存在吗?很明显不是!本文转载自微信公众号“Java之旅”,可通过以下二维码关注。转载本文请联系Java之旅公众号。
