暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis的数据类型

Coding的哔哔叨叨 2020-08-28
453

        🙋Redis的一大特性就是有丰富的数据类型,这篇文章我们来整理总结一下Redis的数据类型。

        Redis的数据类型有如下5种:String、hash、list、set、zset

  • string

        string是redis 最基本的数据类型。一个 key 对应一个 value。

        string是二进制安全的。也就是说 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。

        string 类型是 redis 最基本的数据类型,string 类型的值最大能存储 512 MB。

理解:string 就像是 java 中的 map 一样,一个 key 对应一个 value。

  • hash

        Redis hash是一个键值对(key - value)集合。

        Redis hash是一个 string 类型的 key 和 value 的映射表,hash 特别适合用于存储对象。

理解:可以将 hash 看成一个 key - value 的集合。也可以将其想成一个 hash 对应着多个 string。

        与 string 区别:string 是一个key-value键值对,而hash是多个key - value 键值对。

  • list

        Redis 列表是简单的字符串列表,按照插入顺序排序。我们可以往列表的左边或者右边添加元素。

        我们可以看出 list 就是一个简单的字符串集合,和 Java 中的 list 相差不大,区别就是这里的 list 存放的是字符串。list内的元素是可重复的。

  • set

        redis的set是字符串类型的无序集合。集合是通过哈希表实现的,因此添加、删除、查找的复杂度都是O(1)。

        redis 的 set 与 java 中的 set 还是有点区别的。

        redis 的 set 是一个 key 对应着 多个字符串类型的 value,也是一个字符串类型的集合,但是和 redis 的 list 不同的是 set 中的字符串集合元素不能重复,但是 list 可以。

  • Zset

        redis zset 和 set 一样都是 字符串类型元素的集合,并且集合内的元素不能重复。

       不同的是,zset 每个元素都会关联一个 double 类型的分数。redis 通过分数来为集合中的成员进行从小到大的排序。

        zset的元素是唯一的,但是分数(score)却可以重复。

        zset 是按照分数的大小来排序的。

        🙇以上5中数据类型的相关命令在我们的日常开发中应该是很常用了,这儿就不打算进行总结整理了,如果有对哪个数据类型不熟悉,或者对命令不熟悉,自行百度学习学习。


        🙋接下来我打算说一个redis中特殊的数据类型:bitmap,当然并不是除上面5中数据类型外新加的数据类型,也是在上面5中数据类型的基础上的,配合新加的命令实现一些非常规操作。其实除了bitmap,redis中还有一些其他的特殊数据类型如:geo、hyperloglog这些个我是真没用过,我不说了。

  • bitmap

      BitMap就是通过一个 bit 位来表示某个元素对应的值或者状态,每个bit位只有0或1两个值,也就是说每个bit为最多能存储的信息是2。其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。从redis2.2.0开始新加了setbit、getbit、bitcount等几个bitmap的命令,但是并没有新加数据类型。

  • 优势:

    1. 基于最小单位bit进行存储,所以非常节省空间。

    2. 设置的时候空间复杂度为O(1),读取的时候空间复杂度也是O(1)。所以读写操作是非常快的。

    3. 二进制的数据存储,进行相关位运算是非常快的。

    4. 扩容方便。

  • 限制:

    1. redis中bit映射限制为512M内,即最大为2^32位。所以建议每个key的位数都控制一下,而且位数越长读取所需要的时间花销也越大。

    #offset必须是数字,value只能是0或1。bit默认是0。
    SETBIT key offset value
    #返回一个key的某一位的信息
    getbit key offset
    #返回一个key从start到end字节中bit=1的数量
    bitcount key [start end]
    #对key1 key2进行位运算,结果放在destkey中,option:ADD、OR、NOT、XOR
    bitop option destkey key1 key2...
    复制
    • 应用场景:简单举几个例子说明一下bitmap的应用场景,更多的场景需要同志们自行动动大脑了。

      • 用户签到。在很多应用中需要统计用户一个月或一周的签到情况。我们可以以用户uid和月份为key,下面是使用bitmap的实现:

      >setbit 202008:uid 1 1 # 202008月第一天签到
      (integer) 0
      >setbit 202008:uid 3 1 # 202008月第三天签到
      (integer) 0
      >bitcount 202008:uid #202008月总计签到次数
      (integer) 2
      复制
        • 活跃用户统计。日期为key,用户uid为offset,当天如果用户有登陆过服务,就设置活跃度为1。统计当天或者几天的活跃度。

        # 20200825
        > setbit 20200825 2341 1
        > setbit 20200825 2552 1
        > bitcount 20200825
        (integer) 2
        # 20200826
        > setbit 20200826 2552 1
        > bitcount 20200826
        (integer) 2
        # 统计0825和0826两天都在的活跃度。
        > bitop and 20200825_26 20200825 20200826
        (integer) 1
        复制

        注意bitcount key [ start end] 令,start和end表示的是字节,而不是bit位。看代码:

          SETBIT online 0 1
          SETBIT online 1 1
          SETBIT online 8 1
          > bitcount online
          (integer) 3
          > bitcount online 0 0
          (integer) 2
          > bitcount online 0 1
          (integer) 3
          > bitcount online 1 1
          (integer) 1
          复制


          不积跬步,无以至千里。

          文章有帮助的话,点个转发、在看呗

          谢谢支持哟 (*^__^*)

          复制

          END


          👇


          文章转载自Coding的哔哔叨叨,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论