Redis三种特殊的数据类型
1、Geospatial(地理位置)
使用经纬度定位地理坐标并使用一个有序集合Zset保存,所以Zset命令也可以使用
有效的经纬度
- 有效的经度:-180°~180°
- 有效的纬度:-85.05112878°~85.05112878°
命令 | 描述 | 示例 |
| 将具体经纬度的坐标存入一个有序的集合 | |
| 获取集合中的一个/多个成员坐标 | |
| 返回两个给定位置之间的距离。默认以米做单位也可以手动添加unit(如下),指定单位 | |
| 以给定经纬度为中心,返回集合当中包含的位置元素中,返回不超过给定的最大距离的所有位置的元素 | |
| 以给定的已有成员作为中心位置,返回不超过给定的最大距离的所有位置的元素 | |
| 返回一个或者多个位置元素用Geohash表示,使用Geohash位置52点整数编码 |
unit必须是以下单位的其中一个:
- m表示单位为米(默认)
- km表示单位为千米
- mi表示单位为英里
- ft表示单位为英尺
关于GEORADIUS的参数
通过
georadius
可以完成附近的人功能
WITHCOORD:带上坐标显示
WITHDIST:带上距离显示,单位与半径单位是相同的
WITHHASH:返回指定结果中包含的geopath
COUNT count:指定返回结果的数量,只显示前面count个(默认按照距离递增排序)
asc|desc:返回结果根据离中心节点位置的距离进行升序或降序
store key:将返回结果的地理位置信息保存到指定key
storedist key:将返回结果离中心节点的距离保存到指定key
2、Hyperloglog(基数统计)
什么是基数?
数据集中不重复的元素的个数
Redis HyperLogLog是用来做基数统计的算法
HyperLogLog的优点:在输入元素的数量或者体积非常非常大的时候,计算技术所需要的空间是固定的,并且很小,只需要花费12KB的内存就可以计算接近2^64个不同元素的基数
HyperLogLog的缺点:HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
HyperLogLog的底层使用的是String类型
命令 | 描述 | 示例 |
| 添加指定元素到HyperLogLog中 | |
| 返回给定HyperLogLog的基数估算值 | |
| 将多个HyperLogLog合并为一个HyperLogLog |
如果允许容错(即存在一点误差),则一定可以使用HyperLogLog(标准误差为0.81%)
如果不允许有容错,就使用Set或者自己的数据类型即可
应用场景:
- 页面的访问量(UV):一个用户多次访问,也只能算作一个热。
传统实现,存储用户的id,然后每次进行比较。当用户变多之后,这种方式及其浪费空间,而我们的目的只是计数,HyperLogLog就能帮助我们利用最小的空间完成。
3、BitMaps(位图)
1.使用位存储,信息状态只有0和1
2.Bitmap是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。(PS:划重点 节省存储空间)。
3.Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND、OR、XOR、NOT以及其他操作
4. 如果要统计全年打卡情况365天=365bit 1字节=8bit 46个字节左右!
命令 | 描述 | 示例 |
| 为指定key的offset位设置值(设置key的第offset位为value) | |
| 获取offset位的值 | |
| 统计字符串被设置位1的bit数量,也可以按字节组指定统计范围 | |
| 对一个或多个保存二进制的字符串key进行位元操作,并将结果保存到destkeyy上 | |
| 返回字符串里面第一个被设置为1或者0的bit位。start和end只能按字节,不能按位 | |
127.0.0.1:6379> SETBIT sign 0 1 //10000000
(integer) 0
127.0.0.1:6379> SETBIT sign 3 1 //10010000
(integer) 0
127.0.0.1:6379> BITCOUNT sign 0 3 //统计下标0,3字节组中bit为1的个数,但目前字节组sign为[10010000 00000000 00000000]只有索引为0的字节组存在为1的位
(integer) 2
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:
- BITOP AND destkey key [key …] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
- BITOP OR destkey key [key …] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
- BITOP XOR destkey key [key …] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
- BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey 。
注:除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。
应用场景:
- 签到统计
- 状态统计
例如:使用bitmap来记录周一到周日的打卡记录
周一:1 周二:0 周三:0 周四:1……