跳转到内容

初识 Redis


Redis(Remote Dictionary Server) 是一个开源的基于内存的键值型数据库,由 Salvatore Sanfilippo 开发,现由 Redis Ltd. 维护。它将数据存储在内存中,支持持久化到磁盘,兼顾了极高的读写性能与数据安全性。

Redis 的三种主要用途:

用途说明典型场景
缓存将热点数据存入内存,减少数据库压力商品详情、用户信息缓存
分布式存储跨服务共享状态数据Session 共享、分布式锁
消息队列利用 List/Stream 实现轻量级队列异步任务、发布订阅

Redis 和 Memcached 都是基于内存的缓存中间件,但定位有明显差异:

对比项RedisMemcached
数据类型String / Hash / List / Set / ZSet 等仅 String
持久化支持 RDB + AOF❌ 不支持
集群原生集群 + 哨兵客户端分片
原子操作支持事务、Lua 脚本仅单命令原子
发布订阅✅ 支持❌ 不支持
性能单线程模型,约 10 万 QPS多线程,高并发略优
适用场景缓存 + 丰富业务场景纯高性能缓存
Client ──▶ Redis Server(单线程事件循环)
├── 内存数据库(所有数据)
│ ├── db[0] key-value pairs
│ ├── db[1] ...
│ └── db[15]
├── 持久化模块(RDB / AOF)
└── 复制模块(主从 / 哨兵 / 集群)
Redis 数据类型
├── 基础类型
│ ├── String → 字符串、数字、二进制
│ ├── Hash → 字段-值的映射(类似 Java HashMap)
│ ├── List → 有序可重复列表(双端队列)
│ ├── Set → 无序不重复集合
│ └── ZSet → 有序不重复集合(按 score 排序)
└── 高级类型
├── Bitmap → 位图,适合签到、状态标记
├── HyperLogLog → 基数统计(UV 统计)
├── Geo → 地理坐标,支持距离计算
└── Stream → 消息流,支持消费者组

Redis 的命令执行是单线程的(6.0 后网络 I/O 引入多线程,但命令执行仍单线程),这是它高性能的关键之一:

客户端请求 ──▶ I/O 多路复用(epoll)──▶ 事件队列 ──▶ 单线程执行命令
无锁、无上下文切换
约 10 万 QPS
version: '3'
services:
redis:
image: redis:7.0
container_name: redis
ports:
- "6379:6379"
command: redis-server --requirepass 123456 --appendonly yes
volumes:
- redis_data:/data
volumes:
redis_data:
Terminal window
docker-compose up -d
Terminal window
# 进入容器
docker exec -it redis redis-cli -a 123456
# 测试连通性
ping # → PONG
# 基本读写
SET hello "Redis" # → OK
GET hello # → "Redis"
# 查看服务信息
INFO server
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池(推荐) -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
spring:
data:
redis:
host: localhost
port: 6379
password: 123456
database: 0 # 使用第 0 号数据库
lettuce:
pool:
max-active: 8 # 最大连接数
max-idle: 8 # 最大空闲连接
min-idle: 0 # 最小空闲连接
max-wait: 100ms # 获取连接最大等待时间
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void testRedis() {
stringRedisTemplate.opsForValue().set("hello", "Redis");
String value = stringRedisTemplate.opsForValue().get("hello");
System.out.println(value); // → Redis
}
概念一句话总结
内存数据库数据存内存,读写速度约为磁盘的 100 倍
单线程执行命令串行执行,无锁,约 10 万 QPS
持久化RDB 快照 + AOF 日志,保证重启不丢数据
过期机制惰性删除 + 定期删除,到期不立即清理
主从复制数据同步到 Slave,实现读写分离
哨兵 / 集群高可用方案,自动故障转移