• Redis学习记录------Redis6发布和订阅以及三个新数据类型(五)


    Redis学习记录------Redis6发布和订阅(五)

    1.什么时发布和订阅

    Redis发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接受消息。
    Redis客户端可以订阅任意数量的频道,发布者可以有很多个频道。

    发布订阅命令实现

    在客户端中
    SUBSCRIBE <频道名>

    SUBSCRIBE pindao1
    
    • 1

    在另一个客户端中,给pindao1发布消息hello
    publish <频道名> <具体消息>

    publish pindao1  hello
    
    • 1

    返回1,是订阅者数量
    注意: redis发布消息没有持久化,想要再收到,只能再重新发布。

    Redis6的新数据类型

    Bitmaps

    现在计算机采用二进制作为信息的基础单元,1个字节等于8位,比如”abc",对应ASCII码分别是97、98、99,对应二进制分别是01100001、01100010、01100011.
    合理的操作位,能够提高内存使用率和开发效率
    1.bitmaps本身不是一种数据类型,实际上它就是字符串(key,value),但是它可以对字符串的位进行操作。
    2.bitmaps单独提供了一套命令,所以再Redis中使用Bitmaps和使用字符串的方法不太相同,可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标再bitmaps中叫做偏移量。
    key value:011000010110001001100011

    命令

    格式
    setbit 设置bitmaps中某个偏移量的值(0或1),偏移量从0开始
    举例:
    假设20个用户,userid=1,userid=6,userid=11,userid=15,userid=19的用户对网站进行了访问,访问过则记位1。key则取日期

    setbit unique:users:20220827 1 1
    setbit unique:users:20220827 6 1
    setbit unique:users:20220827 11 1
    setbit unique:users:20220827 15 1
    setbit unique:users:20220827 19 1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注:在第一次初始化Bitmaps时,假如偏移量特别大,那么整个初始化过程会执行比较慢,可能会造成Redis的阻塞。
    getbit :获取Bitmaps中某个偏移量的值(偏移量起始0)
    bitcount [start end]:统计Bitmaps中设置为1的bit数,也可以指定start起始位置,end结束位置,也可以使用负值,-1表示最后一位,-2表示倒数第二位
    比如:k1 01000001 01000000 00000000 00100001

    bitcount  K1 1 2   ,此时统计的的是01000000、以及00000000、,因此返回2
    bitcount  K1 0 -2   ,此时统计的的是01000001、01000000、以及00000000、,因此返回3
    
    • 1
    • 2

    注意:redis的setbit设置或清除的时bit位置,而bitcount计算的是byte位置。
    bitop and(or/not/xor) [key…] :bitop是一个复合操作,它可以做多个Bitmaps的and(交集)、or(并集)、not(非)、xor(异或)操作,并将结果保存在destkey中。
    统计202201,202202都访问过博客的用户数量:
    即返回unique:users:202201和unique:users:202202中的共有的(其实是偏移量相同的)1的数量.
    k1:and:k2 为命名的新key

    bitop and k1:and:k2  unique:users:202201  unique:users:202202
    
    • 1

    Bitmaps和Set对比

    set每个用户id占用64位空间。而Bitmaps只占用1位。
    但是加入Bitmaps的使用频率很低,则会有大部分的0位,也会造成浪费。

    HyperLogLog

    在与统计相关的场景中,比如统计网站的PV(pageView页面访问量),可以使用Redis的incr,incrby轻松实现。
    像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等,需要去重和技术的问题如何解决?这种求集合中不重复元素个数的问题成为基数问题。
    基数问题解决方案:
    1.数据存储在Mysql表中,使用distinct count 计算不重复个数
    2.使用Redis提供的hash、set、bitmaps等数据结构来处理
    以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。
    HyperLogLog就用来做基数统计的算法,优点在于:在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的,并且是很小。
    在Redis中,每个HyperLogLog键只需要花费12KB的内存,可以计算接近2的64次方个不同元素的基数。
    但是HyperLogLog只会根据输入元素来计算基数,而不会存储元素本身,因此HyperLogLog不能像集合一样返回输入的各个元素
    基数:统计集合中不重复元素的个数。
    1、2、5、2、7、1
    基数集为:1、2、5、7
    基数为:4

    命令

    pfadd [element…]:添加指定元素到HyperLogLog中。加入后基数发生变化则返回1,否则返回0

    pfadd english a  返回1
    pfadd english b  返回1
    pfadd english a  返回0
    pfadd english d c 返回1
    
    • 1
    • 2
    • 3
    • 4

    pfcount :计算HyperLogLog的近似基数,也可以计算多个HyperLogLog,合并基数
    pfmerge :将1个或多个HyperLogLog合并后的结果存储到新的HyperLogLog中。类似合并+去重。

    Geospatial

    在Redis 3.2中增加了对GEO类型的支持,Geospatial地理信息的缩写,该类型就是元素2维坐标,Redis基于该类型,提供了经纬度设置,查询、范围查询、距离查询,经纬度Hash等常见操作。

    命令

    geoadd [ longitude latitude memeber] 添加地理位置(经度,纬度,名称)

    geoadd china:city 121.47 31.23 shanghai
    geoadd china:city 106.50 29.53 chongqing 144.05 22.52 shenzhen 166.38 39.90 beijing
    
    • 1
    • 2

    两极无法直接添加,一般会下载城市数据,直接通过Java程序一次性导入。
    有效经度从-180度到180度,有效维度从-85.05112878度到85.05112878度。
    当坐标位置超出指定范围时,会返回一个错误。
    已添加的数据,无法再次往里面添加。
    geopos [member…]获取指定地区的坐标值。
    geodist [m|km|ft|mi] 获取两个位置之间的直线距离。最后一个显示的距离单位。不指定默认使用米作为单位。
    georadius radius [m|km|ft|mi] :以给定的经纬度为中心,找出某个半径内的元素, 经度、维度、距离、单位

    georadius china:city 100 30 1000 km
    
    • 1
  • 相关阅读:
    msf对小米11进行安全渗透
    Nuxtjs在linux环境下部署笔记
    k8s最新版本1.24.3基于containerd的集群部署、打包和Jenkins流水线定义
    【C#语言】DataGridView删除行
    C#常识篇(一)
    自己编写程序publish出kitti数据集,可视化kitti数据集
    Uniapp 酷炫钱包页面模板 直接引用
    Go中原生http服务的实现方式
    罗翔:钱没了可以再挣,工作没了可以再找,朋友没了可以再交,爱情没了可以再去找。你生来就一无所有,何惧从头再来。...
    AJAX学习日记——Day 4
  • 原文地址:https://blog.csdn.net/cz_chen_zhuo/article/details/126534647