• 详解redis的三种特殊数据类型


    14天学习训练营导师课程: 郑为中《Vue和SpringBoot打造假日旅社管理系统》

    努力是为了不平庸~
    学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识点/题解/项目实操/遇到的bug/等等),在分享的同时加深对于知识点的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~
    你可以从以下几个方面着手(不强制),或者根据自己对学习课程主题的理解创作,参考如下:

    Geospatial(地理位置)

    使用经纬度定位地理坐标,底层实现原理就是用一个有序集合zset保存,所以zset命令也可以使用

    命令描述
    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] 以给定的经纬度为中心, 返回集合包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
    GEORADIUSBYMEMBER key member radius...功能与GEORADIUS相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点。
    geohash key member1 [member2..]返回一个或多个位置元素的Geohash表示。使用Geohash位置52点整数编码。
    $ geopos china:city beijing 获取集合中的一个/多个成员坐标  获得当前定位。是一个坐标值
    
    $ geodist china:city beijing shanghai
    
    $ GEORADIUS china:city 120 30 500 km withcoord # 显示出经度和维度
    $ GEORADIUS china:city 120 30 500 km withdist  # 显示到中间的距离
    
    $ GEORADIUS china:city 120 30 500 km withcoord withdist count 1 # 筛选出指定的结果
    
    # 找出位于指定元素周围的其他元素
    $ GEORADIUSBYMEMBER china:city shanghai 400 km # 显示在上海周围400km内的城市
    
    # 该命令将返回11个字符的geohash字符串
    # 将二维的经纬度转换未一维的字符转,两个字符串越接近,相距越近。
    127.0.0.1:6379> geohash china:city beijing shanghai
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    有效经纬度

    • 有效的经度从-180度到180度。
    • 有效的纬度从-85.05112878度到85.05112878度。

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

    • m 表示单位为米。
    • km 表示单位为千米。
    • mi 表示单位为英里。
    • ft 表示单位为英尺。

    关于GEORADIUS的参数

    通过georadius就可以完成 附近的人功能

    withcoord:带上坐标

    withdist:带上距离,单位与半径单位相同

    COUNT n : 只显示前n个(按距离递增排序)

    • georadius
    # 查询经纬度(120,30)坐标500km半径内的成员
    127.0.0.1:6379> GEORADIUS china:city 120 30 500 km withcoord withdist 
    
    1) 1) "hangzhou"
       2) "29.4151"
       3) 1) "120.20000249147415"
          2) "30.199999888333501"
    2) 1) "shanghai"
       2) "205.3611"
       3) 1) "121.40000134706497"
          2) "31.400000253193539"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • geohash
    127.0.0.1:6379> geohash china:city yichang shanghai # 获取成员经纬坐标的geohash表示
    1) "wmrjwbr5250"
    2) "wtw6ds0y300"
    
    • 1
    • 2
    • 3

    Hyperloglog(基数统计)

    Redis HyperLogLog 是用来做基数统计的算法,例如:网页的UV(一个人访问一个网站多次,但是还是算作一个人)

    传统的方式:set保存 用户的id,然后可以统计set中的元素数量作为标准判断。如果保存大量的ID就会麻烦。目的是为了计数,而不是为了保存用户id

    HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

    仅花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。 但是会有一定的容错

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

    因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

    其底层使用string数据类型

    什么是基数?

    数据集中不重复的元素的个数。

    应用场景:

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

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

    命令描述
    PFADD key element1 [elememt2..]添加指定元素到 HyperLogLog 中
    PFCOUNT key [key]返回给定 HyperLogLog 的基数估算值。
    PFMERGE destkey sourcekey [sourcekey..]将多个 HyperLogLog 合并为一个 HyperLogLog
    • PFADD–PFCOUNT
    127.0.0.1:6379> PFADD myelemx a b c d e f g h i j k # 添加元素
    (integer) 1
    127.0.0.1:6379> type myelemx # hyperloglog底层使用String
    string
    127.0.0.1:6379> PFCOUNT myelemx # 估算myelemx的基数
    (integer) 11
    127.0.0.1:6379> PFADD myelemy i j k z m c b v p q s
    (integer) 1
    127.0.0.1:6379> PFCOUNT myelemy
    (integer) 11
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • PFMERGE
    127.0.0.1:6379> PFMERGE myelemz myelemx myelemy # 合并myelemx和myelemy 成为myelemz
    OK
    127.0.0.1:6379> PFCOUNT myelemz # 估算基数
    (integer) 17
    
    • 1
    • 2
    • 3
    • 4

    BitMaps(位图)

    使用位存储,信息状态只有 0 和 1,操作二进制位进行记录

    Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。

    应用场景

    签到统计、状态统计,统计用户信息:活跃,登陆状态等

    命令描述
    setbit key offset value为指定key的offset位设置值
    getbit key offset获取offset位的值
    bitcount key [start end]统计字符串被设置为1的bit数,也可以指定统计范围按字节
    bitop operration destkey key[key..]对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
    BITPOS key bit [start] [end]返回字符串里面第一个被设置为1或者0的bit位。start和end只能按字节,不能按位
    • setbit–getbit
    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 # 获取第2位的数值
    (integer) 1
    127.0.0.1:6379> getbit sign 3
    (integer) 1
    127.0.0.1:6379> getbit sign 4 # 未设置默认是0
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • bitcount
    127.0.0.1:6379> BITCOUNT sign # 统计sign中为1的数量
    (integer) 4
    
    • 1
    • 2

    bitmaps的底层

    设置以后能get到的值是:\xA2\x80,所以bitmaps是一串从左到右的二进制串

  • 相关阅读:
    软件设计不是CRUD(17):低耦合模块设计理论——总结
    Ubuntu安装hadoop集群 hive spark scala
    Ansible的命令及常用模块详解
    【Flutter 面试题】 可以嵌套使用 Scaffold 吗?为什么或者为什么不?
    自媒体创作审核不通过怎么办?教你一个小技巧,提高效率
    充气膜建筑的形体设计
    Java继承初步讲解
    缓存服务——Redis集群(2)
    Tlsr8258开发-添加软件定时器
    考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之第七课二次型
  • 原文地址:https://blog.csdn.net/qq_43585922/article/details/128125841