当面试时被问到redis的数据类型,初级程序员只知道String, Hash, List, Set, Zset这5种基础数据类型。
但要想完美通过面试,你必须知道另外3种进阶数据类型。
BitMaps
计算机使用二进制存储数据,并提供了操作位的功能。Redis使用Bitmaps结构实现此功能。Bitmaps底层实现是字符串,使用命令以下标方式操作只保存0、1的数组。
例如记录用户是否访问网站存放到Bitmaps中,以1表示用户已经访问了,以0表示用户没有访问。
以下表示了2021-03-13当天用户id 0、3、7、10访问了网站。
数据 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
- 设值命令:
setbit visit:user:2021-03-13 0
,setbit visit:user:2021-03-13 3
- 查找命令:
getbit visit:user:2021-03-13 3
获取用户3的访问记录,返回值是1
- 查找指定范围值为1的个数:
bitcount visit:user:2021-03-13 [0 10]
,返回值是4
- 集合运算(and交集、or并集、not非、xor异或),如:
bitop and visit:user:2021-03-12_13 visit:user:2021-03-01_12 visit:user:2021-03-01_13
Bitmaps和set对比:
数据类型 | id长度 | 用户量 | 消耗内存 |
---|---|---|---|
set | 64 | 50 000 000 | 400MB |
Bitmaps | 1 | 100 000 000 | 12.5MB |
在需要保存的数据量很大的时候,Bitmaps能节省很多空间。但假如需要保存的用户量比较小时,则Bitmaps消耗比set要高,具体用哪种需要根据自身业务分析。
HyperLogLog
HyperLogLog是一种基数算法,能使用很小的内存空间完成IP、Email、ID的统计,底层使用String实现。命令如下:
- pfadd:
pfadd visit:user:2021-03-13 0 3 7 10
,向此结构添加数据 - pfcount:
pfcount visit:user:2021-03-13
,统计这个键对应的总数 - pfmerge:
pfmerge visit:user:2021-03 visit:user:2021-03-01 visit:user:2021-03-02 ...
,将后面几个统计到第一个key中。
HyperLogLog占用内存极小,但存在一定的误差率,最大是0.81%,可以用在统计总数中。
GEO
Redis3.2版本提供了GEO(地理信息定位)功能,可以实现查找附近范围,计算两地距离等,底层数据类型是zset。
- 增加命令:
geoadd key longitude latitude member [longitude latitude member...]
- 更新命令:和增加命令一致,自动替换原值,
geoadd key longitude latitude member [longitude latitude member...]
- 获取命令:
geopos key member [member...]
- 计算距离:
geodist key member1 member2
[unit(m米、km千米、mi英里、ft尺)] - 范围计算:
georadius key longitude latitude radius m
- 删除命令:
zrem key member
,利用zset删除地理位置信息