Redis特殊“三巨头”

1. Geospatial(地理位置)

1.1 概念

GEO类型是一种存储地理信息的数据格式。使用经度纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用,因为Geospatial的底层就是zset。

1.2 命令

命令说明
geoadd key longitud(经度) latitude(纬度) member [ … ]将具体经纬度的坐标存入一个有序集合
geopos key member [ member … ]获取集合种的一个/多个成员坐标
geodist key member1 member2 [ unit ]返回两个给定位置之间的距离。默认是以米作为单位
georadius key longitude latitude radius m/km/mi/ft [ withcoord ] [ withdist ] [ withhash ] [ count count ]以给定的经纬度为中心,返回集合包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素
geradiusbymember key member radius …功能与georadius相同,只是中心位置不是具体的经纬度,而是使用集合中已有的成员作为中心点
geohash key member1 [ member2 … ]返回一个或多个位置元素的geohash,使用geohash位置52点整数编码
  • 有效经纬度
  • 有效的经度从-180度到180度
  • 有效的维度从-85.05112878度到85.05112878度

指定单为的参数 unit 必须是一下单位之一:

  • m :米
  • km : 千米
  • mi :英里
  • ft :英尺

关于georadius的参数

  • 通过 georadius 就可以完成附近的人的功能
  • withcoord:带上坐标
  • withdist:带上距离,单位与半径单位相同
  • count n:只显示前n个(按距离递增排序)

1.3 命令

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing 121.47 31.23 shanghai # 给china:city 添加两个城市,并指定经纬度
(integer) 2
127.0.0.1:6379> geohash china:city beijing # 获取china:city中的beijing这个成员的geohash字符串
1) "wx4fbxxfke0"
127.0.0.1:6379> zrange china:city 0 -1 # 获取所有的china:city中的所有成员
1) "shanghai"
2) "beijing"
127.0.0.1:6379> zrem china:city beijing # 移除beijing这个成员
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1 
1) "shanghai"
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geodist china:city beijing shanghai # 查看beijing与shanghai之间的直线距离,默认单位为m
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km # 显示两地直线距离,单位为km
"1067.3788"
127.0.0.1:6379> georadius china:city 111 31 1000 km # 以(111,31)为中心,1000km为半径 搜索在该范围的成员
1) "shanghai"
127.0.0.1:6379> georadius china:city 111 31 1000 km withcoord withdist # 追加参数,显示距离和坐标
1) 1) "shanghai"
   2) "996.9549"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553"
127.0.0.1:6379> georadius china:city 111 31 2000 km # 以(111,31)为中心,找半径2000km以内的成员
1) "shanghai"
2) "beijing"
127.0.0.1:6379> georadius china:city 111 31 2000 km withcoord withdist count 1 # 追加count,只显示一条记录
1) 1) "shanghai"
   2) "996.9549"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553"
127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km # 以shanghai为中心,搜索附近1000km以内的成员
1) "shanghai"

1.4 使用范围

  • 附近的人
  • 距离计算

2. Hyperloglog(基数统计)

2.1 概念

  • Redis Hyperloglog 是用来做基数统计的 数据结构,Hyperlog log的优点是:在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、并且是很小的。
  • 花费12KB的内存,就可以计算接近2^64 个不同元素的基数。
  • 因为Hyperloglog 只会根据输入元素来计算基数,而不会存储输入元素本身,所以Hyperloglog 不能像集合那样,返回输入的各个元素。
  • 底层使用String数据类型
  • 基数:数据集中不重复的元素的个数

2.2 命令

命令说明
pfadd key element1 [ element2… ]添加指定元素到Hyperloglog中
pfcount key [ key ]返回给定 Hyperloglog 的基数估算值
pfmerge destkey sourcekey [ sourcekey … ]将多个 Hyperloglog合并为一个Hyperloglog

2.3 案例

127.0.0.1:6379> pfadd mypf a b c d e f g h i j k # 给mypf添加元素
(integer) 1
127.0.0.1:6379> type mypf # hyperloglog底层使用String
string
127.0.0.1:6379> pfcount mypf # 统计mypf的基数
(integer) 11
127.0.0.1:6379> pfadd mypf i j k z m 
(integer) 1
127.0.0.1:6379> pfcount mypf # 统计基数(不重复的元素个数)
(integer) 13
127.0.0.1:6379> pfadd mypf2 a b c n
(integer) 1
127.0.0.1:6379> pfmerge newpf mypf mypf2 # 合并mypf 和mypf2 到newpf
OK
127.0.0.1:6379> pfcount newpf
(integer) 18

2.4 使用场景

  • 用户签到
  • 网页的访问量(UV):一个用户多次访问,也只能算作一个人。

传统实现,存储用户的id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是计数,Hyperloglog就能帮助我们利用最小的空间完成。

3. BitMaps(位图)

3.1 概念

  • BitMaps是一种使用位存储的数据结构,信息状态只有0 和 1
  • Bitmap 是一串连续的二进制数字(0或1),每一位所在的位置为偏移(offset),在Bitmap上可执行AND、OR、XOR、NOT以及其他位操作。

3.2 命令

命令说明
setbit key offset value为指定key的offset位设置值
getbit key offset获取offset位的值
bitcount key [ start end ]统计字符串被设置位1 的bit树,也可以指定统计范围(按字节)
bitop perration destkey key [ key … ]对一个或多个保存二进制位的字符串key 进行元操作,并将结果保存到destkey上
bitpos key bit [ start ] [ end ]返回字符串里面第一个被设置为1或0的bit位,start和end只能按字节,不能按位

3.3 案例

127.0.0.1:6379> setbit sign 0 1 # 设置sign的第0位为1
(integer) 0
127.0.0.1:6379> setbit sign 2 1 # 设置sign的第2位为1 ,第一位没设置 默认是0
(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 # 获取sign的第2为的数值
(integer) 1
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 4 # 未设置默认是0
(integer) 0
127.0.0.1:6379> bitcount sign # 统计sign中1的位数
(integer) 4
127.0.0.1:6379> bitpos sign 1 0 -1 # 返回字符串里面第一个被设置为1的bit位
(integer) 0
127.0.0.1:6379> setbit aaa 0 1
(integer) 0
127.0.0.1:6379> setbit aaa 1 0
(integer) 0
127.0.0.1:6379> setbit aaa 2 1
(integer) 0
127.0.0.1:6379> setbit bbb 0 0
(integer) 0
127.0.0.1:6379> setbit bbb 1 1
(integer) 0
127.0.0.1:6379> setbit bbb 2 1
(integer) 0
# aaa 101
# bbb 011
127.0.0.1:6379> bitop and res aaa bbb # 对aaa和bbb进行and运算,并将结果保存到res中
(integer) 1
127.0.0.1:6379> getbit res 0
(integer) 0
127.0.0.1:6379> getbit res 1
(integer) 0
127.0.0.1:6379> getbit res 2
(integer) 1
127.0.0.1:6379> bitop or res-or aaa bbb # 对aaa和bbb进行or运算,并将结果保存到res-or中
(integer) 1
127.0.0.1:6379> getbit res-or 0
(integer) 1
127.0.0.1:6379> getbit res-or 1
(integer) 1
127.0.0.1:6379> getbit res-or 2
(integer) 1
127.0.0.1:6379> bitop not res-not aaa # 对aaa进行not运算,并将结果保存到res-not中
(integer) 1
127.0.0.1:6379> getbit res-not 0
(integer) 0
127.0.0.1:6379> getbit res-not 1
(integer) 1
127.0.0.1:6379> getbit res-not 2
(integer) 0
127.0.0.1:6379> bitop xor res-xor aaa bbb # 对aaa和bbb进行xor运算,并将结果保存到res-xor中
(integer) 1
127.0.0.1:6379> getbit res-xor 0
(integer) 1
127.0.0.1:6379> getbit res-xor 1
(integer) 1
127.0.0.1:6379> getbit res-xor 2
(integer) 0
127.0.0.1:6379> 

3.4 使用场景

  • 签到统计
  • 状态统计
  • 统计某一天网站的签到数量

总结

  1. geo类型作地理位置信息存储
  2. hyperloglog作基数统计
  3. bitmap按位存储,作签到统计
posted on 2022-08-26 13:27  JAVA开发区  阅读(17)  评论(0)    收藏  举报  来源