引言
在前面的文章中,我们系统学习了 MySQL 关系型数据库。然而,在高并发场景下,MySQL 的磁盘 I/O 往往会成为性能瓶颈。这时就需要引入一种基于内存 的数据库------Redis ,它可以将频繁访问的热点数据缓存到内存中,读写速度可达每秒10万次以上。
Redis 常与 MySQL 配合使用,构成"MySQL 持久化存储 + Redis 缓存"的经典架构。本文将详细讲解 Redis 的安装、五种基本数据类型及其完整操作命令。

第一部分:Redis 基础
一、什么是 Redis
| 属性 | 说明 |
|---|---|
| 全称 | REmote DIctionary Server |
| 开发语言 | C 语言 |
| 存储介质 | 内存(掉电丢失,需持久化) |
| 默认端口 | 6379 |
| 架构模式 | CS 架构(redis-server + redis-cli) |
| 数据库类型 | NoSQL(非关系型,键值对存储) |
二、Redis vs MySQL
| 对比项 | MySQL | Redis |
|---|---|---|
| 数据库类型 | 关系型(SQL) | 非关系型(NoSQL) |
| 存储介质 | 磁盘 | 内存 |
| 数据格式 | 表(行+列) | 键值对 + 多种数据结构 |
| 读写速度 | 数千次/秒 | 10万+次/秒 |
| 持久化 | 天然持久化 | 需额外配置(RDB/AOF) |
| 事务 | ACID 严格 | 弱事务(无回滚) |
三、安装 Redis
切换管理员权限
sudo su
安装 Redis(客户端自动安装)
apt install redis-server
查看服务状态
service redis status
查看端口监听
netstat -natp | grep 6379
连接客户端
redis-cli
测试连接
127.0.0.1:6379> ping
PONG

四、基本全局命令
切换数据库(默认 16 个,编号 0-15)
SELECT 0
查看当前数据库键数量
DBSIZE
查看所有键
KEYS *
判断键是否存在
EXISTS key
查看键的类型
TYPE key
删除键
DEL key
清空当前数据库
FLUSHDB
清空所有数据库
FLUSHALL
设置过期时间(秒)
EXPIRE key seconds
查看剩余时间(-1 永不过期,-2 已过期)
TTL key
第二部分:五种基本数据类型
一、字符串 String
String 是 Redis 最基础的类型,二进制安全 ,最大能存储 512MB。可以存文本、数字、甚至序列化后的对象。
1.1 基本读写
设置值
SET name "disen"
获取值
GET name
输出:"disen"
多个键值对批量设置
MSET key1 val1 key2 val2
多个键值对批量获取
MGET key1 key2
1.2 数值操作
虽然存储为字符串,但 Redis 能识别整数格式并进行原子运算:
自增 1
SET count 10
INCR count
GET count # 11
自减 1
DECR count # 10
指定步长增减
INCRBY count 5 # 15
DECRBY count 3 # 12
应用场景:文章浏览量统计、计数器、限流器。
1.3 字符串操作
追加字符串
SET s "hello"
APPEND s " world"
GET s # "hello world"
获取字符串长度
STRLEN s # 11
获取子串(索引从 0 开始,负值从末尾计)
GETRANGE s 0 4 # "hello"
GETRANGE s 6 -1 # "world"
替换子串
SETRANGE s 6 "Redis"
GET s # "hello Redis"
二、列表 List
List 是双向链表 ,支持两端操作,可以模拟栈和队列。单个列表最多存储 2³² - 1 个元素(约 40 亿)。

2.1 插入与弹出
bash
# 从左侧插入
LPUSH mylist 1 # [1]
LPUSH mylist 2 # [2, 1]
LPUSH mylist 3 # [3, 2, 1]
# 从右侧插入
RPUSH mylist 4 # [3, 2, 1, 4]
# 从左侧弹出
LPOP mylist # 返回 "3",列表变为 [2, 1, 4]
# 从右侧弹出
RPOP mylist # 返回 "4",列表变为 [2, 1]
2.2 范围查询
bash
# 查看所有元素
LRANGE mylist 0 -1 # 返回全部
# 查看前两个
LRANGE mylist 0 1
# 查看倒数两个
LRANGE mylist -2 -1
2.3 进阶操作
bash
# 获取列表长度
LLEN mylist
# 根据索引获取元素
LINDEX mylist 0
# 根据索引设置元素值
LSET mylist 0 "newval"
# 删除指定数量的匹配元素(count>0从左,<0从右,=0删除全部)
LREM mylist 2 "val" # 从左删除 2 个值为 "val" 的元素
# 元素转移:将 m1 的右侧元素弹出,插入到 m2 的左侧
RPOPLPUSH m1 m2
三、集合 Set
Set 是无序的、元素不重复的集合 。底层用哈希表实现,最多存储 2³² - 1 个元素。

3.1 基本操作
bash
# 添加元素(返回 1 表示新增,返回 0 表示重复)
SADD myset "xiaowang"
SADD myset "xiaoli" "xiaoming" # 批量添加
# 查看所有元素
SMEMBERS myset
# 判断元素是否存在(1=存在,0=不存在)
SISMEMBER myset "xiaowang"
# 获取元素个数
SCARD myset
# 删除元素
SREM myset "xiaowang"
# 随机获取元素(不删除)
SRANDMEMBER myset 1
3.2 集合运算
bash
SADD setA 1 2 3 4
SADD setB 3 4 5 6
# 交集
SINTER setA setB # {3, 4}
# 并集
SUNION setA setB # {1, 2, 3, 4, 5, 6}
# 差集
SDIFF setA setB # {1, 2}
应用场景:
-
抽奖系统 :
SRANDMEMBER随机抽取中奖者 -
共同关注:取两个用户的粉丝集合交集
-
好友推荐:取差集,发现"你可能认识的人"
四、哈希 Hash
Hash 可以理解为一个 Map<字段, 值> ,特别适合存储对象。

4.1 基本操作
bash
# 设置单个字段
HSET student:1 id 1001
HSET student:1 name "小白"
HSET student:1 age 23
# 获取单个字段
HGET student:1 name # "小白"
# 批量设置多个字段
HMSET student:2 id 1002 name "小黑" age 24
# 批量获取多个字段
HMGET student:2 id name
# 获取所有字段和值
HGETALL student:1
# 获取所有字段名
HKEYS student:1
# 获取所有值
HVALS student:1
# 删除字段
HDEL student:1 age
Hash vs String 存储对象对比:
| 方式 | 优点 | 缺点 |
|---|---|---|
| String 存 JSON | 简单 | 修改一个字段需要整体序列化 |
| Hash 分字段 | 可单独读写字段 | 稍微复杂 |
五、有序集合 ZSet
ZSet 在 Set 的基础上为每个元素关联一个 score(分数) ,元素按 score 自动排序。

5.1 基本操作
bash
# 添加元素(score 在前,member 在后)
ZADD rank 98 "小王"
ZADD rank 95 "小李" 87 "小明" 72 "小红" # 批量添加
# 查看元素(升序)
ZRANGE rank 0 -1 # 全部,按 score 升序
ZRANGE rank 0 -1 WITHSCORES # 带分数
# 查看元素(降序)
ZREVRANGE rank 0 -1 WITHSCORES
# 按 score 范围查询
ZRANGEBYSCORE rank 80 100
# 获取元素 score
ZSCORE rank "小王"
# 获取元素排名(升序,从 0 开始)
ZRANK rank "小王"
# 获取元素个数
ZCARD rank
# 删除元素
ZREM rank "小明"
应用场景:
-
排行榜:游戏积分榜、销量榜、热搜榜
-
带权重的任务队列:优先级高的任务先执行
-
延迟队列:score = 执行时间戳,按时间顺序执行
第三部分:地理信息 GEO
Redis 3.2+ 支持地理位置存储,底层使用 ZSet 实现。
bash
# 添加城市经纬度(经度,纬度,名称)
GEOADD china:city 116.40 39.90 beijing
GEOADD china:city 121.47 31.23 shanghai
GEOADD china:city 108.94 34.26 xian
GEOADD china:city 106.50 29.53 chongqing
# 获取城市经纬度
GEOPOS china:city xian
# 计算两城市直线距离(单位:km)
GEODIST china:city xian beijing km # 约 910 km
# 查找指定城市周围 1000km 内的城市
GEORADIUSBYMEMBER china:city xian 1000 km
应用场景:网约车查找附近车辆、附近商家推荐、LBS 社交。
第四部分:Redis 进阶概念速览
一、持久化
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| RDB | 定期快照全量数据 | 恢复快,文件小 | 可能丢失最后一次快照后的数据 |
| AOF | 记录每条写操作日志 | 数据更安全 | 文件大,恢复慢 |
二、缓存三大问题
| 问题 | 现象 | 解决方案 |
|---|---|---|
| 缓存穿透 | 查询不存在的数据,请求穿透到 MySQL | 布隆过滤器、空值缓存 |
| 缓存击穿 | 热点 key 过期,大量请求打到 MySQL | 互斥锁、永不过期 |
| 缓存雪崩 | 大量 key 同时过期 | 过期时间加随机值、多级缓存 |
三、主从复制

第五部分:数据类型对比总结
| 类型 | 特点 | 适用场景 |
|---|---|---|
| String | 键值对,二进制安全 | 缓存对象、计数器、分布式锁 |
| List | 双向链表,有序可重复 | 消息队列、最新消息、栈 |
| Set | 无序、不重复、支持交并差 | 抽奖、共同关注、标签 |
| Hash | Map 结构,字段单独操作 | 对象存储、购物车 |
| ZSet | 有序 Set,按 score 排序 | 排行榜、优先级队列、延迟队列 |
| GEO | 地理位置,底层 ZSet | 附近的人、网约车 |
总结
一、Redis 核心命令速查
| 类型 | 增 | 删 | 改 | 查 |
|---|---|---|---|---|
| String | SET | DEL | SET/APPEND | GET |
| List | LPUSH/RPUSH | LPOP/RPOP/DEL | LSET | LRANGE |
| Set | SADD | SREM/DEL | --- | SMEMBERS |
| Hash | HSET | HDEL/DEL | HSET | HGET/HGETALL |
| ZSet | ZADD | ZREM/DEL | ZADD(更新score) | ZRANGE/ZSCORE |
| GEO | GEOADD | ZREM | --- | GEOPOS/GEODIST |
二、Redis 与 MySQL 配合使用

三、一句话记忆
Redis 是基于内存的 NoSQL 数据库,默认端口 6379,支持 String、List、Set、Hash、ZSet 五种基本类型和 GEO 地理位置类型,常作为 MySQL 的缓存层使用,读写速度可达 10 万次/秒以上。