Skip to content

> Redis所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash

1.Redis数据结构简介

> Redis基础文章非常多,关于基础数据结构类型,我推荐你先看下官方网站内容在新窗口打开,然后再看下面的小结

首先对redis来说,所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。

![](https://raw.githubusercontent.com/ikunycj/xiaoba.blog-images/master/note/软件工程/数据库/Redis/1.Redis入门/img/Pasted image 20240522151334.png)

结构类型结构存储的值结构的读写能力
String字符串可以是字符串、整数或浮点数对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;
List列表一个链表,链表上的每个节点都包含一个字符串对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;
Set集合包含字符串的无序集合字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等
Hash散列包含键值对的无序散列表包含方法有添加、获取、删除单个元素
Zset有序集合和散列一样,用于存储键值对字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

2.基础数据结构详解

> 内容其实比较简单,我觉得理解的重点在于这个结构怎么用,能够用来做什么?所以我在梳理时,围绕图例命令执行场景来阐述。@pdai

1.String字符串

> String是redis中最基本的数据类型,一个key对应一个value。

String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

  • 图例 下图是一个String类型的实例,其中键为hello,值为world

![](https://raw.githubusercontent.com/ikunycj/xiaoba.blog-images/master/note/软件工程/数据库/Redis/1.Redis入门/img/Pasted image 20240522151348.png)

  • 命令使用
序号命令及描述
1SET key value <br>设置指定 key 的值。
2GET key <br>获取指定 key 的值。
3GETRANGE key start end <br>返回 key 中字符串值的子字符
4GETSET key value <br>将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5GETBIT key offset <br>对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
6MGET key1 [key2..] <br>获取所有(一个或多个)给定 key 的值。
7SETBIT key offset value <br>对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8SETEX key seconds value <br>将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
9SETNX key value <br>只有在 key 不存在时设置 key 的值。
10SETRANGE key offset value <br>用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11STRLEN key <br>返回 key 所储存的字符串值的长度。
12MSET key value [key value ...] <br>同时设置一个或多个 key-value 对。
13MSETNX key value [key value ...] <br>同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14PSETEX key milliseconds value <br>这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15INCR key <br>将 key 中储存的数字值增一。
16INCRBY key increment <br>将 key 所储存的值加上给定的增量值(increment) 。
17INCRBYFLOAT key increment <br>将 key 所储存的值加上给定的浮点增量值(increment) 。
18DECR key <br>将 key 中储存的数字值减一。
19DECRBY key decrement <br>key 所储存的值减去给定的减量值(decrement) 。
20APPEND key value <br>如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
  • 实战场景
    • 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
    • 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
    • session:常见方案spring session + redis实现session共享,

2.List列表

> Redis中的List其实就是链表(Redis用双端链表实现List)。

使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

  • 图例 ![](https://raw.githubusercontent.com/ikunycj/xiaoba.blog-images/master/note/软件工程/数据库/Redis/1.Redis入门/img/Pasted image 20240522151403.png)

  • 命令使用 下表列出了列表相关的基本命令:

序号命令及描述
1BLPOP key1 [key2 ] timeout <br>移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2BRPOP key1 [key2 ] timeout <br>移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
3BRPOPLPUSH source destination timeout <br>从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4LINDEX key index <br>通过索引获取列表中的元素
5LINSERT key BEFORE|AFTER pivot value <br>在列表的元素前或者后插入元素
6LLEN key <br>获取列表长度
7LPOP key <br>移出并获取列表的第一个元素
8LPUSH key value1 [value2] <br>将一个或多个值插入到列表头部
9LPUSHX key value <br>将一个值插入到已存在的列表头部
10LRANGE key start stop <br>获取列表指定范围内的元素
11LREM key count value <br>移除列表元素
12LSET key index value <br>通过索引设置列表元素的值
13LTRIM key start stop <br>对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
14RPOP key <br>移除列表的最后一个元素,返回值为移除的元素。
15RPOPLPUSH source destination <br>移除列表的最后一个元素,并将该元素添加到另一个列表并返回
16RPUSH key value1 [value2] <br>在列表中添加一个或多个值到列表尾部
17RPUSHX key value <br>为已存在的列表添加值
  • 使用列表的技巧

    • lpush+lpop=Stack(栈)
    • lpush+rpop=Queue(队列)
    • lpush+ltrim=Capped Collection(有限集合)
    • lpush+brpop=Message Queue(消息队列)
  • 命令执行

  • 实战场景

    • 微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。
    • 消息队列

3.Set集合

> Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

集合对象的编码可以是 intset 或者 hashtable。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。 Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

  • 图例

![](https://raw.githubusercontent.com/ikunycj/xiaoba.blog-images/master/note/软件工程/数据库/Redis/1.Redis入门/img/Pasted image 20240522151415.png)

下表列出了 Redis 集合基本命令:

序号命令及描述
1SADD key member1 [member2] <br>向集合添加一个或多个成员
2SCARD key <br>获取集合的成员数
3SDIFF key1 [key2] <br>返回第一个集合与其他集合之间的差异。
4SDIFFSTORE destination key1 [key2] <br>返回给定所有集合的差集并存储在 destination 中
5SINTER key1 [key2] <br>返回给定所有集合的交集
6SINTERSTORE destination key1 [key2] <br>返回给定所有集合的交集并存储在 destination 中
7SISMEMBER key member <br>判断 member 元素是否是集合 key 的成员
8SMEMBERS key <br>返回集合中的所有成员
9SMOVE source destination member <br>将 member 元素从 source 集合移动到 destination 集合
10SPOP key <br>移除并返回集合中的一个随机元素
11SRANDMEMBER key [count] <br>返回集合中一个或多个随机数
12SREM key member1 [member2] <br>移除集合中一个或多个成员
13SUNION key1 [key2] <br>返回所有给定集合的并集
14SUNIONSTORE destination key1 [key2] <br>所有给定集合的并集存储在 destination 集合中
15SSCAN key cursor [MATCH pattern] [COUNT count] <br>迭代集合中的元素
  • 实战场景
    • 标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
    • 点赞,或点踩,收藏等,可以放到set中实现

4.Hash散列

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

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

  • 图例

![](https://raw.githubusercontent.com/ikunycj/xiaoba.blog-images/master/note/软件工程/数据库/Redis/1.Redis入门/img/Pasted image 20240522151427.png)

  • 命令使用 下表列出了 redis hash 基本的相关命令:
序号命令及描述
1HDEL key field1 [field2] <br>删除一个或多个哈希表字段
2HEXISTS key field <br>查看哈希表 key 中,指定的字段是否存在。
3HGET key field <br>获取存储在哈希表中指定字段的值。
4HGETALL key <br>获取在哈希表中指定 key 的所有字段和值
5HINCRBY key field increment <br>为哈希表 key 中的指定字段的整数值加上增量 increment 。
6HINCRBYFLOAT key field increment <br>为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7HKEYS key <br>获取哈希表中的所有字段
8HLEN key <br>获取哈希表中字段的数量
9HMGET key field1 [field2] <br>获取所有给定字段的值
10HMSET key field1 value1 [field2 value2 ] <br>同时将多个 field-value (域-值)对设置到哈希表 key 中。
11HSET key field value <br>将哈希表 key 中的字段 field 的值设为 value 。
12HSETNX key field value <br>只有在字段 field 不存在时,设置哈希表字段的值。
13HVALS key <br>获取哈希表中所有值。
14HSCAN key cursor [MATCH pattern] [COUNT count] <br>迭代哈希表中的键值对。

更多命令请参考:https://redis.io/commands

  • 实战场景
    • 缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。

5.Zset有序集合

> Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的, 但分数(score)却可以重复。有序集合是通过两种数据结构实现:

  1. 压缩列表(ziplist): ziplist是为了提高存储效率而设计的一种特殊编码的双向链表。它可以存储字符串或者整数,存储整数时是采用整数的二进制而不是字符串形式存储。它能在O(1)的时间复杂度下完成list两端的push和pop操作。但是因为每次操作都需要重新分配ziplist的内存,所以实际复杂度和ziplist的内存使用量相关
  2. 跳跃表(zSkiplist): 跳跃表的性能可以保证在查找,删除,添加等操作的时候在对数期望时间内完成,这个性能是可以和平衡树来相比较的,而且在实现方面比平衡树要优雅,这是采用跳跃表的主要原因。跳跃表的复杂度是O(log(n))。

下表列出了 redis 有序集合的基本命令:

序号命令及描述
1ZADD key score1 member1 [score2 member2] <br>向有序集合添加一个或多个成员,或者更新已存在成员的分数
2ZCARD key <br>获取有序集合的成员数
3ZCOUNT key min max <br>计算在有序集合中指定区间分数的成员数
4ZINCRBY key increment member <br>有序集合中对指定成员的分数加上增量 increment
5ZINTERSTORE destination numkeys key [key ...] <br>计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
6ZLEXCOUNT key min max <br>在有序集合中计算指定字典区间内成员数量
7ZRANGE key start stop [WITHSCORES] <br>通过索引区间返回有序集合指定区间内的成员
8ZRANGEBYLEX key min max [LIMIT offset count] <br>通过字典区间返回有序集合的成员
9ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] <br>通过分数返回有序集合指定区间内的成员
10ZRANK key member <br>返回有序集合中指定成员的索引
11ZREM key member [member ...] <br>移除有序集合中的一个或多个成员
12ZREMRANGEBYLEX key min max <br>移除有序集合中给定的字典区间的所有成员
13ZREMRANGEBYRANK key start stop <br>移除有序集合中给定的排名区间的所有成员
14ZREMRANGEBYSCORE key min max <br>移除有序集合中给定的分数区间的所有成员
15ZREVRANGE key start stop [WITHSCORES] <br>返回有序集中指定区间内的成员,通过索引,分数从高到低
16ZREVRANGEBYSCORE key max min [WITHSCORES] <br>返回有序集中指定分数区间内的成员,分数从高到低排序
17ZREVRANK key member <br>返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18ZSCORE key member <br>返回有序集中,成员的分数值
19ZUNIONSTORE destination numkeys key [key ...] <br>计算给定的一个或多个有序集的并集,并存储在新的 key 中
20ZSCAN key cursor [MATCH pattern] [COUNT count] <br>迭代有序集合中的元素(包括元素成员和元素分值)
  • 实战场景
    • 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。

6.通用命令(redis命令不分大小写)

下表给出了与 Redis 键相关的基本命令:

序号命令及描述
1DEL key <br>该命令用于在 key 存在时删除 key。
2DUMP key <br>序列化给定 key ,并返回被序列化的值。
3EXISTS key <br>检查给定 key 是否存在。
4EXPIRE key seconds <br>为给定 key 设置过期时间,以秒计。
5EXPIREAT key timestamp <br>EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
6PEXPIRE key milliseconds <br>设置 key 的过期时间以毫秒计。
7PEXPIREAT key milliseconds-timestamp <br>设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
8KEYS pattern <br>查找所有符合给定模式( pattern)的 key 。
9MOVE key db <br>将当前数据库的 key 移动到给定的数据库 db 当中。
10PERSIST key <br>移除 key 的过期时间,key 将持久保持。
11PTTL key <br>以毫秒为单位返回 key 的剩余的过期时间。
12TTL key <br>以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
13RANDOMKEY <br>从当前数据库中随机返回一个 key 。
14RENAME key newkey <br>修改 key 的名称
15RENAMENX key newkey <br>仅当 newkey 不存在时,将 key 改名为 newkey 。
16SCAN cursor [MATCH pattern] [COUNT count] <br>迭代数据库中的数据库键。
17TYPE key <br>返回 key 所储存的值的类型。

评论区

欢迎留言、补充或勘误。

xiaoba.blog