一、数据结构与常用命令
1. 字符串(String)
-
特点:二进制安全,支持动态扩容(SDS结构),可存储字符串、数字等。
-
常用命令:
-
SET key value:设置值 -
GET key:获取值 -
INCR key:自增(原子操作) -
SETEX key seconds value:设置带过期时间的值
-
2. 哈希(Hash)
-
特点:键值对集合,适合存储对象。
-
常用命令:
-
HSET key field value:设置字段值 -
HGET key field:获取字段值 -
HGETALL key:获取所有字段值
-
3. 列表(List)
-
特点:双向链表,支持头部/尾部操作。
-
常用命令:
-
LPUSH key value:左插入 -
RPUSH key value:右插入 -
LPOP key:左弹出 -
LRANGE key start end:范围查询
-
4. 集合(Set)
-
特点:无序、唯一,底层用哈希表或整数集合(intset)实现。
-
常用命令:
-
SADD key member:添加元素 -
SMEMBERS key:获取所有元素 -
SINTER key1 key2:求交集
-
5. 有序集合 (Sorted Set)
-
特点:有序、唯一,每个元素关联一个分数(score),底层用跳表(SkipList)实现。
-
常用命令:
-
ZADD key score member:添加元素 -
ZRANGE key start end WITHSCORES:按分数范围查询
-
二、通用命令与客户端
1. 通用命令
-
KEYS *:查询所有键(谨慎使用,避免阻塞) -
EXPIRE key seconds:设置键过期时间 -
TTL key:查看键剩余过期时间 -
DEL key:删除键
2. Java 客户端
-
Jedis:
-
Jedis jedis = new Jedis("localhost", 6379); jedis.set("name", "zhangsan"); String value = jedis.get("name"); jedis.close();
-
-
Redisson ( 分布式锁 ) :
-
// 配置 Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379"); RedissonClient redisson = Redisson.create(config); // 加锁 RLock lock = redisson.getLock("myLock"); lock.lock(); try { // 业务逻辑 } finally { lock.unlock(); }
-
三、持久化机制
1. RDB (快照持久化)
-
原理:定时将内存数据生成快照文件(
.rdb)。 -
触发方式:
- 手动:
SAVE(阻塞)、BGSAVE(异步) - 自动:在
redis.conf中配置(如save 900 1表示900秒内至少1次写操作则触发)。
- 手动:
-
优缺点:
-
优点:文件小,恢复快。
-
缺点:可能丢失最近数据(两次快照间的数据)。
-
2. AOF (日志持久化)
-
原理:记录所有写操作命令,重启时重放命令恢复数据。
-
配置:
appendonly yes:开启AOFappendfsync always|everysec|no:同步策略(默认everysec)。
-
优缺点:
-
优点:数据安全性高(最多丢失1秒数据)。
-
缺点:文件体积大,恢复速度慢。
-
四、主从复制与哨兵模式
1. 主从复制(一主多从)
-
作用:数据备份、读写分离。
-
配置步骤:
- 主节点:正常配置(
bind 0.0.0.0,关闭保护模式)。 - 从节点:在
redis.conf中添加replicaof 主节点IP 端口。
- 主节点:正常配置(
-
验证:
-
主节点执行
INFO replication查看从节点列表。 -
从节点执行
INFO replication确认角色为slave。
-
2. 哨兵模式( Sentinel )
-
作用:自动监控主从节点,主节点故障时自动故障转移。
-
配置步骤:
-
创建
sentinel.conf:-
sentinel monitor mymaster 主节点IP 端口 2 sentinel down-after-milliseconds mymaster 30000
-
-
启动哨兵:
redis-sentinel sentinel.conf。
-
五、缓存常见问题与解决方案
1. 缓存穿透
-
问题:请求不存在的数据,导致数据库压力过大。
-
解决方案:
-
缓存空对象:查询不存在的数据时缓存
NULL(设置短过期时间)。 -
布隆过滤器:提前过滤无效请求(Google Guava实现)。
-
2. 缓存击穿
-
问题:热门key过期瞬间,大量请求直达数据库。
-
解决方案:
-
互斥锁(Redisson) :只允许一个线程重建缓存。
-
热点数据永不过期:手动更新缓存,避免自动过期。
-
3. 缓存雪崩
-
问题:大量key同时过期或缓存服务故障,请求直达数据库。
-
解决方案:
-
随机化过期时间:给key添加随机过期时间偏移。
-
多级缓存:本地缓存(如Ehcache)+ Redis,减少Redis压力。
-
限流降级:限制请求量,非核心业务返回默认值。
-
六、 分布式锁 实现
1. 核心要求
-
互斥性、原子性、过期时间、可重入性、安全性(避免误删其他线程的锁)。
2. Redisson 实现
-
加锁:
-
RLock lock = redisson.getLock("resourceLock"); lock.lock(10, TimeUnit.SECONDS); // 加锁并设置过期时间
-
-
释放锁:
-
if (lock.isHeldByCurrentThread()) { lock.unlock(); }
-
-
特点:自动续期(锁持有线程存活时,过期时间自动延长)。