加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Redis_三种特殊数据类型

发布时间:2020-12-16 04:36:45 所属栏目:安全 来源:网络整理
导读:三种特殊数据类型 目录 三种特殊数据类型 1. geospatial 1. 概述 2. 相关命令 1. geoadd 2. geopos 3. geodist 4. georadius 5. georadiusbymember 6. geohash(较少使用) 3. 底层 2. hyperloglog 1. 简介 2.测试使用 3. bitmaps 1. 简介 2. 测试 1. geospati

三种特殊数据类型

目录
  • 三种特殊数据类型
    • 1. geospatial
      • 1. 概述
      • 2. 相关命令
        • 1. geoadd
        • 2. geopos
        • 3. geodist
        • 4. georadius
        • 5. georadiusbymember
        • 6. geohash(较少使用)
      • 3. 底层
    • 2. hyperloglog
      • 1. 简介
      • 2.测试使用
    • 3. bitmaps
      • 1. 简介
      • 2. 测试

1. geospatial

1. 概述

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

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

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

2. 相关命令

1. geoadd

添加地理位置

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

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

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 英尺
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

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

获得指定数量的人

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

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

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字符串

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

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

3. 底层

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

127.0.0.1:6379> type china:city
zset

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

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.测试使用

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 就可以了

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

127.0.0.1:6379> getbit sign 5
(integer) 1

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

127.0.0.1:6379> bitcount sign
(integer) 4

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读