Redis(四)------三种特殊数据类型
7、三种特殊数据类型
7.1 Geospatial(地理位置)
- 使用经纬度定位地理坐标,并用一个有序集合Zset保存,所以,Zset的命令也可以使用
- 有效经纬度
- 经度:-180度到180度
- 纬度:-85.05112878度到85.05112878度
7.1.1 基本用法
命令 | 描述 |
---|
GeoAdd key longitud(经度) latitude(维度) member… | 将具体经纬度的坐标存入一个有序集合 | Geopos key member1 member2… | 获取集合中一个/多个成员的坐标 | Geodist key member1 member2 距离单位 | 返回给定两个位置之间的距离,默认单位为米 | Georadius key longitudu(经度) latitude(纬度) 半径最大距离 单位(m/km/mi/ft) [with位置元素] | 以给定经纬度为中心点,返回集合包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素 | Georadiusbymember key member 半径最大距离… | 以已有成员作为中心点,返回集合包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素 | Geohash key member1 member2… | 返回一个/多个位置元素的Geohash表示,使用Geohash位置52点整数编码(11个字符) |
- Georadius参数:
- withcoord:显示坐标
- withdist:显示距离,单位和半径单位相同
- count n:只显示前n个,距离递增排序
7.1.2 Geoadd
- 坐标存储到Zset中,查看集合的数据可以用Zset命令来查看
- 当坐标位置超出上述指定范围时,该命令将会返回一个错误
- 南北两级无法直接添加,一般会下载城市数据,通过java程序一次性导入
---------- getadd ---------- 添加地理位置 ----------
127.0.0.1:6379> GEOADD china:city 116.41667 39.91667 beijing
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.43333 34.50000 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 117.20000 39.13333 tianjing
(integer) 1
127.0.0.1:6379> GEOADD china:city 118.78333 32.05000 jiangsu
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "jiangsu"
2) "shanghai"
3) "tianjing"
4) "beijing"
7.1.3 Geopos
---------- Geopos ---------- 获取当前定位(经纬度) ----------
127.0.0.1:6379> GEOPOS china:city jiangsu
1) 1) "118.78332942724227905"
2) "32.04999907785209956"
127.0.0.1:6379> GEOPOS china:city jiangsu shanghai
1) 1) "118.78332942724227905"
2) "32.04999907785209956"
2) 1) "121.4333304762840271"
2) "34.49999971716130887"
7.1.4 Geodist
---------- Geodist ---------- 获取两位置间距离 ----------
127.0.0.1:6379> GEODIST china:city jiangsu beijing km
"900.4314"
7.1.5 Georadius
- Georadius参数:
- withcoord:显示坐标
- withdist:显示距离,单位和半径单位相同
- count n:只显示前n个,距离递增排序
---------- Georadius ---------- 获取距该位置(经纬度)半径为n的位置 ----------
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "jiangsu"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqing"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord withdist
1) 1) "chongqing"
2) "346.0548"
3) 1) "106.4500012993812561"
2) "29.56666939001875249"
2) 1) "shenzhen"
2) "915.6424"
3) 1) "114.06667023897171021"
2) "22.61666928352524764"
3) 1) "hangzhou"
2) "981.3098"
3) 1) "120.20000249147415161"
2) "30.2666706589875858"
4) 1) "jiangsu"
2) "867.3741"
3) 1) "118.78332942724227905"
2) "32.04999907785209956"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord withdist count 1
1) 1) "chongqing"
2) "346.0548"
3) 1) "106.4500012993812561"
2) "29.56666939001875249"
7.1.6 Georadiusbymember
- Georadius参数:
- withcoord:显示坐标
- withdist:显示距离,单位和半径单位相同
- count n:只显示前n个,距离递增排序
---------- Georadiusbymember ---------- 获取距离该成员半径为n的位置 ----------
127.0.0.1:6379> GEORADIUSBYMEMBER china:city jiangsu 1000 km
1) "jiangsu"
2) "shanghai"
3) "tianjing"
4) "beijing"
5) "hangzhou"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city jiangsu 500 km
1) "jiangsu"
2) "shanghai"
3) "hangzhou"
7.1.7 Geohash
---------- Geohash ---------- 返回元素 的hash表示 ----------
127.0.0.1:6379> GEOHASH china:city jiangsu shanghai hangzhou
1) "wtsqqfx2u00"
2) "wwnk72911d0"
3) "wtmkpjyuph0"
---------- 可以用Zset命令操作Geo ----------
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "jiangsu"
5) "shanghai"
6) "tianjing"
7) "beijing"
127.0.0.1:6379> ZRANGEBYLEX china:city - +
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "jiangsu"
5) "shanghai"
6) "tianjing"
7) "beijing"
127.0.0.1:6379> ZREM china:city jiangsu
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "tianjing"
6) "beijing"
7.1.8 Geospatial应用场景
7.2 Hyperloglog(基数)
- Redis Hyperloglog是用来做基数统计时的算法。
- 优点:输入元素的数量或体积非常大时,计算基数所需的空间总是固定的,并且很小的
- 花费12KB内存,可以计算接近2^64个不同元素的基数
- 因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素
- 底层使用的是String数据类型
7.2.1 什么是基数
7.2.2 基本用法
命令 | 描述 |
---|
PFadd key element1 element2… | 添加一个/多个元素到Hyperloglog中 | PFcount key1 key2… | 返回给定一个/多个Hyperloglog的基数估算值(所有元素不重复个数) | PFmerge 新key key1 key2… | 将多个Hyperloglog合并为一个新Hyperloglog,相同的去除 |
----------PFADD--PFCOUNT---------------------
127.0.0.1:6379> PFADD myelemx a b c d e f g h i j k
(integer) 1
127.0.0.1:6379> type myelemx
string
127.0.0.1:6379> PFCOUNT myelemx a
(integer) 11
127.0.0.1:6379> PFCOUNT myelemx
(integer) 11
127.0.0.1:6379> pfadd myelems a c d j k m n o p q
(integer) 1
127.0.0.1:6379> PFCOUNT myelemx myelems
(integer) 16
127.0.0.1:6379> PFCOUNT myelems
(integer) 10
127.0.0.1:6379> get myelemx
"HYLL\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x80DE\x8cB&\x80@\x89\x88H_\x84@\xfc\x80EV\x94F\xca\x80D<\x848\x80B=\x80K\x83\x80B\xed\x84A\xfc\x8cC\x93\x84C\xf9\x80Bm\x80BZ"
----------------PFMERGE-----------------------
127.0.0.1:6379> PFMERGE myelemz myelemx myelemy
OK
127.0.0.1:6379> PFCOUNT myelemz
(integer) 17
- 允许容错的情况下,可以使用Hyperloglog
- 不允许容错的情况下,用Set或自己的数据类型
7.2.3 Hyperloglog应用场景
- 网站的UV,一个人访问一个网站多次,仍然算作一个人
7.3 BitMaps(位图)
- 使用位存储,信息状态只有0和1
- BitMaps是一串连续的二进制数字,每一位所在的位置位偏移(offset),再BitMaps上执行
7.3.1 基本用法
命令 | 描述 |
---|
SETBIT key offset value | 为指定key的第offset位设置值 | GETBIT key offset | 获取指定第offset位的值 | BITcount key n1 n2 | 统计字符串被设置为1的个数,可以按[n1,n2]区间进行统计 | BITtop operration 新key key1 key2… | 对一个/多个保存二进制字符串key进行位元操作。并将结果保存到新key中 | BITpos key bit n1 n2 | 返回该字符串中第一个设置位1或0的位数,[n1,n2]区间只能安字节,不能按位 |
------------setbit--getbit--------------
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> type sign
string
127.0.0.1:6379> getbit sign 2
(integer) 1
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 4
(integer) 0
-----------bitcount----------------------------
127.0.0.1:6379> BITCOUNT sign
(integer) 4
127.0.0.1:6379> get sign
"\xb4"
7.3.2 BitMaps应用场景
- 打卡记录
- 统计数据
- 有两个相对状态的事务,可以用BitMaps来统计
|