Redis_三种特殊数据类型

三种特殊数据类型

1. geospatial#

1. 概述#

朋友的定位, 附近的人, 打车距离实现

Redis 的 Geo 在 Redis 3.2 版本就推出了! 这个功能可以推算地理位置的信息: 两地之间的距离, 方圆几里的人

所有的geospatial命令都是geo开头的

2. 相关命令#

1. geoadd#

添加地理位置

Copy
127.0.0.1:6379> geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang (integer) 3 127.0.0.1:6379> geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian (integer) 3

规则

  • 地球的两极无法直接添加, 我们一般会下载城市数据, 通过java程序一次性导入!
  • 参数 key 经度(longitude) 纬度(latitude) 名称

2. geopos#

获取指定的成员的经度和纬度

Copy
127.0.0.1:6379> geopos china:city taiyuan manjing 1) 1) "112.54999905824661255" 2) "37.86000073876942196" 2) 1) "118.75999957323074341" 2) "32.03999960287850968"

获得当前定位, 一定是一个坐标值!

3. geodist#

如果不存在, 返回空

单位如下

  • m
  • km
  • mi 英里
  • ft 英尺
Copy
127.0.0.1:6379> geodist china:city taiyuan shenyang m "1026439.1070" 127.0.0.1:6379> geodist china:city taiyuan shenyang km "1026.4391"

4. georadius#

附近的人 ==> 获得所有附近的人的地址, 定位, 通过半径来查询

获得指定数量的人

Copy
127.0.0.1:6379> georadius china:city 110 30 1000 km 以 100,30 这个坐标为中心, 寻找半径为1000km的城市 1) "xian" 2) "hangzhou" 3) "manjing" 4) "taiyuan" 127.0.0.1:6379> georadius china:city 110 30 500 km 1) "xian" 127.0.0.1:6379> georadius china:city 110 30 500 km withdist 1) 1) "xian" 2) "483.8340" 127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2 1) 1) "xian" 2) "483.8340" 3) 1) "108.96000176668167114" 2) "34.25999964418929977" 2) 1) "manjing" 2) "864.9816" 3) 1) "118.75999957323074341" 2) "32.03999960287850968"

参数 key 经度 纬度 半径 单位 [显示结果的经度和纬度] [显示结果的距离] [显示的结果的数量]

5. georadiusbymember#

显示与指定成员一定半径范围内的其他成员

Copy
127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km 1) "manjing" 2) "taiyuan" 3) "xian" 127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2 1) 1) "taiyuan" 2) "0.0000" 3) 1) "112.54999905824661255" 2) "37.86000073876942196" 2) 1) "xian" 2) "514.2264" 3) 1) "108.96000176668167114" 2) "34.25999964418929977"

参数与 georadius 一样

6. geohash(较少使用)#

该命令返回11个字符的hash字符串

Copy
127.0.0.1:6379> geohash china:city taiyuan shenyang 1) "ww8p3hhqmp0" 2) "wxrvb9qyxk0"

将二维的经纬度转换为一维的字符串, 如果两个字符串越接近, 则距离越近

3. 底层#

geo底层的实现原理实际上就是Zset, 我们可以通过Zset命令来操作geo

Copy
127.0.0.1:6379> type china:city zset

查看全部元素 删除指定的元素

Copy
127.0.0.1:6379> zrange china:city 0 -1 withscores 1) "xian" 2) "4040115445396757" 3) "hangzhou" 4) "4054133997236782" 5) "manjing" 6) "4066006694128997" 7) "taiyuan" 8) "4068216047500484" 9) "shenyang" 10) "4072519231994779" 11) "shengzhen" 12) "4154606886655324" 127.0.0.1:6379> zrem china:city manjing (integer) 1 127.0.0.1:6379> zrange china:city 0 -1 1) "xian" 2) "hangzhou" 3) "taiyuan" 4) "shenyang" 5) "shengzhen"

2. hyperloglog#

基数 ---- 不重复的元素, 可以接受误差

1. 简介#

  • Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!

  • Hyperloglog是基数统计的算法

  • 用于统计网页的 UV (一个人访问一个网站多册, 但是还是算作一个人)

  • 传统的方式: set 保存用户的id, 然后就可以统计 set 中元素的数量作为标准判断

    • 这种方式如果保存大量的用户 id, 就会比较麻烦
    • 我们的目的是为了计数, 而不是保存用户 id
  • 优点

    • 占用的内存是固定的 (存放 2^64 不同元素的基数, 只需要使用 12KB 的内存)
    • 有 0.81% 的错误率, 对于统计 UV , 可以忽略不计
  • 命令都是pf开头的

  • 如果允许容差, 可以使用Hyperloglog统计数量

  • 如果不允许容错, 就使用 set 或者自己的数据类型即可

2.测试使用#

Copy
127.0.0.1:6379> pfadd mykey a b c d e f g h i j (integer) 1 127.0.0.1:6379> pfcount mykey (integer) 10 127.0.0.1:6379> pfadd mykey2 i j z x c v b n m (integer) 1 127.0.0.1:6379> pfcount mykey2 (integer) 9 127.0.0.1:6379> pfmerge mykey3 mykey mykey2 OK 127.0.0.1:6379> pfcount mykey3 (integer) 15
  • pfadd 创建一组元素
  • pfcount 统计元素中的基数数量
  • pfmerge 合并两组 参数为 pfmerge 并集 来源... 会去掉相同的元素

3. bitmaps#

1. 简介#

位存储, one hot编码

统计用户信息, 活跃, 不活跃! 登录, 未登录! 打卡, 365打卡!

只有两个状态的, 都可以使用bitmaps!

Bitmaps 位图, 数据结构, 都是操作二进制位来进行记录, 只有 0 和 1 两个状态

例如 : 365 天 = 365 bit 1字节 = 8 bit ==> 只需要 46 个字节左右就可以存储用户的一年打卡的信息了!

2. 测试#

image-20201022133457211

使用bitmap来记录周一至周日的打卡

周一: 1 周二: 0 ...

判断有几天是 1 就可以了

Copy
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 1 (integer) 0 127.0.0.1:6379> setbit sign 6 0 (integer) 0
  • setbit key offset value
    • value只能为0 和 1
    • offset从0开始

查看某一天是否有打卡 getbit key value

Copy
127.0.0.1:6379> getbit sign 5 (integer) 1

同级操作, 统计打卡的天数( 1的个数 ) bitcount key

Copy
127.0.0.1:6379> bitcount sign (integer) 4
posted @   山人西来  阅读(274)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示
CONTENTS