克罗斯的铁杆 發表於 2025-9-30 10:28:37

Redis 基本数据类型和使用详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、Redis 入门介绍</a></li><li><a href="#_label1">二、Redis 的五大基本数据类型</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">2.1 String 类型</a></li><li><a href="#_lab2_1_1">2.2 Hash 类型</a></li><li><a href="#_lab2_1_2">2.3 List 类型</a></li><li><a href="#_lab2_1_3">2.4 Set 类型</a></li><li><a href="#_lab2_1_4">2.5 Zset 类型</a></li></ul><li><a href="#_label2">三、Redis 的基本使用方式</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_5">3.1 安装与启动</a></li><li><a href="#_lab2_2_6">3.2 连接与操作</a></li><li><a href="#_lab2_2_7">3.3 数据持久化</a></li><li><a href="#_lab2_2_8">3.4 redis.conf 文件内容解析</a></li></ul><li><a href="#_label3">四、总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、Redis 入门介绍</h2>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202509/2025930102629648.png" /></p>
<p>Redis,全称为 Remote Dictionary Server,即远程字典服务,是一款开源的、基于内存的数据结构存储系统,可用作数据库、缓存和消息代理。它以高性能、丰富的数据类型和便捷的使用方式,在现代开发领域中占据着举足轻重的地位。</p>
<p>相较于传统的关系型数据库,Redis 将数据存储在内存中,这使得它的读写速度极快,能够轻松应对高并发场景下的海量数据请求。例如,在电商大促活动中,大量用户同时查询商品信息,Redis 可以迅速从内存中返回数据,大大提升用户体验,避免因数据库查询缓慢导致的页面加载卡顿。</p>
<p>Redis 支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等,每种数据结构都有其独特的应用场景,为开发者提供了极大的灵活性,能够满足不同业务场景下的数据存储与操作需求。</p>
<p>在实际应用中,Redis 的身影随处可见。它常被用作缓存层,将频繁访问的数据存储在内存中,减少数据库的查询压力,提升系统响应速度;在分布式系统中,它可以作为消息队列,实现服务之间的解耦与异步通信,提高系统的吞吐量;还能用于实现分布式锁,保证在分布式环境下资源访问的一致性与安全性。</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、Redis 的五大基本数据类型</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>2.1 String 类型</h3>
<p>String 是 Redis 最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式。在实际应用中,它常用于缓存热点数据,比如将频繁访问的网页内容、用户信息等以字符串形式缓存起来,下次访问时直接从 Redis 中获取,大大提高读取速度,减轻数据库压力。</p>
<p>常见的 String 类型命令有:</p>
<ul><li>SET:用于设置给定 key 的值,如果 key 已经存储值,SET 就覆写旧值,且无视类型。例如 <code>SET username &quot;John&quot;</code>,就是将 username 这个 key 的值设置为 &quot;John&quot;。</li></ul>
<ul><li>GET:用于获取指定 key 的值,如果 key 不存在,返回 nil。如 <code>GET username</code> 就能获取之前设置的用户名。</li></ul>
<ul><li>INCR:对 key 的值做加加操作,并返回新的值,每执行一次值加 1,值类型要是数据类型。常用于实现计数器功能,比如统计文章的点赞数、网站的访问量等,像 <code>INCR article_likes</code> 就可以实现文章点赞数的自增。</li></ul>
<ul><li>DECR:与 INCR 相反,是减一操作。</li></ul>
<ul><li>INCRBY:可以指定相加的值,执行加法的命令,如 <code>INCRBY score 5</code> 表示将 score 的值增加 5。</li></ul>
<p>假设我们正在开发一个电商网站,需要统计商品的浏览次数。每当用户访问某个商品详情页时,后端代码就可以使用 INCR 命令对该商品对应的浏览次数 key 进行自增操作,如 <code>INCR product_viewed:123</code>(假设 123 是商品 ID),后续需要展示浏览次数时,通过 GET 命令就能快速获取到统计结果,高效又便捷。</p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.2 Hash 类型</h3>
<p>Hash 类似于字典,是一个键值对集合,适合存储对象,它可以将一个对象的多个属性以键值对的形式存储在一个 Hash 中,相比使用 String 类型存储对象,省去了序列化和反序列化的开销,并且可以直接通过 key + field 去操作对象的某个属性,更加灵活高效。</p>
<p>常用的 Hash 命令如下:</p>
<ul><li>HSET:给 key 下的对象中的 field 对应的 value 赋值,格式为 <code>HSET key field value </code>。例如 <code>HSET user:1 name Tom age 20 address usa phone 13333333333</code>,就是在 user:1 这个 Hash 中设置了用户的多个属性。</li></ul>
<ul><li>HGET:根据 key + field 取出对象的 value,用法为 <code>HGET key field</code>,如 <code>HGET user:1 name</code> 就能获取到用户的名字。</li></ul>
<ul><li>HGETALL:返回 key 对应的 Hash 中所有的键值对,如 <code>HGETALL user:1</code> 会返回用户的所有信息。</li></ul>
<ul><li>HINCRBY:用于将指定 Hash 中的某个字段值加上一个增量值,常用于对数值型字段进行累加操作,比如统计用户的消费金额,<code>HINCRBY user:1 cost 100</code> 表示将用户 1 的消费金额增加 100。</li></ul>
<p>以电商购物车功能为例,我们可以将每个用户的购物车信息存储为一个 Hash,商品 ID 作为 field,商品数量作为 value。用户添加商品到购物车时,使用 <code>HSET cart:123 456 2</code>(假设 123 是用户 ID,456 是商品 ID),查看购物车某商品数量时用 <code>HGET cart:123 456</code>,获取整个购物车信息则用 <code>HGETALL cart:123</code>,非常方便地实现了购物车数据的存储与操作。</p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>2.3 List 类型</h3>
<p>List 是一个双向链表结构,按照插入顺序排序,这意味着可以在列表的头部或尾部快速地插入和删除元素,常被用于消息队列、列表分页等场景。</p>
<p>相关操作命令丰富多样:</p>
<ul><li>LPUSH:将一个或多个元素插入列表表头,格式为 <code>LPUSH key value1 </code>,返回插入的数据个数。例如 <code>LPUSH mylist a b c</code>,会将 c、b、a 依次插入到 mylist 列表的头部。</li></ul>
<ul><li>RPUSH:和 LPUSH 类似,是将一个或多个元素插入列表尾部,如 <code>RPUSH mylist d e f</code>,会在 mylist 列表的尾部依次插入 d、e、f。</li></ul>
<ul><li>LRANGE:用于从列表中获取一定范围的元素(不会删除元素),该命令需要两个索引参数,格式为 <code>LRANGE key start end,0</code> 以及正数表示从头开始的索引,负数表示从尾部开始计数,-1 表示最后一个元素,以此类推。如 <code>LRANGE mylist 0 2</code> 会返回列表中的前三个元素。</li></ul>
<ul><li>LPOP:移除并返回列表的第一个元素,如 <code>LPOP mylist</code> 会将 mylist 列表头部的元素弹出并返回。</li></ul>
<ul><li>RPOP:与 LPOP 对应,移除并返回列表的最后一个元素。</li></ul>
<p>在消息队列的应用场景中,生产者可以使用 RPUSH 命令将消息依次添加到列表的尾部,消费者则使用 LPOP 命令从列表头部取出消息进行处理,实现先进先出的消息传递机制,确保消息的顺序性处理。比如在一个日志收集系统中,各个服务产生的日志信息可以通过 RPUSH 放入到一个日志列表中,然后由专门的日志处理服务使用 LPOP 取出日志进行存储或分析。</p>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2.4 Set 类型</h3>
<p>Set 是一个无序集合,它的最大特点是集合中的成员是唯一的,会自动去重,常被用于数据去重、好友关系、标签等场景。</p>
<p>常用命令有:</p>
<ul><li>SADD:用于向集合中添加一个或多个成员,格式为 <code>SADD key member1 </code>,返回成功添加的成员数量。例如 <code>SADD tags java python redis</code>,就是向 tags 这个集合中添加三个成员。</li></ul>
<ul><li>SMEMBERS:返回集合中的所有成员,如 <code>SMEMBERS tags</code> 会返回之前添加的所有标签。</li></ul>
<ul><li>SISMEMBER:判断某个成员是否在集合中,存在返回 1,不存在返回 0,格式为 <code>SISMEMBER key member</code>,如 <code>SISMEMBER tags java</code> 会返回 1。</li></ul>
<ul><li>SINTER:求多个集合的交集,格式为 <code>SINTER key1 </code>,常用于找出多个集合中共同的元素,比如找出多个用户的共同好友等场景。</li></ul>
<p>以抽奖活动为例,我们可以将所有参与抽奖的用户 ID 使用 SADD 添加到一个抽奖集合中,如 <code>SADD lottery_users 1001 1002 1003...</code>,抽奖时使用 <code>SRANDMEMBER lottery_users 3</code> 随机抽取三名幸运用户,既简单又高效,还能确保不会重复抽取同一用户。</p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>2.5 Zset 类型</h3>
<p>Zset,即有序集合,它和 Set 类似,成员也是唯一的,但每个元素都会关联一个 double 类型的分数(也可以理解为权重),Redis 会根据分数对集合中的成员进行从小到大排序,这使得它在排名、优先级队列等场景中表现出色。</p>
<p>主要操作命令包括:</p>
<ul><li>ZADD:向有序集合中添加一个或多个成员,如果该成员已经存在,则更新其对应的分数,格式为 <code>ZADD key score1 member1 </code>,返回成功添加的成员数量。例如 <code>ZADD scoreboard 85 Tom 90 Jerry 75 Bob</code>,就是向 scoreboard 这个有序集合中添加了三个成员及对应的分数。</li></ul>
<ul><li>ZRANGE:按照分数从小到大的顺序获取有序集合中指定区间内的成员,格式为 <code>ZRANGE key start stop </code>,可选参数 WITHSCORES 表示是否同时返回成员的分数。如 <code>ZRANGE scoreboard 0 1</code> 会返回分数最低的两名成员,若加上 WITHSCORES,则会同时返回成员及其分数。</li></ul>
<ul><li>ZREM:用于移除有序集合中的一个或多个元素,格式为 <code>ZREM key member1 </code>,返回成功移除的成员数量。比如 <code>ZREM scoreboard Bob</code> 会将 Bob 从 scoreboard 有序集合中移除。</li></ul>
<p>在游戏排行榜的场景中,每当玩家完成一局游戏获得分数后,就可以使用 <code>ZADD ranking &lt;score&gt; &lt;player_id&gt;</code> 将玩家的分数和 ID 添加到排行榜有序集合中,要展示排行榜前几名玩家时,通过 <code>ZRANGE ranking 0 9 WITHSCORES</code> 就能轻松获取到排名前十的玩家及其分数,实时更新排行榜信息,为玩家提供直观的竞争反馈。</p>
<p class="maodian"><a name="_label2"></a></p><h2>三、Redis 的基本使用方式</h2>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>3.1 安装与启动</h3>
<p>不同操作系统下,Redis 的安装方式略有不同。</p>
<p>在 Ubuntu 系统中,可以通过以下命令进行安装:</p>
<div class="jb51code"><pre class="brush:bash;">sudo apt-get update
sudo apt-get install redis-server</pre></div>
<p>安装完成后,使用 sudo service redis-server start 启动 Redis 服务,通过 sudo service redis-server status 查看服务状态。</p>
<p>Mac 系统下,推荐使用 Homebrew 来安装,打开终端,依次输入以下命令:</p>
<div class="jb51code"><pre class="brush:bash;">#安装 Homebrew 命令
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
#安装redis
brew update
brew install redis</pre></div>
<p>启动 Redis 服务使用 redis-server,若要后台启动,可执行 <code>redis-server --daemonize yes</code>。</p>
<p>对于 Windows 系统,需要去 github 上获取安装包,链接为 <a href="https://github.com/MicrosoftArchive/redis/releases" target="_blank">github.com/MicrosoftAr&hellip;</a>,选择.msi 格式的安装版本,下载后直接运行安装包,按照提示逐步操作,安装完成后在计算机服务中找到 Redis 服务,手动启动即可。</p>
<p>无论哪种系统,安装完成后都可以在终端输入 redis-cli 进入 Redis 命令行客户端,输入 ping,若返回 PONG,则说明 Redis 安装并启动成功。</p>
<p>Redis 的配置文件通常为 redis.conf,在该文件中可以修改一些重要参数,如监听的 IP 地址、端口号、密码等。例如,若要让 Redis 监听所有可用的 IP 地址,在配置文件中将 bind 127.0.0.1 修改为 bind 0.0.0.0(在生产环境中要谨慎设置,确保安全性);设置密码可在配置文件中找到 requirepass foobared,将其修改为 requirepass your_password,之后启动 Redis 服务,连接客户端时就需要输入密码进行认证。</p>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>3.2 连接与操作</h3>
<p>连接 Redis 客户端十分简单,在终端输入 redis-cli 即可进入本地 Redis 服务的命令行界面,若 Redis 设置了密码,需要先输入 auth your_password 进行认证。</p>
<p>进入客户端后,就可以对 Redis 数据库进行各种操作。首先,Redis 默认有 16 个数据库,编号从 0 到 15,可以使用 SELECT index 命令切换数据库,比如 SELECT 1 就切换到了编号为 1 的数据库。</p>
<p>查看当前数据库中的所有键,可以使用 KEYS pattern 命令,其中 pattern 是匹配模式,例如 KEYS * 表示查看所有键,KEYS user:* 则是查看以 user: 开头的所有键。但需要注意,在生产环境中尽量避免使用 KEYS *,因为它会遍历整个数据库,当数据量巨大时,会对性能产生较大影响,此时可以使用 SCAN 命令来逐步迭代获取键。</p>
<p>清空当前数据库使用 FLUSHDB 命令,它会删除当前数据库中的所有键值对;若要清空整个 Redis 实例的所有数据库,使用 FLUSHALL 命令,这两个操作都需要谨慎使用,以免误删重要数据。</p>
<p>设置键值对、获取值等操作就如同前面介绍数据类型时所讲,例如 SET key value、GET key 等,通过这些基本操作指令,就能灵活地操作 Redis 中的数据。</p>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>3.3 数据持久化</h3>
<p>数据持久化是 Redis 的重要特性之一,它能确保数据在 Redis 服务重启或意外关闭后不会丢失。Redis 主要有两种持久化方式:RDB(Redis Database)和 AOF(Append Only File)。</p>
<p>RDB 持久化方式是将 Redis 在某个时间点上的数据快照保存到磁盘上的一个二进制文件中,这个文件默认名为 dump.rdb。它的优点是数据恢复速度快,因为是直接从快照文件中加载数据到内存;缺点是数据可能会丢失,因为它是按照一定的时间间隔进行快照备份,如果 Redis 在两次快照之间意外关闭,那么这期间的数据修改就会丢失。在 redis.conf 配置文件中,可以通过设置 save 选项来调整快照的触发条件,例如 save 900 1 表示在 900 秒内有 1 个键被修改就进行快照,还可以设置多个不同的条件,满足任意一个就触发。</p>
<p>AOF 持久化方式则是将 Redis 的写操作命令以日志的形式追加到文件末尾,默认文件名是 appendonly.aof。它的优点是数据安全性高,因为每一次写操作都会记录,即使 Redis 意外崩溃,重启时也可以通过重新执行这些写命令来恢复数据;缺点是文件体积可能会不断增大,需要定期进行重写操作来优化。在 redis.conf 中,通过设置 appendonly yes 开启 AOF 持久化,还可以配置 appendfsync 选项来调整写回策略,如 appendfsync everysec 表示每秒将缓冲区中的命令写入磁盘,这是在数据安全性和性能之间的一个较好平衡,另外还有 always(每次写操作都同步到磁盘,最安全但性能较差)和 no(由操作系统决定何时写入磁盘,性能最好但数据安全性低)两个选项。</p>
<p>在实际使用中,可以根据业务需求来选择合适的持久化方式,也可以同时开启两种持久化,相互补充,以保障数据的安全性与恢复效率。备份 dump.rdb 和 appendonly.aof 文件,并妥善保存,在需要恢复数据时,将备份文件放回相应位置,重启 Redis 服务即可。</p>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>3.4 redis.conf 文件内容解析</h3>
<p><strong>常见配置项</strong></p>
<ul><li><strong>daemonize</strong>: 指定Redis是否以守护进程方式运行。设置为yes表示后台运行。</li><li><strong>pidfile</strong>: 守护进程运行时,Redis进程ID存储的文件路径。</li><li><strong>port</strong>: Redis监听的端口号,默认为6379。</li><li><strong>bind</strong>: 允许接受连接的IP地址。如果不设置,默认接受所有网卡的连接。</li><li><strong>timeout</strong>: 连接超时时间,单位为秒。设置为0表示服务器不会主动断开连接。</li><li><strong>loglevel</strong>: 日志记录级别,包括debug、verbose、notice和warning。</li><li><strong>logfile</strong>: 日志文件的路径。如果设置为空字符串,则日志将发送到/dev/null。</li><li><strong>databases</strong>: 可用数据库的数量,默认为16。</li><li><strong>save</strong>: 设置在指定时间内,有多少次更新操作时,数据将同步到磁盘。</li><li><strong>rdbcompression</strong>: 是否在保存.rdb文件时进行压缩。</li><li><strong>dbfilename</strong>: 本地数据库文件名,默认为dump.rdb。</li><li><strong>dir</strong>: 指定数据库文件的存放目录。</li></ul>
<p><strong>数据持久化</strong></p>
<p>Redis提供了两种数据持久化机制:RDB和AOF。RDB通过定时创建数据快照来持久化数据,而AOF则记录每次写操作,以日志的形式保存。</p>
<ul><li><strong>appendonly</strong>: 是否开启AOF持久化模式。</li><li><strong>appendfsync</strong>: AOF持久化的同步策略,包括always、everysec和no。</li><li><strong>auto-aof-rewrite-percentage</strong>: AOF文件增长百分比,达到该值时自动重写AOF文件。</li><li><strong>auto-aof-rewrite-min-size</strong>: 允许重写的最小AOF文件大小。</li></ul>
<p><strong>安全性设置</strong></p>
<ul><li><strong>requirepass</strong>: 设置客户端连接Redis时需要提供的密码。</li><li><strong>rename-command</strong>: 重命名危险命令,以增加安全性。</li></ul>
<p><strong>主从复制</strong></p>
<p>Redis支持主从复制,允许数据从一个Redis服务器复制到另一个服务器。</p>
<ul><li><strong>slaveof</strong>: 设置主服务器的IP地址和端口,用于从服务器数据同步。</li><li><strong>masterauth</strong>: 如果主服务器设置了密码,从服务器使用此选项指定主服务器认证密码。</li></ul>
<p><strong>客户端连接限制</strong></p>
<ul><li><strong>maxclients</strong>: 设置最大客户端连接数。</li><li><strong>maxmemory</strong>: 指定Redis最大内存限制。</li></ul>
<p><strong>配置文件的修改和启动</strong></p>
<p>修改 <code>redis.conf</code> 配置文件后,可以通过以下命令启动 Redis 服务:</p>
<div class="jb51code"><pre class="brush:bash;">redis-server /path/to/redis.conf</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、总结</h2>
<p>Redis 的基本数据类型及其使用方式为开发者提供了强大而灵活的数据处理手段,无论是应对高并发场景下的缓存需求,还是实现复杂多样的业务逻辑,Redis 都展现出了卓越的性能与适应性。通过对 String、Hash、List、Set、Zset 这五大基本数据类型的深入学习,我们能够根据不同的应用场景,选择最合适的数据类型来存储和操作数据,从而优化系统架构,提升系统性能。</p>
<p>然而,这仅仅是 Redis 知识海洋中的冰山一角,Redis 还有诸多高级特性、应用场景以及优化技巧等待我们去探索。希望本文能够成为你深入学习 Redis 的基石,在实际项目中多动手实践,不断挖掘 Redis 的潜力,让它为你的技术架构赋能,创造出更加高效、稳定的应用系统。</p>
頁: [1]
查看完整版本: Redis 基本数据类型和使用详解