文章目录
三种特殊数据类型
一、geospatial 地理位置处理
时间复杂度:每一个元素添加是O(log(N)) ,N是sorted set的元素数量。
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。
该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
GEO 底层实现原理是Zset!我们可以直接使用Zset命令操作geo
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
1.geoadd
Redis GEOADD 命令 - 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
[root@gesuo ~]# redis-cli -p 6379
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
2.geopos
Redis GEOPOS 命令 - 从key里返回所有给定位置元素的位置(经度和纬度)
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing shanghai
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "121.47000163793563843"
2) "31.22999903975783553"
3.geodist
Redis GEODIST 命令 - 返回两个给定位置之间的距离
127.0.0.1:6379> geodist china:city beijing shanghai
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379> geodist china:city beijing xian km
"910.0565"
4.geodist
Redis GEORADIUS 命令 - 以给定的经纬度为中心, 找出某一半径内的元素 (获得附近的人的地址,定位!)
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "chongqing"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 3
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
5.georadiusbymember
Redis GEORADIUSBYMEMBER 命令 - 找出位于指定范围内的元素,中心点是由给定的位置元素决定
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
6.geohash
Redis GEOHASH 命令 - 返回一个或多个位置元素的 Geohash 表示
Geohash字符串属性:
该命令将返回11个字符的Geohash字符串,所以没有精度Geohash,损失相比,使用内部52位表示。返回的geohashes具有以下特性:
他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。
它可以在 geohash.org 网站使用,网址 http://geohash.org/。查询例子:http://geohash.org/sqdtr74hyu0.
与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。
返回值:
一个数组, 数组的每个项都是一个 geohash 。 命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
二、hyperloglog 基数统计
什么是基数? 不重复数的个数就叫基数
例如:例如: A{1 1 2 3 4 3 5} 那么A的基数就是 5
1.pfadd
Redis Pfadd 命令 - 添加指定元素到 HyperLogLog 中。
127.0.0.1:6379> pfadd mykey 1 2
(integer) 1
127.0.0.1:6379> pfadd mykey1 1 3
(integer) 1
2.pfcount
Redis Pfcount 命令 - 返回给定 HyperLogLog 的基数估算值。
127.0.0.1:6379> pfadd mykey 1 1 2 3 4 5 1 2
(integer) 1
127.0.0.1:6379> pfcount mykey
(integer) 5
127.0.0.1:6379>
2.pfmerge
Redis Pgmerge 命令 - 将多个 HyperLogLog 合并为一个 HyperLogLog
127.0.0.1:6379> pfadd mykey 1 2
(integer) 1
127.0.0.1:6379> pfadd mykey1 1 3
(integer) 1
127.0.0.1:6379> pfmerge my mykey mykey1
OK
127.0.0.1:6379> pfcount my
(integer) 3
127.0.0.1:6379>
三、Bitmaps 位存储
使用:记录用户状态信息,如是否登录,是否打卡等等…
两个状态的,都可以使用!
Bitmaps 位图,数据结构!都是操作二进制位来进行记录
只有0和1两个状态
例:
使用bitmaps来记录周一到周日的打卡
1.setbit 设置值
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
2.getbit 获取值
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0
3.bitcount 统计值
127.0.0.1:6379> bitcount sign
(integer) 3