核心内容摘要
好写作AI | 降低重复率的秘密:AI辅助改写与深度润色技巧解析!
Redis 从入门到实战超详细零基础教程RedisRemote Dictionary Server是一款开源的高性能的键值对Key-Value内存数据库同时支持持久化、分布式、多种数据结构被广泛应用于缓存、消息队列、会话存储、限流削峰等场景。
本文从基础安装、核心概念、数据结构、常用命令到实战场景全方位讲解 Redis 的使用适合零基础入门者系统学习。
Redis 核心特性与应用场景
1 核心特性高性能基于内存操作单实例 QPS每秒查询数可达 10 万 远超传统关系型数据库多数据结构支持字符串String、哈希Hash、列表List、集合Set、有序集合ZSet等多种原生数据结构持久化支持 RDB快照和 AOF日志两种持久化方式避免内存数据丢失原子性所有命令都是原子操作支持事务弱事务和 CASCompare And Swap操作高可用支持主从复制、哨兵Sentinel、集群Cluster保证服务不宕机丰富功能支持发布订阅、过期时间、Lua 脚本、位图、地理空间GEO等扩展功能。
2 典型应用场景场景解决的问题Redis 实现方式缓存减轻数据库压力提升接口响应速度String/Hash 存储热点数据设置过期时间分布式锁解决分布式系统中资源竞争问题StringSET NX EX/Redlock限流削峰控制接口请求频率防止系统被打垮ZSet / 计数器INCR 过期时间会话存储分布式系统中共享用户会话Hash 存储用户会话信息消息队列简单的异步通信场景ListLPUSH BRPOP/ 发布订阅排行榜实时更新的点赞榜、销量榜ZSet按分数排序
Redis 环境安装与配置
1 环境准备操作系统Linux推荐 CentOS 7/
Ubuntu
2
04Windows 仅建议测试使用依赖Redis 编译需要 GCC 环境先安装依赖# CentOS yum install -y gcc gcc-c make # Ubuntu apt-get install -y gcc make
2 源码安装Linux 推荐步骤 1下载并解压 Redis# 下载最新稳定版
7.
4 为当前稳定版可替换为最新版本 wget https://download.redis.io/releases/redis-
7.
2.
tar.gz # 解压 tar -zxvf redis-
7.
2.
tar.gz # 进入解压目录 cd redis-
7.
4步骤 2编译与安装# 编译 make # 安装指定安装目录推荐 /usr/local/redis make PREFIX/usr/local/redis install步骤 3配置环境变量可选将 Redis 命令加入系统环境变量方便全局调用# 编辑环境变量文件 vim /etc/profile # 添加以下内容 export REDIS_HOME/usr/local/redis export PATH$PATH:$REDIS_HOME/bin # 生效配置 source /etc/profile步骤 4初始化配置文件Redis 默认配置文件在解压目录的redis.conf需要复制到安装目录并修改核心配置# 创建配置目录 mkdir -p /usr/local/redis/conf # 复制配置文件 cp redis.conf /usr/local/redis/conf/ # 编辑配置文件 vim /usr/local/redis/conf/redis.conf
3 核心配置项修改必改打开redis.conf后修改以下关键配置去掉注释并修改值配置项默认值修改后值说明bind
127.
0.
0.
10.
0.
0允许所有 IP 访问生产环境建议指定内网 IPprotected-modeyesno关闭保护模式否则仅本地可访问port63796379端口号可自定义如 6380daemonizenoyes以守护进程运行后台运行pidfile/var/run/redis_
pid/usr/local/redis/redis.pidPID 文件存放路径logfile“”/usr/local/redis/log/redis.log日志文件路径需先创建 log 目录dir.//usr/local/redis/data持久化文件存放目录需先创建 data 目录requirepass“”yourpassword设置密码生产环境必须设置maxmemory02gb最大使用内存根据服务器配置如 2GB、4GBmaxmemory-policynoevictionvolatile-lru内存满时的淘汰策略优先淘汰过期的键创建日志和数据目录mkdir -p /usr/local/redis/log /usr/local/redis/data
4 启动与停止 Redis启动 Redis# 指定配置文件启动 redis-server /usr/local/redis/conf/redis.conf验证启动# 查看进程 ps -ef | grep redis # 连接客户端 redis-cli -h
127.
0.
1 -p 6379 -a yourpassword # 测试命令
127.
0.
1:6379 PING PONG # 返回 PONG 说明启动成功停止 Redis# 优雅停止推荐 redis-cli -a yourpassword SHUTDOWN # 强制停止不推荐可能丢失数据 kill -9 [redis进程ID]
5 Windows 安装仅测试用下载 Windows 版 Redishttps://github.com/microsoftarchive/redis/releases解压后双击redis-server.exe启动服务双击redis-cli.exe打开客户端配置文件为redis.windows.conf修改方式与 Linux 一致无需改 daemonize。
Redis 核心概念
1 数据模型键值对Key-ValueRedis 以 “键Key- 值Value” 为核心存储模型Key必须是字符串类型且唯一建议遵循命名规范如user:info:1001Value支持多种数据结构String、Hash、List、Set、ZSet 等所有命令都是围绕 “操作 Key” 或 “操作 Key 对应的 Value” 展开。
2 数据类型与适用场景Redis 支持 5 种核心数据类型每种类型有专属命令以下是详细说明数据类型底层实现核心特性典型命令适用场景String简单动态字符串二进制安全可存字符串 / 数字 / 二进制SET、GET、INCR、EXPIRE缓存、计数器、会话存储Hash哈希表键值对集合适合存对象HSET、HGET、HMGET、HDEL存储用户信息、商品详情List双向链表有序、可重复支持头尾操作LPUSH、RPOP、LRANGE消息队列、最新列表Set哈希表无序、不可重复支持交集 / 并集SADD、SMEMBERS、SINTER标签、好友去重、抽奖ZSet跳跃表 哈希表有序、不可重复按分数排序ZADD、ZRANGE、ZCORE排行榜、延时任务
3 过期时间Redis 支持为 Key 设置过期时间到期后自动删除核心命令EXPIRE key seconds设置过期时间秒PEXPIRE key milliseconds设置过期时间毫秒EXPIREAT key timestamp指定时间戳过期秒TTL key查看剩余过期时间-1 永不过期-2 已过期PERSIST key取消过期时间。
示例
127.
0.
1:6379 SET name redis OK
127.
0.
1:6379 EXPIRE name 60 # 60秒后过期 (integer) 1
127.
0.
1:6379 TTL name (integer) 55 # 剩余55秒
4 持久化机制Redis 是内存数据库默认重启后数据丢失持久化机制解决该问题支持两种方式
3.
1 RDB快照原理在指定时间间隔内将内存中的数据快照写入磁盘.rdb 文件触发方式手动触发SAVE阻塞、BGSAVE非阻塞推荐自动触发配置save 900 1900 秒内至少 1 个键修改则触发优点文件体积小恢复速度快缺点可能丢失最近一次快照后的所有数据。
3.
2 AOF追加日志原理记录所有写命令如 SET、HSET重启时重新执行命令恢复数据开启方式配置appendonly yes同步策略appendfsync always每次写命令都同步最安全性能最差appendfsync everysec每秒同步默认平衡安全与性能appendfsync no由操作系统决定性能最好最不安全优点数据丢失少最多 1 秒缺点文件体积大恢复速度慢。
3.
3 混合持久化Redis
0配置aof-use-rdb-preamble yesAOF 文件开头包含 RDB 快照后续是 AOF 日志兼顾 RDB 和 AOF 的优点生产环境推荐开启。
Redis 核心数据结构与命令实战
1 字符串StringString 是 Redis 最基础的类型可存储字符串、数字、二进制数据如图片最大容量 512MB。
核心命令命令说明示例SET key value设置键值对SET username “zhangsan”GET key获取值GET username → “zhangsan”SETNX key value仅当键不存在时设置分布式锁核心SETNX lock 1 → 1成功/0失败INCR key数字值自增 1原子操作SET num 10 → INCR num → 11INCRBY key step自增指定步长INCRBY num 5 → 16DECR key数字值自减 1DECR num → 15APPEND key value追加字符串APPEND username “_test” → “zhangsan_test”STRLEN key获取字符串长度STRLEN username → 12实战场景接口限流需求限制某个接口每分钟最多访问 100 次。
# 假设接口名是 /api/user用户IP是
192.
168.
1
127.
0.
1:6379 INCR api:limit:
192.
168.
1:/api/user (integer) 1
127.
0.
1:6379 EXPIRE api:limit:
192.
168.
1:/api/user 60 (integer) 1 # 每次访问接口时执行上述命令若返回值 100 则拒绝访问
2 哈希HashHash 是键值对的集合适合存储对象如用户信息、商品详情可单独操作对象的某个字段节省内存。
核心命令命令说明示例HSET key field value设置哈希字段值HSET user:1001 name “李四” age 25HGET key field获取哈希字段值HGET user:1001 name → “李四”HMSET key f1 v1 f2 v2批量设置哈希字段HMSET user:1002 name “王五” age 30HMGET key f1 f2批量获取哈希字段HMGET user:1002 name age → [“王五”,“30”]HGETALL key获取所有字段和值HGETALL user:1001 → [“name”,“李四”,“age”,“25”]HDEL key field删除哈希字段HDEL user:1001 age → 1成功HLEN key获取哈希字段数量HLEN user:1001 → 1HEXISTS key field判断字段是否存在HEXISTS user:1001 name → 1存在实战场景存储用户信息# 存储用户ID1001的信息
127.
0.
1:6379 HSET user:1001 username zhangsan email zstest.com phone 13800138000 (integer) 3 # 获取用户邮箱
127.
0.
1:6379 HGET user:1001 email zstest.com # 更新用户手机号
127.
0.
1:6379 HSET user:1001 phone 13900139000 (integer) 0 # 获取用户所有信息
127.
0.
1:6379 HGETALL user:1001
username
zhangsan
zstest.com
phone
6)
1
3 列表ListList 是有序、可重复的字符串列表底层是双向链表支持头尾插入 / 删除适合做消息队列、最新消息列表。
核心命令命令说明示例LPUSH key value从列表头部插入元素LPUSH msg “hello” → 1RPUSH key value从列表尾部插入元素RPUSH msg “world” → 2LPOP key从列表头部删除并返回元素LPOP msg → “hello”RPOP key从列表尾部删除并返回元素RPOP msg → “world”BRPOP key timeout阻塞式弹出队列无数据时等待BRPOP queue 0 → 永久等待LRANGE key start end获取列表指定范围元素0 开头-1 结尾LRANGE msg 0 -1 → 所有元素LLEN key获取列表长度LLEN msg → 2LREM key count value删除指定数量的元素LREM msg 2 “hello” → 删除 2 个 “hello”实战场景简单消息队列生产者往队列尾部添加消息消费者阻塞式获取消息# 生产者添加3条消息
127.
0.
1:6379 RPUSH msg:queue order:1001 order:1002 order:1003 (integer) 3 # 消费者阻塞式获取消息无消息时等待
127.
0.
1:6379 BRPOP msg:queue 0
msg:queue
order:1003 # 先获取尾部的消息FIFO
127.
0.
1:6379 BRPOP msg:queue 0
msg:queue
order:
1
4 集合SetSet 是无序、不可重复的字符串集合支持交集、并集、差集等集合操作适合去重、标签、抽奖场景。
核心命令命令说明示例SADD key member添加元素重复添加无效SADD tag:1001 “java” “python” → 2SMEMBERS key获取所有元素SMEMBERS tag:1001 → [“java”,“python”]SISMEMBER key member判断元素是否存在SISMEMBER tag:1001 “java” → 1存在SREM key member删除元素SREM tag:1001 “python” → 1SCARD key获取集合大小SCARD tag:1001 → 1SINTER key1 key2求交集SINTER tag:1001 tag:1002 → 共同标签SUNION key1 key2求并集SUNION tag:1001 tag:1002 → 所有标签SDIFF key1 key2求差集key1 有key2 无SDIFF tag:1001 tag:1002 → 独有标签SRANDMEMBER key count随机获取 count 个元素不删除SRANDMEMBER prize 1 → 随机抽奖 1 名SPOP key count随机删除 count 个元素抽奖常用SPOP prize 1 → 随机抽 1 名并移除实战场景抽奖活动需求从 10 个用户中随机抽取 1 名一等奖、2 名二等奖。
# 添加抽奖用户
127.
0.
1:6379 SADD prize:2024 user1 user2 user3 user4 user5 user6 user7 user8 user9 user10 (integer) 10 # 抽一等奖随机删除1个
127.
0.
1:6379 SPOP prize:2024 1
user5 # 抽二等奖随机删除2个
127.
0.
1:6379 SPOP prize:2024 2
user8
user
2
5 有序集合ZSetZSet 是有序、不可重复的集合每个元素关联一个分数score按分数排序适合排行榜、延时任务。
核心命令命令说明示例ZADD key score member添加元素score 为数字ZADD rank:sales 100 “商品 A” 200 “商品 B” → 2ZRANGE key start end [WITHSCORES]按分数升序获取元素带分数ZRANGE rank:sales 0 -1 WITHSCORES → [“商品 A”,“100”,“商品 B”,“200”]ZREVRANGE key start end [WITHSCORES]按分数降序获取元素ZREVRANGE rank:sales 0 0 WITHSCORES → [“商品 B”,“200”]第一名ZSCORE key member获取元素分数ZSCORE rank:sales “商品 A” → “100”ZINCRBY key increment member增加元素分数ZINCRBY rank:sales 50 “商品 A” → 150ZREM key member删除元素ZREM rank:sales “商品 A” → 1ZCOUNT key min max统计分数范围内的元素数量ZCOUNT rank:sales 100 200 → 2实战场景商品销量排行榜需求实时更新商品销量展示销量前 3 的商品。
# 初始化销量
127.
0.
1:6379 ZADD rank:sales 50 商品1 80 商品2 120 商品3 90 商品4 (integer) 4 # 商品2销量20
127.
0.
1:6379 ZINCRBY rank:sales 20 商品2 100 # 查看销量前3的商品降序
127.
0.
1:6379 ZREVRANGE rank:sales 0 2 WITHSCORES
商品3
120
商品2
100
商品4
90
Redis 高级特性
1 分布式锁Redis 是实现分布式锁的常用方案核心原理是利用SETNX命令仅当键不存在时设置结合过期时间避免死锁。
标准实现步骤#
获取锁SET NX EX 原子操作避免并发问题 SET lock:order 1 NX EX 30 # 参数说明 # NX → 仅当键不存在时设置 # EX 30 → 30秒过期避免服务宕机导致死锁 # 返回 OK 表示获取锁成功否则失败 #
执行业务逻辑如扣减库存 #
释放锁删除键 DEL lock:order
注意事项过期时间需大于业务执行时间避免锁提前释放释放锁时建议用 Lua 脚本验证锁的持有者防止误删其他客户端的锁if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end
2 管道PipelineRedis 管道允许一次性发送多个命令减少网络往返次数提升批量操作性能。
示例批量设置 1000 个键值对# 开启管道 redis-cli -a yourpassword --pipe # 输入命令每行一个 SET key1 value1 SET key2 value2 ... SET key1000 value1000 # 按 CtrlD 执行
3 Lua 脚本Redis 支持 Lua 脚本脚本内的命令原子执行适合复杂业务逻辑如扣减库存 更新销量。
示例扣减商品库存库存 0 时扣减否则返回失败-- 脚本参数KEYS[1] 库存键ARGV[1] 扣减数量 local stock tonumber(redis.call(get, KEYS[1])) local num tonumber(ARGV[1]) if stock and stock num then redis.call(decrby, KEYS[1], num) return 1 -- 扣减成功 else return 0 -- 库存不足 end执行脚本
127.
0.
1:6379 EVAL local stock tonumber(redis.call(get, KEYS[1])) local num tonumber(ARGV[1]) if stock and stock num then redis.call(decrby, KEYS[1], num) return 1 else return 0 end 1 stock:1001 2 # 参数说明1 → KEYS数组长度stock:1001 → KEYS[1]2 → ARGV[1]
4 主从复制主从复制用于数据备份和读写分离主库Master处理所有写操作同步数据到从库从库Slave只读分担读操作压力。
配置步骤复制主库配置文件修改端口如
pid 文件、日志文件在从库配置文件中添加replicaof 主库IP 主库端口 masterauth 主库密码 replica-read-only yes # 从库只读启动从库执行INFO replication查看复制状态。
5 哨兵Sentinel哨兵用于监控主从库当主库宕机时自动将从库切换为主库保证高可用。
核心配置sentinel.confport 26379 daemonize yes logfile /usr/local/redis/log/sentinel.log # 监控主库mymaster 为主库名称2 为至少2个哨兵同意切换 sentinel monitor mymaster
127.
0.
1 6379 2 # 主库密码 sentinel auth-pass mymaster yourpassword # 主库宕机后多久切换毫秒 sentinel down-after-milliseconds mymaster 30000启动哨兵redis-sentinel /usr/local/redis/conf/sentinel.conf
Redis
常见问题与优化
1 缓存穿透问题请求不存在的 Key每次都穿透到数据库解决方案缓存空值设置短期过期时间布隆过滤器提前过滤不存在的 Key。
2 缓存击穿问题热点 Key 过期瞬间大量请求穿透到数据库解决方案热点 Key 永不过期互斥锁请求时先获取锁再查数据库更新缓存。
3 缓存雪崩问题大量 Key 同时过期数据库压力骤增解决方案过期时间加随机值避免同时过期主从 哨兵保证 Redis 高可用限流削峰控制数据库请求数。
4 内存优化选择合适的数据结构如用 Hash 存储对象代替多个 String设置合理的过期时间和淘汰策略避免大 Key如超大字符串、百万级 List拆分大 Key。
5 性能优化开启持久化时选择混合持久化使用管道批量操作避免频繁的 KEYS、FLUSHDB 等阻塞命令配置合理的 maxmemory 和淘汰策略。
Redis 客户端使用Node.js 示例以 Node.js 的ioredis库为例演示如何操作 Redis
1 安装依赖npm install ioredis
2 基本使用const Redis require(ioredis); // 连接 Redis const redis new Redis({ host:
127.
0.
1, port: 6379, password: yourpassword, db: 0 // 数据库编号默认0 }); // 测试连接 redis.ping().then(res { console.log(连接成功, res); // PONG }); // 操作 String async function testString() { await redis.set(name, redis-test); const name await redis.get(name); console.log(String值, name); // redis-test } // 操作 Hash async function testHash() { await redis.hset(user:1001, name, 张三, age,
; const user await redis.hgetall(user:
; console.log(Hash值, user); // { name: 张三, age: 25 } } // 操作 ZSet async function testZSet() { await redis.zadd(rank:score, 90, 小明, 85, 小红); const rank await redis.zrevrange(rank:score, 0, -1, WITHSCORES); console.log(ZSet排行榜, rank); // [ 小明, 90, 小红, 85 ] } // 执行测试 testString(); testHash(); testZSet();
总结Redis 是高性能内存数据库核心优势是速度快、支持多数据结构、可持久化主要用于缓存、分布式锁、排行榜等场景核心数据结构包括 String缓存 / 计数器、Hash对象存储、List消息队列、Set去重 / 抽奖、ZSet排行榜需根据场景选择合适类型生产环境需注意配置持久化混合持久化、设置密码、开启主从 / 哨兵保证高可用同时规避缓存穿透、击穿、雪崩等问题操作 Redis 时优先使用原子命令如 SET NX EX、Lua 脚本、管道提升性能和安全性。
掌握本文的内容后你可以应对大部分 Redis 日常使用场景进阶学习可深入研究 Redis 集群、源码、性能调优等方向。