Redis三种特殊数据类型
geospatial 地理位置
Redis 地理空间数据类型简介
Redis 地理空间索引允许您存储坐标并搜索它们。 此数据结构可用于查找给定半径或边界框内的邻近点。
基本命令
geoadd
# getadd 添加地理位置
127.0.0.1:6379> geoadd china:city 116.4 39.9 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 125.1 42.9 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 121.4 31.2 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 114.0 22.5 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.2 30.2 hangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 118.8 32.0 nanjing
(integer) 1
geopos
获得当前定位:一定是一个坐标值
127.0.0.1:6379> geopos china:city beijing # 获取指定的城市的经度和维度
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
geodist
单位:
-
m表示单位为米
-
km表示单位为千米
-
mi表示单位为英里
-
f化t表示单位为英尺
127.0.0.1:6379> geodist china:city beijing xian # 查看北京到西安的直线距离
"798353.9550"
127.0.0.1:6379> geodist china:city beijing xian km
"798.3540"
127.0.0.1:6379> geodist china:city beijing shanghai km # 查看北京到上海的直线距离
"1067.7424"
georadius 以给定的经纬度为中心 找出某一半径内的元素
127.0.0.1:6379> georadius china:city 110 30 1000 km # 获取110,30这个位置为中心,搜寻方圆1000km的城市
1) "shenzhen"
2) "hangzhou"
3) "nanjing"
127.0.0.1:6379> georadius china:city 110 30 1000 km withdist # 显示到中心距离的位置
1) 1) "shenzhen"
2) "924.4990"
2) 1) "hangzhou"
2) "981.4461"
3) 1) "nanjing"
2) "867.6807"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord # 显示其他定位信息
1) 1) "shenzhen"
2) 1) "114.00000125169754028"
2) "22.50000113800319212"
2) 1) "hangzhou"
2) 1) "120.20000249147415161"
2) "30.19999988833350102"
3) 1) "nanjing"
2) 1) "118.80000203847885132"
2) "31.99999916826298119"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord count 2 # 筛选指定结果
1) 1) "nanjing"
2) 1) "118.80000203847885132"
2) "31.99999916826298119"
2) 1) "shenzhen"
2) 1) "114.00000125169754028"
2) "22.50000113800319212"
georadiusbymember
找出位于指定元素周围其他的元素
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "nanjing"
2) "beijing"
3) "xian"
geohash 返回一个或者多个位置元素的Geohash
该命令将返回11个字符串的Geohash字符串
127.0.0.1:6379> geohash china:city beijing xian
1) "wx4fbxxfke0"
2) "wz8un9xn970"
geo 底层的实现原理其实就是zset!可以使用zset命令来操作geo
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "hangzhou"
3) "shanghai"
4) "nanjing"
5) "beijing"
6) "xian"
Hyperloglog
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
优点∶占用的内存是固定,2^64不同的元素的技术,只需要废12KB内存!如果要从内存角度来比较的话
Hyperloglog首选 !网页的UV(一个人访问一个网站多次,但是还是算作一个人!)
传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为标准判断!
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id ;
0.81%错误率!统计UV任务,可以忽略不计的!
redis HyperLogLog 的基本命令:
序号 | 命令及描述 |
---|---|
1 | [PFADD key element element …] 添加指定元素到 HyperLogLog 中。 |
2 | [PFCOUNT key key …] 返回给定 HyperLogLog 的基数估算值。 |
3 | [PFMERGE destkey sourcekey sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog |
实例:
127.0.0.1:6379> pfadd mykey a b c d e f g h i j # 创建第一组元素 mykey
(integer) 1
127.0.0.1:6379> pfcount mykey # 统计mykey元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m # 创建第er组元素 mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfcount mykey3
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 # 合并两组mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> pfcount mykey3
(integer) 15
如果允许容错,那么一定可以使用Hyperloglog!
如果不允许容错,就使用set或者自己的数据类型即可!
Bitmaps
位存储
统计用户信息,活跃,不活跃!登录、未登录!打卡,365打卡!两个状态的,都可以使用Bitmaps !
Bitmaps位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!
365天= 365 bit 1字节= 8 bit 46个字节左右!
使用bitmap 来记录周一到周日的打卡!
周一:1 周二:0 周三:0 周四:1 …
查看某一天是否打卡
127.0.0.1:6379> getbit sign 3
(integer) 0
127.0.0.1:6379> getbit sign 6
(integer) 0
统计操作 统计打卡的天数
127.0.0.1:6379> bitcount sign # 统计这周打卡记录
(integer) 3