3、Redis的三种特殊数据类型

1、geospatial地理位置:

1603186630(1).jpg
  • GEOADD:

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
语法:GEOADD key longitude latitude member[longitude latitude member ...]

##########################################################
# GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。
# 有效的经度介于 -180 度至 180 度之间。
# 有效的纬度介于 -85.05112878 度至 85.05112878 度之间。
##########################################################
127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijin
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.472644 31.231706 shanghai 114.085947 22.547 shenzhen 114.298572 30.584355 wuhan
(integer) 3
##########################################################
  • GEOPOS:

从key里返回所有给定位置元素的位置(经度和纬度)。
语法:GEOPOS key member [member ...]

127.0.0.1:6379> GEOPOS china:city wuhan   #获取指定城市的经度纬度
1) 1) "114.29857403039932251"
   2) "30.58435486605102227"
127.0.0.1:6379> GEOPOS china:city beijin shanghai
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "121.47264629602432251"
   2) "31.23170490709807012"
  • GEODIST:

返回两个给定位置之间的距离。
语法:GEODIST key member1 member2 [unit]

##########################################################
#如果两个位置之间的其中一个不存在,那么命令返回空值。
#指定单位的参数 unit 必须是以下单位的其中一个:
#  m 表示单位为米。
#  km 表示单位为千米。
#  mi 表示单位为英里。
#  ft 表示单位为英尺。
#如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
##########################################################
127.0.0.1:6379> GEODIST china:city wuhan shenzhen  #查看武汉到深圳的直线距离
"894214.7596"
127.0.0.1:6379> GEODIST china:city wuhan shenzhen km
"894.2148"

##########################################################
  • GEORADIUS:

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
语法:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

##########################################################
#范围可以使用以下其中一个单位:
# m 表示单位为米。
# km 表示单位为千米。
# mi 表示单位为英里。
# ft 表示单位为英尺。
#在给定以下可选项时, 命令会返回额外的信息:
#  WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
#  WITHCOORD: 将位置元素的经度和维度也一并返回。
#  WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
#命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
#  ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
#  DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。
##########################################################
127.0.0.1:6379> GEORADIUS china:city 110 30 800 km
1) "wuhan"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
1) "shenzhen"
2) "wuhan"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist
1) 1) "shenzhen"
   2) "923.4929"
2) 1) "wuhan"
   2) "417.8920"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord
1) 1) "shenzhen"
   2) 1) "114.08594459295272827"
      2) "22.54699993773966327"
2) 1) "wuhan"
   2) 1) "114.29857403039932251"
      2) "30.58435486605102227"

##########################################################
  • GEORADIUSBYMEMBER:

指定成员的位置被用作查询的中心。(和GEORADIUS类似)
语法:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

127.0.0.1:6379> GEORADIUSBYMEMBER china:city wuhan 1000 km
1) "shenzhen"
2) "wuhan"
3) "shanghai"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city wuhan 1000 km withdist
1) 1) "shenzhen"
   2) "894.2148"
2) 1) "wuhan"
   2) "0.0000"
3) 1) "shanghai"
   2) "688.2824"
  • GEOHASH:

返回一个或多个位置元素的 Geohash 表示。(11位)
语法:GEOHASH key member [member ...]

#将二维的经纬度转换为一维的字符串表示
127.0.0.1:6379> GEOHASH china:city wuhan shenzhen
1) "wt3mbztwvb0"
2) "ws10k0dcg10"

小结:GEO底层的实现原理就是Zset,因此我们可以使用Zset命令操作GEO

127.0.0.1:6379> ZRANGE china:city 0 -1   #查询所有的城市
1) "shenzhen"
2) "wuhan"
3) "shanghai"
4) "beijin"
127.0.0.1:6379> ZREM china:city shanghai   #删除一个元素
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "shenzhen"
2) "wuhan"
3) "beijin"

2、HyperLogLogs:

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

使用

127.0.0.1:6379> PFADD key1 1 2 3 4 5 6 7   #创建第一组元素
(integer) 1
127.0.0.1:6379> PFCOUNT key1     #统计第一组元素基数数量
(integer) 7
127.0.0.1:6379> PFADD key2 6 6 7 7 8 9 10
(integer) 1
127.0.0.1:6379> PFCOUNT key2
(integer) 5
127.0.0.1:6379> PFMERGE key3 key1 key2    #合并两组元素到key3中(并集)
OK 
127.0.0.1:6379> PFCOUNT key3
(integer) 10

3、bitmaps

位存储

应用:如统计用户登陆状态(登录和未登录),记录打卡(265天)
Bitmap位图是通过操作二进制来进行记录,只有0或者1两个状态

测试
向week1中放进七天的打卡数据,1代表打卡,0代表未打卡

127.0.0.1:6379> SETBIT week1 1 1
(integer) 0
127.0.0.1:6379> SETBIT week1 2 1
(integer) 0
127.0.0.1:6379> SETBIT week1 3 1
(integer) 0
127.0.0.1:6379> SETBIT week1 4 1
(integer) 0
127.0.0.1:6379> SETBIT week1 5 1
(integer) 0
127.0.0.1:6379> SETBIT week1 6 0
(integer) 0
127.0.0.1:6379> SETBIT week1 7 0
(integer) 0

查看某一天是否打卡:(GETBIT)

127.0.0.1:6379> GETBIT week1 1   #查看周一是否打卡
(integer) 1
127.0.0.1:6379> GETBIT week1 6   #查看周六是否打卡
(integer) 0

统计打卡的天数:(BITCOUNT )

127.0.0.1:6379> BITCOUNT week1   #统计打卡的天数
(integer) 5                      #打卡天数为5天
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350