前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 数据类型总结

Redis 数据类型总结

作者头像
windealli
发布2024-05-20 14:42:08
1580
发布2024-05-20 14:42:08
举报
文章被收录于专栏:windealliwindealli

一、概述

Redis是一个开源的,基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

Redis支持多种类型的数据结构,包括:

  • 字符串(String)
  • 列表(List)
  • 集合(Set)
  • 有序集合(Sorted Set)
  • 哈希表(Hash)
  • Bitmap
  • HyperLogLog
  • 地理空间索引(Geo)
  • Streams。

二、字符串 String

1. String 类型简介

字符串Strings是Redis最基本的数据类型,它是二进制安全的。一个Redis字符串可以包含任何类型的数据,比如jpg图片或者序列化的对象。一个字符串类型的值最大能存储512MB。

2. String 类型的基本用法

以下是String类型的常见命令和用法

代码语言:javascript
复制
SET mykey "Hello"  -- 设置键值
GET mykey  -- 获取键值
DEL mykey  -- 删除键值
APPEND mykey " World"  -- 追加值到现有的键值
SETEX mykey 10 "Hello"  -- 设置键值,并设置键的过期时间(例如,10秒)
MSET key1 "Hello" key2 "World"  -- 批量设置键值
MGET key1 key2  -- 批量获取键值
INCR mycounter  -- 将键值递增1
DECR mycounter  -- 将键值递减1
INCRBY mycounter 10  -- 将键值按给定数值递增(例如,递增10)
DECRBY mycounter 10  -- 将键值按给定数值递减(例如,递减10)

3. String 类型的实现原理

Redis的字符串类型的值是动态字符串SDS,可以修改的字符串长度。内部结构实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多分配1M的空间。需要注意的是字符串最大长度为512M。

4. String 类型的应用场景

字符串是最常用的数据类型,常见的使用场景有:

  • 缓存:将查询结果缓存到字符串中,下次查询直接从Redis获取,提高系统性能。
  • 计数器:Redis的字符串可以实现原子操作,常用于记录网页访问次数等计数功能。
  • 分布式锁:利用Redis的SETNX命令实现分布式锁。
  • 数据共享:可以将数据以字符串形式存储在Redis中,实现多个应用之间的数据共享。

5. 简单字符串SDS

SDS是Redis的默认字符串表示,它是Redis的基础数据结构,用于构建更复杂的数据结构如列表、哈希表等。SDS相比于C语言的字符串,提供了更高的效率和灵活性。

SDS的数据结构包含三部分:

  1. len:表示SDS的长度,即字符串的实际长度。
  2. free:表示SDS未使用的空间长度。
  3. buf[]:字节数组,用于存储实际的字符串数据,这个数组的长度是len+free+1,多出来的1是为了存储字符串的结束符'\0'。

String的底层实现原理

在Redis中,String类型的值就是一个SDS。当我们对String进行操作时,实际上就是在对SDS进行操作。

  1. 当我们向String中添加数据时,Redis会先检查SDS的free是否足够,如果足够,就直接在buf中添加数据;如果不足,就需要对SDS进行扩容,扩容的策略是:如果SDS的长度小于1MB,那么扩容的长度就是当前长度的2倍;如果SDS的长度大于等于1MB,那么扩容的长度就是增加1MB。
  2. 当我们从String中删除数据时,Redis并不会立即缩小SDS的空间,而是通过增加free的值来表示删除了数据。这是因为,如果频繁地进行内存的分配和释放,会导致内存碎片化,从而影响性能。当SDS的空间真的不够用时,Redis会自动进行内存的整理。
  3. 当我们查询String的长度时,Redis可以直接返回SDS的len,这是一个O(1)的操作,非常快。

三、列表 List

1. List 简介

Redis的List数据类型是一个由字符串组成的有序列表。列表中的每个字符串都被分配了一个新的索引,这个索引表示了这个字符串在列表中的位置。索引是零基的,这意味着第一个元素的索引是0,第二个元素的索引是1,以此类推。Redis的列表是双向的,这意味着你可以在列表的两端添加或删除元素。

2. List 基本用法

以下是一些使用Redis列表(List)类型的示例代码:

代码语言:javascript
复制
LPUSH mylist "World"-- 在列表的左侧添加一个或多个值
RPUSH mylist "Hello"-- 在列表的右侧添加一个或多个值
LRANGE mylist 0 -1-- 获取列表中的所有元素
LINDEX mylist 0-- 获取列表中指定位置的元素
LPOP mylist-- 移除并返回列表的第一个元素
RPOP mylist-- 移除并返回列表的最后一个元素
LLEN mylist-- 返回列表的长度

3. Lists 实现原理

Redis的List数据类型是通过双向链表实现的,这使得在列表的头部和尾部插入或删除元素的操作非常高效。然而,当你需要访问或者修改列表中间的元素时,性能就会下降,因为需要从头部或尾部开始遍历列表。

4. List 的应用场景

由于Redis的List数据类型提供了在列表两端进行操作的能力,因此它非常适合用于实现队列和栈,这两种数据结构在许多实际应用中都非常有用。

例如,你可以使用Redis的List数据类型来实现一个消息队列,其中生产者将消息添加到列表的一端,消费者则从另一端取出消息。

四、集合 Set

1. Set 简介

Redis的Set是字符串的无序集合。Set是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)。Set中最大的成员数为 2^32 - 1 (大约40亿)。

2. Set 基本用法

以下是一些使用Redis集合(SET)类型的示例代码:

代码语言:javascript
复制
SADD myset "Hello"-- 向集合添加一个或多个成员
SREM myset "Hello"-- 移除集合中一个或多个成员
SISMEMBER myset "Hello"-- 判断成员元素是否是集合的成员
SMEMBERS myset-- 返回集合中的所有成员
SCARD myset-- 返回集合的成员数
SUNION set1 set2-- 返回两个集合的并集
SINTER set1 set2-- 返回两个集合的交集
SDIFF set1 set2-- 返回两个集合的差集

3. Set 实现原理

Redis的SET数据类型是通过哈希表实现的,这使得添加、删除和查找等操作的时间复杂度都是O(1)。这种数据结构的优点是操作速度快,但是缺点是占用的内存比较大。

4. Set 应用场景

  1. 社交网络中的好友关系、粉丝关系:例如,求两个人的共同好友,第一个人关注的人中有多少是也被第二个人关注了,已知两个人,求他们共同关注的人。
  2. 利用集合保存用户的属性标签,方便快速判断用户是否具有某个属性标签。
  3. 利用集合的交集、并集、差集操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。

五、有序集合 Sorted Set

1. Sorted Set 简介

Redis的Sorted SET是SET的升级版,它在SET的基础上增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。在Sorted SET中,元素是唯一的,但score可以重复。

2. Sorted Set 基本用法

以下是一些使用Redis有序集合(Sorted SET)类型的示例代码:

代码语言:javascript
复制
ZADD myzset 1 "one"-- 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZSCORE myzset "one"-- 返回有序集中,成员的分数值
ZRANK myzset "one"-- 返回有序集合中指定成员的索引
ZRANGE myzset 0 -1-- 通过索引区间返回有序集合成指定区间内的成员
ZREM myzset "one"-- 移除有序集合中的一个或多个成员
ZCARD myzset-- 获取有序集合的成员数
ZCOUNT myzset min max-- 计算在有序集合中指定区间分数的成员数

3. Sorted Set 实现原理

Redis的Sorted SET数据类型是通过跳跃列表(Skip List)和哈希表(Hash Table)实现的。哈希表用于支持O(1)复杂度的元素查找,而跳跃列表则用于支持元素的有序排列和区间查找。

  • 跳跃列表:跳跃列表是一种可以进行快速查找的数据结构,它通过在每个节点中维护多个指向其他节点的指针,从而使得查找的时间复杂度降低到了O(logN)。在Redis的有序集合中,跳跃列表主要用于元素的排序和区间查询。
  • 哈希表:哈希表是一种可以进行快速插入和查找的数据结构,它通过一个哈希函数将元素映射到一个大的空间中,从而使得插入和查找的时间复杂度降低到了O(1)。在Redis的有序集合中,哈希表主要用于元素的快速查找和删除。

当我们向有序集合中添加一个元素时,Redis会同时向跳跃列表和哈希表中添加这个元素。其中,跳跃列表按照元素的score进行排序,而哈希表则按照元素的值进行映射。

当我们查询一个元素时,如果是按照score进行区间查询,Redis会使用跳跃列表;如果是按照元素的值进行查询,Redis会使用哈希表。

当我们删除一个元素时,Redis会同时从跳跃列表和哈希表中删除这个元素。

通过这种方式,Redis的有序集合既可以进行快速的插入和删除,也可以进行快速的排序和区间查询,从而满足了各种不同的需求。

4. Sorted Set 应用场景

  1. 排行榜应用:Sorted Set可以非常方便地实现排行榜,比如游戏的排行榜,网站的点击排行等。
  2. 时间线和日志:Sorted Set的score可以用作时间戳,value可以用作日志内容。
  3. 计数器:Sorted Set可以用来做各种计数器,比如微博的关注者数等。

六、哈希表 Hash

1. Hash 简介

Redis的哈希类型是一个由键值对组成的无序散列表。哈希类型适合用于存储对象,其中键名对应字段名,键值对应字段值。

2. Hash 的基本用法

以下是一些使用Redis哈希(Hash)类型的示例代码:

代码语言:javascript
复制
HSET myhash field1 "Hello"-- 设置哈希表中一个字段的值
HGET myhash field1-- 获取存储在哈希表中指定字段的值
HGETALL myhash-- 获取在哈希表中指定的所有字段和值
HDEL myhash field1-- 删除一个或多个哈希表字段
HEXISTS myhash field1-- 查看哈希表中,指定的字段是否存在
HLEN myhash-- 获取哈希表中字段的数量
HKEYS myhash-- 获取所有哈希表中的字段
HVALS myhash-- 获取哈希表中所有值

3. Hash 的实现原理

Redis的Hash数据类型是通过哈希表实现的,这使得添加、删除和查找等操作的时间复杂度都是O(1)。这种数据结构的优点是操作速度快,但是缺点是占用的内存比较大。

4. Hash 的应用场景

  1. 存储对象:哈希类型非常适合用于存储对象,比如用户的信息,商品的信息等。
  2. 缓存系统:哈希类型可以用来做缓存,提高系统的性能。
  3. 计数器:哈希类型也可以用来做各种计数器,比如网站的点击量等。

七、Bitmap

1. Bitmap 简介

Redis并没有专门的Bitmap数据类型,但是它提供了一系列的位操作命令,使得我们可以把字符串当作Bitmap来使用。Bitmaps是一种特殊的数组,其中的每个元素只能存储0和1。例如,一个8位的Bitmap可以存储从0到255的整数。

2. Bitmap 基本用法

以下是一些使用Redis Bitmaps的示例代码:

代码语言:javascript
复制
SETBIT mykey 7 1  -- 设置或清除指定偏移量上的位(bit)
GETBIT mykey 7  -- 获取指定偏移量上的位(bit)
BITCOUNT mykey  -- 计算给定字符串中被设置为 1 的位的数量
BITPOS mykey 1  -- 返回第一个值为 1 或 0 的二进制位的位置

3. Bitmap 实现原理

Redis的Bitmaps实际上就是字符串,它通过位操作命令来实现Bitmaps的功能。这种数据结构的优点是存储效率高,可以用来存储大量的二进制数据。

4. Bitmap 应用场景

  1. 用户行为分析:例如,可以用Bitmaps来记录用户的登录情况,每天用一个Bitmap,如果用户登录了,就把用户ID对应的位设置为1。
  2. 统计在线用户数:可以用Bitmaps来记录每个用户的在线状态,然后用BITCOUNT命令就可以快速统计在线用户数。
  3. 实现一些特殊的计数器:例如,可以用一个Bitmap来记录用户的签到情况,然后用BITCOUNT命令就可以快速统计用户的签到天数。

八、其他

1. HyperLogLog

HyperLogLog是一种用于解决基数统计的算法,Redis从2.8.9版本开始增加了对HyperLogLog的支持。基数统计就是统计不同元素的数量。HyperLogLog的优点是,即使对数亿级别的数据进行基数统计,也只需要使用12KB的内存空间。

基本用法:

代码语言:javascript
复制
PFADD mykey element1 element2-- 添加指定元素到 HyperLogLog 中
PFCOUNT mykey-- 返回给定 HyperLogLog 的基数估算值
PFMERGE destkey sourcekey1 [sourcekey2]-- 将多个 HyperLogLog 合并为一个 HyperLogLog

2. 地理空间索引(Geo)

Redis的地理空间索引功能是通过zset实现的,它可以存储经度、纬度、名称,然后对这些信息进行各种地理空间操作。

基本用法:

代码语言:javascript
复制
GEOADD mykey longitude latitude member-- 将给定的空间元素(纬度、经度、名字)添加到指定的键里面
GEODIST mykey member1 member2-- 返回两个给定位置之间的距离
GEOPOS mykey member-- 返回指定位置元素的位置(经度和纬度)
GEORADIUS mykey longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]-- 查询指定半径内的位置元素

3. Streams

Redis 5.0引入了新的数据类型Streams,它是一个持久化的日志系统,每个条目都包含一个ID和一组键值对。Streams主要用于消息队列的场景,比如Kafka。

基本用法:

代码语言:javascript
复制
XADD mykey ID field1 value1 [field2 value2]-- 在stream里添加条目
XRANGE mykey start end [COUNT count]-- 返回ID在指定范围内的条目
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key1 key2-- 从stream里读取条目
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海天二路搬砖工 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、字符串 String
    • 1. String 类型简介
      • 2. String 类型的基本用法
        • 3. String 类型的实现原理
          • 4. String 类型的应用场景
            • 5. 简单字符串SDS
            • 三、列表 List
              • 1. List 简介
                • 2. List 基本用法
                  • 3. Lists 实现原理
                    • 4. List 的应用场景
                      • 四、集合 Set
                        • 1. Set 简介
                          • 2. Set 基本用法
                            • 3. Set 实现原理
                              • 4. Set 应用场景
                              • 五、有序集合 Sorted Set
                                • 1. Sorted Set 简介
                                  • 2. Sorted Set 基本用法
                                    • 3. Sorted Set 实现原理
                                      • 4. Sorted Set 应用场景
                                      • 六、哈希表 Hash
                                        • 1. Hash 简介
                                          • 2. Hash 的基本用法
                                            • 3. Hash 的实现原理
                                              • 4. Hash 的应用场景
                                              • 七、Bitmap
                                                • 1. Bitmap 简介
                                                  • 2. Bitmap 基本用法
                                                    • 3. Bitmap 实现原理
                                                      • 4. Bitmap 应用场景
                                                      • 八、其他
                                                        • 1. HyperLogLog
                                                          • 2. 地理空间索引(Geo)
                                                            • 3. Streams
                                                            相关产品与服务
                                                            对象存储
                                                            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                                            领券
                                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档