【redis】几种数据结构补充

常用的数据结构有string、hash、list、set、zset,此外还有bitmaps、HyperLogLog、GEO、Stream等

bitmaps

位图采用字符串实现,不是新实现的数据结构,它在key每个位存储0或1,通过对位的操作存储大量数据,与string一样,每个key大小限制512MB,即每个key可以存2^{32}个位。

它可以用来做什么呢?

假如教师要知道本班学生课堂练习完成情况,0代表未完成,1代表完成了。通过以下设置他可以非常清楚地知道每个学生哪些做了,哪些还没做。

setbit t_1  1 1 1 1 1

setbit t_2  1 1 1 0 0

他也可以通过 setbit 

 

HyperLogLog

用来做基数统计(重复元素记作同一个)。在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。因为它并不存储元素本身,而是通过概率算法,记录其hash值第一位1出现位置,来计算元素数量,对于一个输入的字符串,首先得到64位的hash值,用前14位来定位桶的位置(共有 {2}^{14} 个桶),每个桶有6bit,记录第一次出现1的位置count,如果count>oldcount,就用count替换oldcount。

它只有三个操作方法:

pfadd(增加元素):    pfadd 数据集 "元素1" "元素2" "元素3"

pfcount(统计):        pfcount 数据集

pfmerge(合并) :     pfmerge新数据集 "数据集1" "数据集2" "数据集3"

和布隆过滤器有一些类似,但是它主要用来统计总数,布隆过滤器主要用来过滤判断,布隆过滤器可以直接判断数据存不存在,HyperLogLog非要想判断可以在元素pfadd前后各算一次prcount,一样就表示之前存在,不过,线上环境并发那么大不说,这种方式类似神农尝百草,我无法在pfadd前知道在不在,而pfadd操作是不可逆的...所以它还是做统计吧,比如月活用户、独立访问IP个数。

我们的题库系统给用户选举一反三随机的题目就用到了布隆过滤器,它还有经典用法是防止缓存穿透

HyperLogLog和布隆过滤器一样,只能增加元素,不能删改,在数据量很大的时候会有一定的误差,但通常不会有大的影响。

GEO

存储地理位置信息,并可以进行操作。

Redis GEO 操作方法有:

geoadd(添加地理位置坐标): geoadd 数据集 经度 纬度 地名1 经度 纬度 地名2 经度 纬度 地名3  ...

geopos(获取地理位置的坐标):geopos 数据集 地名2

geodist(计算两个位置之间的距离):geodist 地名1 地名2

georadius(指定经纬度坐标和半径范围内的地理位置集合): georadius 数据集 经度 维度 半径 单位(m/km/mi/ft )

georadiusbymember(指定地名和半径范围内的地理位置集合):georadius 数据集 地名1 半径 单位

geohash(返回一个或多个位置对象的 geohash 值):geohash 数据集 地名1 地名2 地名3 ...

Stream

发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息,stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值