redis 三种特殊数据类型


视频链接
官网: https://redis.io/
中文官网: http://redis.cn/

文章地址
redis入门https://blog.csdn.net/qq_41538097/article/details/118097179
五大数据类型https://blog.csdn.net/qq_41538097/article/details/118123867
三种特殊数据类型https://blog.csdn.net/qq_41538097/article/details/118160898
Redis 事务,watch 监控(乐观锁)https://blog.csdn.net/qq_41538097/article/details/118198672
springboot 整合 redis https://blog.csdn.net/qq_41538097/article/details/118199634
RedisUtil 工具类https://blog.csdn.net/qq_41538097/article/details/118331927
Redis.conf 配置详解https://blog.csdn.net/qq_41538097/article/details/118334331
redis 持久化操作https://blog.csdn.net/qq_41538097/article/details/118340130
redis 发布订阅https://blog.csdn.net/qq_41538097/article/details/118348000
redis 主从复制https://blog.csdn.net/qq_41538097/article/details/118354527
redis 哨兵模式https://blog.csdn.net/qq_41538097/article/details/118360381
一、Geospatial 地理位置

朋友的位置,附近的人,打车距离计算

Redis 的 Geo 在 Redis 3.2 版本就有了,可以推算地理位置信息,两地之间距离,方圆几里的人
查询经纬度网站:http://www.jsons.cn/lngcode/
六个命令
在这里插入图片描述

1、geoadd
  • 有效的经度从 -180 度到 180 度。
  • 有效的纬度从 -85.05112878 度到 85.05112878 度。
  • 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
`geoadd key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]`
`添加地理位置,两级无法添加,参数 key 值(longitude(经度) latitude(纬度))`
127.0.0.1:6379> geoadd china:city 116.40 9.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai 106.50 29.53 chongqing  # 添加多个
(integer) 2
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen 125.14 42.92 xian
(integer) 2
127.0.0.1:6379> geoadd china:city 114.30 35.29 wuhan
(integer) 1
2、geopos

从key里返回所有给定位置元素的位置(经度和纬度)

` geopos key member [member ...]`
127.0.0.1:6379> geopos chaina:city beijing 
1) (nil)
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "9.90000110905447883"
127.0.0.1:6379> geopos china:city xian chongqing
1) 1) "125.13999849557876587"
   2) "42.92000122112879268"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"
3、geodist
  • 返回两个给定位置之间的距离。

  • 如果两个位置之间的其中一个不存在, 那么命令返回空值。

  • 指定单位的参数 unit 必须是以下单位的其中一个:

    • m 表示单位为米。
    • km 表示单位为千米。
    • mi 表示单位为英里。
    • ft 表示单位为英尺。
  • 如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

  • GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

`geodist key member1 member2 [m|km|ft|mi]`
127.0.0.1:6379> geodist china:city beijing shanghai
"2429545.2043"
127.0.0.1:6379> geodist china:city beijing shanghai km
"2429.5452"
127.0.0.1:6379> geodist china:city chongqing xian km
"2230.0929"
4、georadius

使用场景:如、查找我附近的人?
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。( 给定经纬度,半径,获取圆内所有的值)

`WITHCOORD 返回经度纬度,WITHDIST 返回距离 WITHHASH geohash 整数、COUNT 数量、ASC|DESC 升序|降序`
`georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key]`
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord  // 经度 110,纬度 30 半径 500 Km 范围的城市 
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> georadius  china:city 110 30 1000 km withcoord withdist count 3 desc # 按距离降序排列,返回 3 个数值包含经度纬度
1) 1) "shenzhen"
   2) "924.6408"
   3) 1) "114.04999762773513794"
      2) "22.5200000879503861"
2) 1) "wuhan"
   2) "712.8136"
   3) 1) "114.30000096559524536"
      2) "35.28999879561363429"
3) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> georadius  china:city 110 30 1000 km withcoord withdist count 2 asc # 按距离升序排列,返回 2 个数值包含经度纬度
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "wuhan"
   2) "712.8136"
   3) 1) "114.30000096559524536"
      2) "35.28999879561363429"
5、georadiusbymember

这个命令和 georadius 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点

`georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]`
127.0.0.1:6379> georadiusbymember china:city wuhan 1000 km
1) "wuhan"
2) "shanghai"
3) "chongqing"
127.0.0.1:6379> georadiusbymember china:city wuhan 1000 km withcoord withdist count 2 desc
1) 1) "chongqing"
   2) "972.4526"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "shanghai"
   2) "804.9962"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553"
6、geohash

该命令将返回11个字符的Geohash字符串

`geohash key member [member ...]`
# 将二维的经纬度转换为 11 位的字符串,如果两个字符串越相似,则越接近
127.0.0.1:6379> geohash china:city beijing xian
1) "w9fb2dpzst0"
2) "wz8uptk5jk0"
7、geo 底层数据实现

geo 底层是 Zset 数组实现

127.0.0.1:6379> zrange china:city 0 -1 # 查看 geo 添加的值
1) "beijing" 2) "chongqing" 3) "shenzhen" 4) "shanghai" 5) "wuhan" 6) "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) "shanghai" 4) "wuhan" 5) "xian"
127.0.0.1:6379> geopos china:city beijing # Zset 删除之后 geo 获取不到(已删除)
1) (nil)
二、Hyperloglog

做基数统计, Redis 2.8.9 更新 Hyperloglog 数据结构
在这里插入图片描述
Redis Hyperloglog基数统计的算法!
优点∶占用的内存是固定,2^64不同的元素的基数,只需要废12KB内存!如果要从内存角度来比较的话Hyperloglog首选!

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

  • 传统的方式,set 保存用户的id,然后就可以统计set中的元素数量作为标准判断!
  • 这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id ;
  • 0.81%错误率!统计UV任务,可以忽略不计的!
`pfadd 添加、 pfcount 合并去重,返回数量 、pfmerge 合并去重赋给 Hyperloglog `
127.0.0.1:6379> pfadd mykey a b c d e f g h i j k # pfadd 添加
(integer) 1
127.0.0.1:6379> pfadd mykey2 a c i j h k o p l # pfadd 添加
(integer) 1
127.0.0.1:6379> pfcount mykey mykey2 # pfcount 合并去重,返回数量
(integer) 14
127.0.0.1:6379> pfcount mykey # pfcount 返回 mykey 数量
(integer) 11
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 # pfmerge 合并去重赋给 mykey3
OK
127.0.0.1:6379> pfcount mykey3 # pfcount 返回 mykey3 数量
(integer) 14

允许容错使用,不允许容错不建议使用

三、Bitmap

位存储
统计用户信息,活跃、不活跃、!登陆、未打卡!打卡、未打卡!只有两个状态的都可以使用 0 1
bitmap 位图,数据结构!操作二进制来记录,就只有 0 或 1 两个状态

`使用 bitmap 记录一周打卡记录,setbit 可以修改值`
` 0 1 第一天打开,1 0 第二天未打卡,2 1 第三天打卡......`
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 1
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0

######################################
`查看某一天是否打卡`
127.0.0.1:6379> getbit sign 5 # 查询周六是否打卡, 1 代表打卡
(integer) 1
127.0.0.1:6379> getbit sign 3 # 查询周四是否打卡,0 代表未打卡
(integer) 0

#####################################
`统计操作,统计一周打卡天数`
127.0.0.1:6379> bitcount sign # 获取打卡(1)天数
(integer) 5
127.0.0.1:6379> bitcount sign 0 4
(integer) 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值