美文网首页
Redis 基本数据类型及应用场景

Redis 基本数据类型及应用场景

作者: Ansme | 来源:发表于2021-06-11 17:28 被阅读0次

    redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议,基于内存,可选持久化的键值对 (key-value)存储系统,是跨平台的非关系型数据库;其常用基础数据类型为:String(字符串)Hash(哈希)List(列表)Set(集合)Sorted Set(有序集合)

    String(字符串)

    string 是 redis 最基本的类型,一个 key 对应一个 value,通过使用 SETGET 命令来设置和取出字符串值,值得注意的是 SET 命令会替换原有 key 存储的数据和数据类型;value 可以存储任何类型的字符串,比如,可以将一个 jpeg 类型的图片存储到 value 中,value 最大能存储 512MB 的数据

    编码方式:

    • int 编码:保存 long 型的 64 位有符号整数
    • embstr 编码:保存长度小于 44 字节的字符串
    • raw 编码:保存长度大于 44 字节的字符串

    常用指令:

    • SET 设置指定 key 的值
    • GET 获取指定 key 的值
    • SETNX 只有在 key 不存在时设置 key 的值
    • INCR 对存储在指定 key 的数值执行原子的加 1 操作,如果指定的key不存在,那么在执行 incr 操作之前,会先将它的值设定为 0
    • INCRBY 对存储在指定 key 的数值执行加指定数值操作,如果 key 不存在,操作之前,key 就会被置为 0
    • GETSET 对指定 key 设置新值,同时返回旧值

    应用场景:

    • 常规 key-value 存储
    • 常规计数:利用 incr 实现原子计数
    127.0.0.1:6379> set name Ansme
    OK
    127.0.0.1:6379> get name
    "Ansme"
    127.0.0.1:6379> setnx nxkey 1
    (integer) 1
    127.0.0.1:6379> get nxkey
    "1"
    127.0.0.1:6379> incr counter
    (integer) 1
    127.0.0.1:6379> get counter
    "1"
    127.0.0.1:6379> incrby counter 10
    (integer) 11
    127.0.0.1:6379> get counter
    "11"
    127.0.0.1:6379> getset counter 5
    "11"
    127.0.0.1:6379> get counter
    "5"
    

    Hash(哈希)

    hash 是一个键值(key=>value)对集合,Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

    编码方式:

    • ziplist(压缩列表): 当哈希类型的元素个数小于 hash-max-ziplist-entries 配置(默认512个),同时所有值都小于 hash-maxziplist-value 配置(默认为64字节)
    • hashtable(哈希表): 当哈希类型无法满足 ziplist 要求时

    常用指令:

    • HMSET 同时将多个 field-value (域-值)对设置到哈希表 key 中
    • HMGET 获取所有给定字段的值
    • HSET 将哈希表 key 中的字段 field 的值设为 value
    • HGET 获取存储在哈希表中指定字段的值
    • HKEYS 获取哈希表中的所有字段
    • HVALS 获取哈希表中的所有值
    • HEXISTS 查看哈希表 key 中,指定的字段是否存在
    • HDEL 删除一个或多个哈希表字段

    应用场景:

    • 对象存储:hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
    127.0.0.1:6379> hmset car brand bwm model m4 color black
    OK
    127.0.0.1:6379> hkeys car
    1) "brand"
    2) "model"
    3) "color"
    127.0.0.1:6379> hmget car brand model color
    1) "bwm"
    2) "m4"
    3) "black"
    127.0.0.1:6379> hvals car
    1) "bwm"
    2) "m4"
    3) "black"
    

    List(列表)

    list 是简单的字符串列表,按照插入顺序排序,可以在头部和尾部插入新的元素,同时可以在头部或尾部取出元素

    编码方式:

    • ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认512个),同时列表中每个元素的值都小于 list-max-ziplist-value 配置时(默认64字节)
    • linkedlist(链表):当列表类型无法满足 ziplist 的条件时

    常用指令:

    • LPUSH 将一个或多个值插入到列表头部
    • LPOP 移出并获取列表的第一个元素
    • RPUSH 在列表中添加一个或多个值
    • RPOP 移除列表的最后一个元素,返回值为移除的元素
    • LRANGE 返回存储在 key 的列表里指定范围内的元素,包含范围最右边的那个元素
    • LTRIM 修剪一个已存在的 list,这样 list 就会只包含指定范围的指定元素
    • BRPOP 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

    应用场景:

    • 消息队列:利用 lpushrpop 或者 lpoprpush 实现
    • 最新内容:利用 lpush 往列表中插入新元素,然后通过 lrange 获取最新的元素列表
    127.0.0.1:6379> lpush cars bmw
    (integer) 1
    127.0.0.1:6379> lpush cars benz
    (integer) 2
    127.0.0.1:6379> lpush cars audi
    (integer) 3
    127.0.0.1:6379> llen cars
    (integer) 3
    127.0.0.1:6379> lrange cars 0 2
    1) "audi"
    2) "benz"
    3) "bmw"
    127.0.0.1:6379> lpop cars
    "audi"
    127.0.0.1:6379> rpop cars
    "bmw"
    127.0.0.1:6379> brpop cars 5
    1) "cars"
    2) "benz"
    127.0.0.1:6379> brpop cars 5
    (nil)
    (5.02s)
    

    Set(集合)

    set 是 string 类型的无序集合(没有排序,不重复)

    编码方式:

    • intset(整数集合):当集合中的元素都是整数且元素个数小于 set-max-intset-entries 配置(默认512个)
    • hashtable(哈希表):当集合类型无法满足 intset 的条件时

    常用指令:

    • SADD 添加一个或多个成员到集合
    • SREM 从集合中删除一个或多个元素
    • SCARD 获取集合中的元素数量
    • SDIFF 返回第一个集合与其他集合之间的差异
    • SINTER 返回给定所有集合的交集
    • SISMEMBER 判断元素是否是集合的成员
    • SMEMBERS 返回集合中的所有成员

    应用场景:

    • 共同好友列表:利用 SINTER 命令即可快速获得给定集合的交集
    • 中奖名单:应用去重的特性,确保中奖用户不会重复
    127.0.0.1:6379> sadd types string list hash set zset
    (integer) 5
    127.0.0.1:6379> scard typess
    (integer) 0
    127.0.0.1:6379> scard types
    (integer) 5
    127.0.0.1:6379> smembers types
    1) "list"
    2) "string"
    3) "set"
    4) "hash"
    5) "zset"
    127.0.0.1:6379> sismember types array
    (integer) 0
    127.0.0.1:6379> sismember types list
    (integer) 1
    127.0.0.1:6379> srem types list
    (integer) 1
    127.0.0.1:6379> srem types list hash
    (integer) 1
    127.0.0.1:6379> smembers types
    1) "zset"
    2) "string"
    3) "set"
    127.0.0.1:6379> sadd typeB string list hash
    (integer) 3
    127.0.0.1:6379> sinter types typeB
    1) "string"
    127.0.0.1:6379> sdiff types typeB
    1) "zset"
    2) "set"
    

    Sorted Set(有序集合)

    SortedSet 也叫 zset 一方面它是个 set,保证了内部 value 的唯一性,另一方面,它可以给每个 value 赋予一个 score,代表这个 value 的排序权重

    编码方式:

    • ziplist(压缩列表):当有序集合的元素个数小于 zset-max-ziplist-entries 配置(默认128个),同时每个元素的值都小于 zset-max-ziplist-value 配置(默认64字节)时
    • skiplist(跳跃表):当 ziplist 条件不满足时

    常用指令:

    • ZADD 向有序集合添加一个或多个成员,或者更新已存在成员的分数
    • ZREM 从有序集合中删除一个或多个元素
    • ZRANK 确定有序集合中元素的索引
    • ZCARD 获取有序集合的成员数
    • ZCOUNT 计算在有序集合中指定区间分数的成员数
    • ZRANGE 通过索引区间返回有序集合指定区间内的成员
    • ZREVRANGE 通过索引返回有序集中指定区间内的成员,分数从高到低
    • ZRANGEBYSCORE 通过分数返回有序集合指定区间内的成员
    • ZREVRANGEBYSCORE 通过分数返回有序集合指定区间内的成员,分数从高到低

    应用场景:

    • 直播礼物榜单:zset 可以实现动态的排行榜,例如可以用来存储直播礼品榜单,可以使用 value 存储粉丝 ID,使用 score 存储粉丝礼品数量,从而实现礼品榜单
    • 成绩排行榜: 使用 value 存储学生 ID,使用 score 存储学生成绩,实现成绩排名
    127.0.0.1:6379> zadd scores 100 ansme 98 bob 99 lily 90 lucy
    (integer) 4
    127.0.0.1:6379> zrange scores 0 5
    1) "lucy"
    2) "bob"
    3) "lily"
    4) "ansme"
    127.0.0.1:6379> zrevrange scores 0 5
    1) "ansme"
    2) "lily"
    3) "bob"
    4) "lucy"
    

    (如有错误,欢迎指正)

    相关文章

      网友评论

          本文标题:Redis 基本数据类型及应用场景

          本文链接:https://www.haomeiwen.com/subject/pgeveltx.html