• Redis高级数据类型


    1.Redis相关配置信息

    服务器端设定

    • 设置服务器以守护进程的方式运行

      daemonize yes|no
      
    • 绑定主机地址 (只能此ip访问)

      bind 127.0.0.1
      
    • 设置服务器端口号

      port 6379
      
    • 设置数据库数量

      databases 16
      

    日志配置

    • 设置服务器以指定日志记录级别

      loglevel debug|verbose|notice|warning
      
    • 日志记录文件名

      logfile 端口号.log
      

    注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写日志IO的频度

    客户端限制配置 :

    • 设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接

      maxclients 0
      
    • 客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0

      timeout 300(s)
      

    多服务器快捷配置 :

    • 导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护

      include /path/server-端口号.conf
      

    2. Bitmaps 类型

    现有一个业务场景, 有八个人,编号分别为 1-8,,此时需要在程序中存储他们的性别,分别使用0(女),1(男),表示,

    如果按照正常逻辑,我们使用最节省空间的方式,使用一个byte 存储一个人的性别,那么执行8byte 的空间即可表达清楚.

    那么有没有更加节省空间的方式呢, 有,我们知道 一个byte ,表示8位, 例如11111111, 使用二进制的方式,我们可以发现, 在此场景中, 一个byte 就可以表达完整此八人的性别表示, 例如11110000,表示前四个人是男性,后四人是女性

    如果使用Redis,则可以使用String 类型操作,把一组数据作为一个字符串操作,但是操作起来非常麻烦, 修改字符串的指定位置, 为了方便操作, Redis 为我们提供了专门的数据类型 Bitmaps

    Bitmaps类型的基础操作

    • 获取指定key对应偏移量上的bit值

      getbit key offset //取数据中第 offset位的 数据
      
    • 设置指定key对应偏移量上的bit值,value只能是1或0

      setbit key offset value // 设置 第 offset 位的数据为 0或1
      

    注意: 若直接设置 offset 值为很大的值, 例如 setbit k 1000 0 ,即设置第1000位的数字位 0,那么前面 999位的数字则全部补0

    扩展操作:

    业务场景, 电影网站每天对电影有没有被点播的统计

    • 统计每天某一部电影是否被点播
    • 统计每天有多少部电影被点播
    • 统计每周/月/年有多少部电影被点播
    • 统计年度哪部电影没有被点播

    对于每天每部电影有没有被点播,可以使用 电影的id作为offset, 如果被点播记录1,没有被点播,则记为0,

    并使用 时间作为key, 例如 20210119:0101011 ,20210119:1101101

    对于 每月的统计,则可以将该月30 天的所有数据位,进行 或 操作(全为0则为0,只要有1则为1),统计出的即是该电影本月有没有被点播

    相关操作:

    • 对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中

      bitop op destKey key1 [key2...] // 将 key1 ,key2 数据的所有位 进行 op操作, 并将结果存到 destKey中
      
      • and:交
      • or:并
      • not:非
      • xor:异或
    • 统计指定key中1的数量

      bitcount key [start end] //统计一个值中,数据为1的有多少为, 指定 start开始 end结束的 偏移量范围,不指定则全部
      

    redis 应用于信息状态统计,打卡考勤都可以使用此类型

    3.HyperLogLog 类型

    在说此类型时,先来看看什么是基数

    • 比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数

    那么此时如果有一个网站,需要统计一年的访问客户端电脑ip个数, 如果使用Set 集合的方式,每有一个新的ip,则往里面存,会自动去重,但是如果数据量太过庞大,则占据的存储量也十分大,

    对于这种需求,Redis 提供了 HyperLogLog 类型, 它是专门干这个事的

    LogLog 算法的底层实现

    示意图:

    1611068840234

    由于实现太过于简单,我懒得解释了,想要深入了解的....算你厉害

    基本操作

    • 添加数据

      pfadd key element [element ...]  // 将需要统计的数据加入到此中,例如一个ip
      
    • 统计数据

      pfcount key [key ...] // 统计此key 已经存放的元素基数
      
    • 合并数据

      pfmerge destkey sourcekey [sourcekey...] //合并多个key 到 destkey中
      

    示例:

    pfadd k  127.0.0.1
    pfadd k  127.0.0.1
    pfadd k  127.0.0.1
    pfadd k  192.168.0.1
    pfadd k  192.168.0.2
    pfcount k  //得出结果 : 3  
    

    相关说明:

    • 用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
    • 核心是基数估算算法,最终数值存在一定误差
    • 误差范围:基数估计的结果是一个带有 0.81% 标准错误的近似值
    • 耗空间极小,每个hyperloglog key占用了12K的内存用于标记基数
    • pfadd命令不是一次性分配12K内存使用,会随着基数的增加内存逐渐增大
    • Pfmerge命令合并后占用的存储空间为12K,无论合并之前数据量多少

    4. GEO 类型

    对于现今软件中用到位置信息的计算,例如附近的人,Redis提供了非常方便的操作方式

    相关命令:

    • geoadd : 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。 (如果要计算多个位置的关系,需要将这几个位置信息存到同一个key中)

      geoadd key longitude latitude member [longitude latitude member ...]
      
    • 获取坐标点 根据名称,得出的结果比较专一,不用深究

      geopos key member [member ...] 
      
    • 计算坐标点距离 单位 unit

      geodist key member1 member2 [unit]
      
    • 计算自定义某个点在指定坐标集中附近的点

      georadius key longitude latitude radius m|km|ft|mi // 例如 georadius geos 1.5 1.5 90 km
          // 在geos集合中的点在 坐标 1.5 1.5 90km范围内的
      
    • 计算指定坐标集里面某个坐标 附近的点

      georadiusbymember key member radius m|km|ft|mi //例如 georadiusbymember geos hz 180 km 
          //含义为 在geos坐标集中,点名为hz的 附近180km的坐标点
      
    • 计算经纬度hash值

      geohash key member [member ...]
      
  • 相关阅读:
    “回调地址”全攻略 java程序员
    超棒的纯Javascript实现的文件上传功能 Fine uploader java程序员
    帮助你操作数字和处理数字格式的javascript类库 Numeral.js java程序员
    正则表达式 java程序员
    一款非常棒的CSS 3D下拉式菜单实现Makisu java程序员
    Google的全新在线地图API演示网站 More than a map java程序员
    Android中的布局属性 java程序员
    整理一系列优秀的Android开发源码 java程序员
    Lambda表达式select()和where()的区别
    按公式产生随机数、java中的重载、递归、有关计算机计算的问题
  • 原文地址:https://www.cnblogs.com/xjwhaha/p/14300705.html
Copyright © 2020-2023  润新知