• Redis特殊“三巨头”


    1. Geospatial(地理位置)

    1.1 概念

    GEO类型是一种存储地理信息的数据格式。使用经度纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用,因为Geospatial的底层就是zset。

    1.2 命令

    命令说明
    geoadd key longitud(经度) latitude(纬度) member [ … ]将具体经纬度的坐标存入一个有序集合
    geopos key member [ member … ]获取集合种的一个/多个成员坐标
    geodist key member1 member2 [ unit ]返回两个给定位置之间的距离。默认是以米作为单位
    georadius key longitude latitude radius m/km/mi/ft [ withcoord ] [ withdist ] [ withhash ] [ count count ]以给定的经纬度为中心,返回集合包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素
    geradiusbymember key member radius …功能与georadius相同,只是中心位置不是具体的经纬度,而是使用集合中已有的成员作为中心点
    geohash key member1 [ member2 … ]返回一个或多个位置元素的geohash,使用geohash位置52点整数编码
    • 有效经纬度
    • 有效的经度从-180度到180度
    • 有效的维度从-85.05112878度到85.05112878度

    指定单为的参数 unit 必须是一下单位之一:

    • m :米
    • km : 千米
    • mi :英里
    • ft :英尺

    关于georadius的参数

    • 通过 georadius 就可以完成附近的人的功能
    • withcoord:带上坐标
    • withdist:带上距离,单位与半径单位相同
    • count n:只显示前n个(按距离递增排序)

    1.3 命令

    127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing 121.47 31.23 shanghai # 给china:city 添加两个城市,并指定经纬度
    (integer) 2
    127.0.0.1:6379> geohash china:city beijing # 获取china:city中的beijing这个成员的geohash字符串
    1) "wx4fbxxfke0"
    127.0.0.1:6379> zrange china:city 0 -1 # 获取所有的china:city中的所有成员
    1) "shanghai"
    2) "beijing"
    127.0.0.1:6379> zrem china:city beijing # 移除beijing这个成员
    (integer) 1
    127.0.0.1:6379> zrange china:city 0 -1 
    1) "shanghai"
    127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
    (integer) 1
    127.0.0.1:6379> geodist china:city beijing shanghai # 查看beijing与shanghai之间的直线距离,默认单位为m
    "1067378.7564"
    127.0.0.1:6379> geodist china:city beijing shanghai km # 显示两地直线距离,单位为km
    "1067.3788"
    127.0.0.1:6379> georadius china:city 111 31 1000 km # 以(111,31)为中心,1000km为半径 搜索在该范围的成员
    1) "shanghai"
    127.0.0.1:6379> georadius china:city 111 31 1000 km withcoord withdist # 追加参数,显示距离和坐标
    1) 1) "shanghai"
       2) "996.9549"
       3) 1) "121.47000163793563843"
          2) "31.22999903975783553"
    127.0.0.1:6379> georadius china:city 111 31 2000 km # 以(111,31)为中心,找半径2000km以内的成员
    1) "shanghai"
    2) "beijing"
    127.0.0.1:6379> georadius china:city 111 31 2000 km withcoord withdist count 1 # 追加count,只显示一条记录
    1) 1) "shanghai"
       2) "996.9549"
       3) 1) "121.47000163793563843"
          2) "31.22999903975783553"
    127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km # 以shanghai为中心,搜索附近1000km以内的成员
    1) "shanghai"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    1.4 使用范围

    • 附近的人
    • 距离计算

    2. Hyperloglog(基数统计)

    2.1 概念

    • Redis Hyperloglog 是用来做基数统计的 数据结构,Hyperlog log的优点是:在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、并且是很小的。
    • 花费12KB的内存,就可以计算接近2^64 个不同元素的基数。
    • 因为Hyperloglog 只会根据输入元素来计算基数,而不会存储输入元素本身,所以Hyperloglog 不能像集合那样,返回输入的各个元素。
    • 底层使用String数据类型
    • 基数:数据集中不重复的元素的个数

    2.2 命令

    命令说明
    pfadd key element1 [ element2… ]添加指定元素到Hyperloglog中
    pfcount key [ key ]返回给定 Hyperloglog 的基数估算值
    pfmerge destkey sourcekey [ sourcekey … ]将多个 Hyperloglog合并为一个Hyperloglog

    2.3 案例

    127.0.0.1:6379> pfadd mypf a b c d e f g h i j k # 给mypf添加元素
    (integer) 1
    127.0.0.1:6379> type mypf # hyperloglog底层使用String
    string
    127.0.0.1:6379> pfcount mypf # 统计mypf的基数
    (integer) 11
    127.0.0.1:6379> pfadd mypf i j k z m 
    (integer) 1
    127.0.0.1:6379> pfcount mypf # 统计基数(不重复的元素个数)
    (integer) 13
    127.0.0.1:6379> pfadd mypf2 a b c n
    (integer) 1
    127.0.0.1:6379> pfmerge newpf mypf mypf2 # 合并mypf 和mypf2 到newpf
    OK
    127.0.0.1:6379> pfcount newpf
    (integer) 18
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.4 使用场景

    • 用户签到
    • 网页的访问量(UV):一个用户多次访问,也只能算作一个人。

    传统实现,存储用户的id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是计数,Hyperloglog就能帮助我们利用最小的空间完成。

    3. BitMaps(位图

    3.1 概念

    • BitMaps是一种使用位存储的数据结构,信息状态只有0 和 1
    • Bitmap 是一串连续的二进制数字(0或1),每一位所在的位置为偏移(offset),在Bitmap上可执行AND、OR、XOR、NOT以及其他位操作。

    3.2 命令

    命令说明
    setbit key offset value为指定key的offset位设置值
    getbit key offset获取offset位的值
    bitcount key [ start end ]统计字符串被设置位1 的bit树,也可以指定统计范围(按字节)
    bitop perration destkey key [ key … ]对一个或多个保存二进制位的字符串key 进行元操作,并将结果保存到destkey上
    bitpos key bit [ start ] [ end ]返回字符串里面第一个被设置为1或0的bit位,start和end只能按字节,不能按位

    3.3 案例

    127.0.0.1:6379> setbit sign 0 1 # 设置sign的第0位为1
    (integer) 0
    127.0.0.1:6379> setbit sign 2 1 # 设置sign的第2位为1 ,第一位没设置 默认是0
    (integer) 0
    127.0.0.1:6379> setbit sign 3 1
    (integer) 0
    127.0.0.1:6379> setbit sign 5 1
    (integer) 0
    127.0.0.1:6379> type sign
    string
    127.0.0.1:6379> getbit sign 2 # 获取sign的第2为的数值
    (integer) 1
    127.0.0.1:6379> getbit sign 3
    (integer) 1
    127.0.0.1:6379> getbit sign 4 # 未设置默认是0
    (integer) 0
    127.0.0.1:6379> bitcount sign # 统计sign中1的位数
    (integer) 4
    127.0.0.1:6379> bitpos sign 1 0 -1 # 返回字符串里面第一个被设置为1的bit位
    (integer) 0
    127.0.0.1:6379> setbit aaa 0 1
    (integer) 0
    127.0.0.1:6379> setbit aaa 1 0
    (integer) 0
    127.0.0.1:6379> setbit aaa 2 1
    (integer) 0
    127.0.0.1:6379> setbit bbb 0 0
    (integer) 0
    127.0.0.1:6379> setbit bbb 1 1
    (integer) 0
    127.0.0.1:6379> setbit bbb 2 1
    (integer) 0
    # aaa 101
    # bbb 011
    127.0.0.1:6379> bitop and res aaa bbb # 对aaa和bbb进行and运算,并将结果保存到res中
    (integer) 1
    127.0.0.1:6379> getbit res 0
    (integer) 0
    127.0.0.1:6379> getbit res 1
    (integer) 0
    127.0.0.1:6379> getbit res 2
    (integer) 1
    127.0.0.1:6379> bitop or res-or aaa bbb # 对aaa和bbb进行or运算,并将结果保存到res-or中
    (integer) 1
    127.0.0.1:6379> getbit res-or 0
    (integer) 1
    127.0.0.1:6379> getbit res-or 1
    (integer) 1
    127.0.0.1:6379> getbit res-or 2
    (integer) 1
    127.0.0.1:6379> bitop not res-not aaa # 对aaa进行not运算,并将结果保存到res-not中
    (integer) 1
    127.0.0.1:6379> getbit res-not 0
    (integer) 0
    127.0.0.1:6379> getbit res-not 1
    (integer) 1
    127.0.0.1:6379> getbit res-not 2
    (integer) 0
    127.0.0.1:6379> bitop xor res-xor aaa bbb # 对aaa和bbb进行xor运算,并将结果保存到res-xor中
    (integer) 1
    127.0.0.1:6379> getbit res-xor 0
    (integer) 1
    127.0.0.1:6379> getbit res-xor 1
    (integer) 1
    127.0.0.1:6379> getbit res-xor 2
    (integer) 0
    127.0.0.1:6379> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    3.4 使用场景

    • 签到统计
    • 状态统计
    • 统计某一天网站的签到数量

    总结

    1. geo类型作地理位置信息存储
    2. hyperloglog作基数统计
    3. bitmap按位存储,作签到统计
  • 相关阅读:
    光纤连接器的连接方法
    PyQt GUI 编程-01
    【C++】继承
    个人微信管理系统都有些什么功能呢?
    代码随想录二刷day45
    vue事件处理&&表单输入绑定
    Python多任务编程
    Linux网络基础2之http
    MySQL8.0优化 - 事务的隔离级别
    【计算机视觉 | 语义分割】语义分割常用数据集及其介绍(七)
  • 原文地址:https://blog.csdn.net/qq_45609369/article/details/126536766