redis三种特殊数据类型

bitmap位图

如:统计疫情感染人数:1 ,0 ; 1表示感染, 0:表示未感染。
统计用户信息:活跃,不活跃!登录,未登录!打卡:365天打卡!
只要是两个状态的,都可以使用Bitmap!
Bitmap位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!
365天 = 365bit 1字节 = 8bit 46个字节左右!

使用bitmap 来记录 周一到周日的打卡!
周一:1 周二:0 周三:0 周四:1 周五:1 周六:0 周日:0

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

查看某一天是否有打卡!

127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0

统计操作,统计打卡的天数!

127.0.0.1:6379> bitcount sign    # 统计这周打卡记录,就可以看到是否全勤!
(integer) 3

hyperloglog基数统计

A {1,3,5,7,8,7}
B{1,3,5,7,8}
基数(不重复的元素的个数) = 5 , 可以接受误差!

  • Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!
  • 优点:占用的内存是固定的,2^64不同的元素的技术,只需要用12KB内存!如果要从内存的角度来比较的话Hyperloglog首选!

网页的UV(一个人访问一个网站多次,但是还是算作一个人!)

传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为标准判断!
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户的id;
0.81%错误率!统计UV任务,可以忽略不计的!

127.0.0.1:6379> pfadd mykey a b c d e f g h i j     # 创建第一组元素  mykey
(integer) 1
127.0.0.1:6379> pfcount mykey            # 统计 mykey  元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j k l m  n s e p i   # 创建第二组元素  mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2      # 合并两组 mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> pfcount mykey3     # 看并集的数量!
(integer) 16

如果允许容错,那么一定可以使用Hyperloglog!
如果不允许容错,就使用set 或者自己的数据类型即可!

geospatial地理位置

朋友的定位,附近的人,打车距离计算!
Redis的Geo在Redis3.2版本就推出了!这个功能可以推算出地理位置的信息,两地之间的距离,方圆几里的人!
可以查询一些测试数据:jingweidu.bmcx.com/
只有六个命令:

  • geoadd 添加地理位置
#geoadd  
# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
# 参数 key  值(经度、维度、名称)
# 有效经度为 -180 到 180 度。
# 有效纬度为 -85.05112878 到 85.05112878 度。
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.55 29.56 chongqing 114.05 22.54 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.21 30.25 hangzhou 125.15 42.93 xian
(integer) 2
  • geopos 获得当前定位
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 chongqing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "106.5499994158744812"
   2) "29.56000053864853072"
  • geodist 两人之间的距离

    • m 表示单位为米。
    • km 表示单位为千米。
    • mi表示单位为英里。
    • ft表示单位为英尺
  • georadius 已给定的经纬度为中心,找出某一半径内的元素
    我附近的人?(获得所有附近人的地址,定位!)通过半径来查询!
    获得指定的数量的人,200
    所有的数据应该都录入:china:city ,才能让结果更加请求!

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 chongqing km
"1458.5492"
############################################################################################
127.0.0.1:6379> georadius china:city 110 30 1000 km   # 以110,30 这个经纬度为中心,寻找方圆1000km内的城市!
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "xinxiangxueyuan"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqing"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist  # 显示到中间距离的位置
1) 1) "chongqing"
   2) "336.6174"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord   # 显示他人的定位信息
1) 1) "chongqing"
   2) 1) "106.5499994158744812"
      2) "29.56000053864853072"
127.0.0.1:6379> georadius china:city 110 30 1000 km withdist withcoord count 2  # 筛选指定结果!
1) 1) "chongqing"
   2) "336.6174"
   3) 1) "106.5499994158744812"
      2) "29.56000053864853072"
2) 1) "xinxiangxueyuan"
   2) "695.2883"
   3) 1) "113.94000023603439331"
      2) "35.30000080530839313"
  • georadiusbymember 找出位于指定元素周围的其他元素
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km   
1) "xinxiangxueyuan"
2) "beijing"
3) "xian"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
  • geohash 返回一个或者多个元素的Geohash表示
    该命令将返回11个字符的Geohash字符串!
# 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越近!
127.0.0.1:6379> geohash china:city beijin chongqing
1) "wx4fbxxfke0"
2) "wm7b0t5r6z0"
  • geo 底层的实现原理其实就是Zset!我们可以使用Zset命令来操作geo
127.0.0.1:6379> zrange china:city 0 -1      # 查看地图中全部的元素
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "xinxiangxueyuan"
6) "beijing"
7) "xian"
127.0.0.1:6379> zrem china:city beijing     # 移除指定元素!
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "xinxiangxueyuan"
6) "xian"
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2

不讲讲缺点么。。

1年前 评论
my38778570 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!