Redis教程

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

本文主要是介绍Redis 基本数据类型及应用场景,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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 基本数据类型及应用场景的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!