Redis核心基础与实战:数据类型、缓存策略与性能优化
一、Redis简介
Redis(Remote Dictionary Server)是一款开源的、基于BSD协议的高性能键值对数据库。与传统数据库相比,Redis具有以下三大特点:
- 数据持久化:可将内存中的数据保存到磁盘,重启后重新加载。
- 丰富的数据结构:支持String、List、Hash、Set、Sorted Set等。
- 主从备份:支持master-slave模式的数据备份。
1.1 Redis优势
| 性能极高 | 10万~100万+ QPS,微秒级响应 |
| 数据类型丰富 | 二进制安全的字符串、列表、哈希、集合、有序集合 |
| 原子性 | 所有操作原子,支持事务 |
| 丰富特性 | 发布订阅、Key过期、Lua脚本、Pipeline等 |
1.2 哈希槽(Hash Slot)
Redis集群将键空间划分为16384个哈希槽(0~16383),通过公式 HASH_SLOT = CRC16(key) mod 16384 计算键所属槽位,实现数据分片和动态迁移。
1.3 常见应用场景
- 热点数据缓存:电商、社交等高并发场景,采用Cache-Aside模式,设置合理TTL。
- 分布式锁:利用SETNX + 过期时间 + Lua脚本解锁。
- 计数器与限流:INCR原子递增,结合过期时间实现接口限流。
- 排行榜系统:Sorted Set按分数实时排序。
- 分布式会话:集中存储用户会话,支持水平扩展。
- 消息队列:List实现简单队列,BRPOP阻塞获取。
- 位图应用:签到、活跃用户统计。
- 地理信息存储:GEO结构实现附近的人/店铺查询。
1.4 Redis单线程模型
Redis 6.0之前使用单线程处理请求,原因:
- 操作基于内存,速度快;
- 核心功能比数据库简单;
- 避免线程竞争开销;
- 使用epoll等IO多路复用技术,一个线程处理多个socket。
二、数据类型详解
Redis所有key都是字符串,value支持以下5种基本类型。
2.1 String(字符串)
- 最大容量512MB,二进制安全。
- 常用命令:
| SET key value [EX seconds] [NX|XX] | 设置值 |
| GET key | 获取值 |
| MSET key1 val1 [key2 val2 …] | 批量设置 |
| MGET key1 [key2 …] | 批量获取 |
| INCR key / INCRBY key increment | 原子递增 |
| APPEND key value | 追加 |
| STRLEN key | 返回长度 |
| EXPIRE key seconds | 设置过期时间 |
2.2 List(列表)
- 有序、可重复,左右均可操作。
- 最多2^32-1个元素。
- 常用命令:
| LPUSH key value [value…] | 左边插入 |
| RPUSH key value [value…] | 右边插入 |
| LPOP key / RPOP key | 弹出元素 |
| LRANGE key start stop | 获取指定范围元素 |
| LLEN key | 获取长度 |
| LINDEX key index | 索引取值 |
| LTRIM key start stop | 修剪列表 |
2.3 Set(集合)
- 无序、无重复,支持集合间操作。
- 常用命令:
| SADD key member [member…] | 添加成员 |
| SMEMBERS key | 获取所有成员 |
| SISMEMBER key member | 判断是否存在 |
| SINTER key1 [key2…] | 交集 |
| SUNION key1 [key2…] | 并集 |
| SDIFF key1 [key2…] | 差集 |
2.4 ZSet(有序集合)
- 每个元素关联一个double类型分数(score),按分数排序,元素不可重复,分数可重复。
- 常用命令:
| ZADD key score member [score member…] | 添加 |
| ZRANGE key start stop [WITHSCORES] | 按分数升序返回 |
| ZREVRANGE key start stop [WITHSCORES] | 降序 |
| ZRANK key member | 获取排名(升序) |
| ZSCORE key member | 获取分数 |
| ZREM key member [member…] | 删除 |
2.5 Hash(哈希)
- 键值对集合,适合存储对象。
- 常用命令:
| HSET key field value | 设置字段 |
| HGET key field | 获取字段 |
| HMSET key field1 value1 [field2 value2…] | 批量设置 |
| HGETALL key | 获取所有字段和值 |
| HDEL key field [field…] | 删除字段 |
| HKEYS key / HVALS key | 获取所有字段或值 |
三、Redis缓存三大问题及解决方案
3.1 缓存穿透
定义:查询一个不存在的数据(缓存和数据库都没有),导致请求直接打到数据库。
解决方案:
- 接口层校验(如ID<=0直接拦截)。
- 缓存空结果(短TTL)。
- 布隆过滤器:预先将所有可能存在的数据哈希到bitmap,请求前过滤。
3.2 缓存击穿
定义:某个热点Key恰好过期,大量并发请求同时打到数据库。
解决方案:
- 加锁排队:查询数据库时加互斥锁,只允许一个线程重建缓存。
- 设置永不过期:逻辑上设置永不过期,后台异步更新。
3.3 缓存雪崩
定义:大面积缓存同时过期或Redis宕机,大量请求涌入数据库。
解决方案:
- 过期时间加随机值(如10分钟 + 1~5分钟随机)。
- 搭建高可用集群(哨兵、Cluster)。
- 服务限流熔断(Sentinel/Hystrix)。
- 多级缓存(本地缓存 + Redis)。
四、Pipeline流水线
Redis是客户端-服务端模型,执行一条命令需要RTT(往返时间)。Pipeline将一组命令打包,一次RTT发送给Redis,并按顺序返回结果,大幅提升性能(尤其网络延迟较大时)。
对比示例:
| 本机 | 573ms | 134ms |
| 内网服务器 | 1610ms | 240ms |
| 异地机房 | 80000ms | 1104ms |
五、Redis安装与配置
5.1 源码安装(CentOS7)
yum install tcl gcc gcc-c++ -y
tar zxvf redis-6.2.14.tar.gz -C /usr/local/
cd /usr/local/redis-6.2.14/
make && make install
redis-server redis.conf &
5.2 常用配置项
| bind 0.0.0.0 | 监听所有地址 |
| port 6379 | 默认端口 |
| daemonize yes | 后台运行 |
| requirepass foobared | 设置密码 |
| maxmemory <bytes> | 最大内存 |
| maxmemory-policy noeviction | 淘汰策略 |
5.3 动态配置(CONFIG命令)
CONFIG SET requirepass 123456
CONFIG GET requirepass
CONFIG SET maxmemory 1G
六、Redis慢查询
Redis慢查询日志记录执行时间超过 slowlog-log-slower-than(微秒)的命令。
# 查看慢查询条数
SLOWLOG LEN
# 获取慢查询记录
SLOWLOG GET [n]
# 清空慢查询
SLOWLOG RESET



