zoukankan      html  css  js  c++  java
  • Redis的5种基本数据结构以及基本操作命令

      来源于《Redis深度历险:核心原理与应用实践》的阅读笔记。
    Redis的常见用途:

    • 记录帖子的点赞数,评论数和点击数(hash);
    • 记录用户的帖子ID列表(便于快速显示用户帖子列表)(zset);
    • 记录帖子的标题、摘要、作者和封面信息,用于列表展示(hash);
    • 记录帖子的点赞用户ID列表,评论ID列表,用于显示和去重计数(zset);
    • 缓存近期热帖(占用空间较大),减少DB压力(hash);
    • ...

    5种基础数据结构
    string
       内部为字符数组;
       常见JSON序列化为字符串,用户取时会经过一次反序列化过程;
       采用预分配冗余空间来减少内存的频繁分配,分配的实际空间要比当前字符串长度大一些。小于1M时,扩容时空间加倍;超过1M时,扩容每次增加1M,最大长度为512MB

       针对单个字符串的操作:

       针对多个字符串的批量操作:

       过期设置

       过期时间有一个需要注意的点,当用setex或者expire给某个key-value设置过期时间之后,再次set一个value时,过期时间就会失效

       可用于设置分布式锁

       计数范围是signed long的最大最小之间,超出范围会报错

    list
      双向链表,插入和删除的操作复杂度为O(1),但是查找为O(n)
      当列表弹出最后一个元素之后,该结构被删除,系统收回内存
      常被用为异步队列,将需要延后处理的任务结构体序列化成字符串,塞入redis链表,另一个线程从该list中轮训处理

      左右都可以进可以出,左进右出或者右进左出就是队列,左进左出或者右进右出就是栈。

      慎用lindex lrange ltrim,都是O(n)的操作,会随着参数的大小变化而导致操作耗时的变化

      在元素较少时,list会使用一块连续的内存存储,这个结构是ziplist。当数据量比较多时才会改为quicklist,这样在一定程度上缓解了查询的压力。

    hash
      类似于HashMap中的hash数组-链表的结构。它的value只能是字符串,且与HashMap的rehash方式不同。
      在扩展时,会保留新旧两个hash结构,并在之后的hash操作指令和定时任务过程中,逐渐地将数据迁移过去。
      基本操作与之前的也类似,有批量操作,有单独的操作,也有统计整个数量的,以及增加integer类型value值的:

      这种hashname key value的结构在存和取时相较于string来说有比较大的灵活性。举个例子,如果string类型存{"id":"1","name":"john","age":"12"}时需要改、查时需要将整个对象进行操作,而hash这种结构就可以只操作部分。如果string结构想节省流量而分化key的话,如userid.id,userid.name作为不同的key,那么集中管理就比较麻烦,也容易遗漏。但hash这种便捷也是以空间消耗更大作为代价的,所以如何选择也是需要根据场景考虑。
    set
      类似于HashSet,内部的键无序且唯一。set内部的实现相当于一个特殊的hash,即所有的value都是一个值null
      基本操作如下:

    zset
      zset相较于set而言,zset的每个value也是唯一的,但不同的是zset会根据不同的权重值给这些value,后续可以用这种权重给value排序
      内部实现是一种“跳跃列表的数据结构”
      基本操作如下:
     

      zset是一种跳跃列表的结构。相较于可以直接使用二分查找的有序数组而言,有序的链表是没有办法进行二分查找的,因为地址并不连续,所以不能直接通过计算来获取位置信息,只能遍历。为了减少O(n)查找带来的时间消耗,跳跃列表采用分层的办法,挑出标记位,从而减少查找复杂度。标记位的层数越多,间隔设置越细致,查找的时间消耗越少,复杂度会变为O(logn),但是空间消耗越大,这也是为了满足zset的查找、排序和插入的需求同时,平衡时间和空间消耗的一种策略。

     

     

  • 相关阅读:
    [纯奇技淫巧] 特征根
    杂题20200528
    杂题20200509
    杂题20200419
    杂题20200415
    杂题20200407
    杂题20200314
    Educational Codeforces Round 83 简要题解
    一种简单的dp trick
    杂题20200304
  • 原文地址:https://www.cnblogs.com/bruceChan0018/p/15640451.html
Copyright © 2011-2022 走看看