Redis的三种特殊数据类型

Redis的三种特殊数据类型

  • Geospatial
  • Hyperloglog
  • BitMaps

Geospatial(地理位置)

将指定的地理空间位置(经度、纬度、名称)添加到指定的key中

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

基本命令:

  • geoadd key longitud latitude member [..] 将具体经纬度的坐标存入一个有序集合
  • geopos key member [member..] 获取集合中的一个/多个成员坐标
  • georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count] 以给定的经纬度为中心, 返回集合包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
  • GEORADIUSBYMEMBER key member radius... 功能与GEORADIUS相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点。
  • geohash key member1 [member2..] 返回一个或多个位置元素的Geohash表示。使用Geohash位置52点整数编码。

简单的例子:

127.0.0.1:6379> FLUSHDB  # 清空当前的数据库
OK
127.0.0.1:6379> GEOADD city 112.98 28.19 changsha   #添加一个城市的经纬度
(integer) 1
127.0.0.1:6379> GEOADD city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> GEOADD city  121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> GEOADD city 106.50 29.53 zhongqing 113.23 23.12 guangzhou  #添加多个城市的经纬度
(integer) 2 
127.0.0.1:6379> GEOPOS city changsha beijing  # 获得一个或多个城市的经纬度
1) 1) "112.9800000786781311"
   2) "28.1899989603527743"
2) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> GEORADIUS city 110 39 1000 km withcoord  # 以110 39为中心的方圆1000km的城市,带上经纬度
1) 1) "beijing"
   2) 1) "116.39999896287918091"
      2) "39.90000009167092543"
127.0.0.1:6379> GEORADIUS city 110 39 2000 km withcoord withdist # 以110 39为中心的方圆1000km的城市,带上经纬度和距离
1) 1) "zhongqing"
   2) "1101.0914"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "guangzhou"
   2) "1792.5280"
   3) 1) "113.22999805212020874"
      2) "23.1199990030198208"
3) 1) "changsha"
   2) "1233.4325"
   3) 1) "112.9800000786781311"
      2) "28.1899989603527743"
4) 1) "shanghai"
   2) "1352.9905"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553"
5) 1) "beijing"
   2) "558.5849"
   3) 1) "116.39999896287918091"
      2) "39.90000009167092543"
127.0.0.1:6379> GEORADIUSBYMEMBER city changsha 1000 km withcoord withdist # 以城市为中心的方圆1000km的城市,带上经纬度和距离
1) 1) "guangzhou"
   2) "564.4735"
   3) 1) "113.22999805212020874"
      2) "23.1199990030198208"
2) 1) "changsha"
   2) "0.0000"
   3) 1) "112.9800000786781311"
      2) "28.1899989603527743"
3) 1) "shanghai"
   2) "886.7953"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553"
4) 1) "zhongqing"
   2) "648.4851"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> GEOHASH city changsha  # 返回一个城市的hash编码,编码越相似表示距离越近
1) "wt026gvd8u0"

Hyperloglog(基数统计)

Redis HyperLogLog 是用来做基数(去重后的元素个数)统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

其底层使用string数据类型

基本命令:

  • PFADD key element1 [elememt2..] 添加指定元素到 HyperLogLog 中
  • PFCOUNT key [key] 返回给定 HyperLogLog 的基数估算值。
  • PFMERGE destkey sourcekey [sourcekey..] 将多个 HyperLogLog 合并为一个 HyperLogLog

简单示例:

127.0.0.1:6379> PFADD list1 a b c d e f g  # list1
(integer) 1
127.0.0.1:6379> PFADD list2 f g h i j k l  #list2
(integer) 1
127.0.0.1:6379> PFCOUNT list1 # 返回list1的基数
(integer) 7
127.0.0.1:6379> PFADD list3 w e r y r d d w e  # list3
(integer) 1
127.0.0.1:6379> PFCOUNT list3  # 返回list3的基数
(integer) 5
127.0.0.1:6379> PFMERGE list4 list1 list2  # 合并list1 list2 到 list4中 
OK
127.0.0.1:6379> PFCOUNT list4  #返回list4的基数
(integer) 12

BitMaps(位图)

使用位存储,信息状态只有 0 和 1

Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。

多用于打卡签到之内的统计事情

基本命令:

  • setbit key offset value 为指定key的offset位设置值
  • getbit key offset 获取offset位的值
  • bitcount key [start end] 统计字符串被设置为1的bit数,也可以指定统计范围按字节

例子:
周一:0 、周二:1 、周三:2…周日:6

打卡为1,没打卡为0

127.0.0.1:6379> SETBIT week 0 1  # week的周一没打卡
(integer) 0
127.0.0.1:6379> SETBIT week 1 1  # week的周二打卡了
(integer) 0
127.0.0.1:6379> SETBIT week 2 1
(integer) 0
127.0.0.1:6379> SETBIT week 3 0
(integer) 0
127.0.0.1:6379> SETBIT week 4 1
(integer) 0
127.0.0.1:6379> SETBIT week 5 0
(integer) 0
127.0.0.1:6379> SETBIT week 6 0
(integer) 0
127.0.0.1:6379> GETBIT week 6  # 看周日的打卡情况
(integer) 0
127.0.0.1:6379> SETBIT week 7 2  # 建立一个非 0 1 的数据   报错!!!!
(error) ERR bit is not an integer or out of range
127.0.0.1:6379> BITCOUNT week 0 -1   # 看一周内打卡了多少次(1的数量)
(integer) 4
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值