一、 SpringBoot 之 Redis
Redis 作为一款强大的内存数据存储系统,在现代应用开发中具有不可替代的地位。SpringBoot 框架以其简洁高效的特点,为与 Redis 的集成提供了便利。
二、Redis 简介
Redis 是一个开源的、使用内存存储的键值对数据结构服务器,支持多种数据结构和丰富的操作命令,常用于缓存、数据存储、消息队列等场景。
三、Redis-cli 操作
- 连接 Redis 服务器
redis-cli -h <host> -p <port>
:指定主机和端口进行连接。
- 基本操作命令
- 字符串操作
SET key value [EX seconds|PX milliseconds] [NX|XX]
:设置字符串值,并可设置过期时间和条件。GET key
:获取字符串值。INCR key
:将字符串值自增 1。
- 哈希操作
HSET key field value
:设置哈希字段值。HGET key field
:获取哈希字段值。HDEL key field [field...]
:删除哈希字段。
- 列表操作
LPUSH key value [value...]
:在列表头部添加元素。RPUSH key value [value...]
:在列表尾部添加元素。LPOP key
:弹出列表头部元素。RPOP key
:弹出列表尾部元素。
- 集合操作
SADD key member [member...]
:向集合添加元素。SMEMBERS key
:获取集合所有元素。SREM key member [member...]
:从集合删除元素。
- 有序集合操作
ZADD key score member [score member...]
:添加有序集合元素及分数。ZRANGE key start stop [WITHSCORES]
:按索引范围获取元素及分数。ZREM key member [member...]
:删除有序集合元素。
- 字符串操作
四、Redis 的过期时间设置
- 命令设置
EXPIRE key seconds
:设置键的过期时间,以秒为单位。PEXPIRE key milliseconds
:设置键的过期时间,以毫秒为单位。
- 数据结构层面设置
- 在使用
SET
命令设置字符串值时,可以通过EX
或PX
选项设置过期时间。
- 在使用
五、Spring Boot 集成 Redis
- 引入依赖
在项目的pom.xml
文件中添加spring-boot-starter-data-redis
依赖。 - 配置连接信息
在application.properties
或application.yml
文件中配置 Redis 的主机地址、端口、密码等连接参数,例如:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=your_password
六、Spring Boot 中 Redis 的操作
- 字符串操作
redisTemplate.opsForValue().set(key, value)
:设置字符串值。redisTemplate.opsForValue().get(key)
:获取字符串值。
- 哈希操作
redisTemplate.opsForHash().putAll(hashKey, map)
:批量设置哈希字段值。redisTemplate.opsForHash().entries(hashKey)
:获取哈希的所有字段和值。
- 列表操作
redisTemplate.opsForList().leftPush(listKey, value)
:在列表头部添加元素。redisTemplate.opsForList().rightPop(listKey)
:弹出列表尾部元素。
- 集合操作
redisTemplate.opsForSet().add(setKey, values)
:向集合添加元素。redisTemplate.opsForSet().members(setKey)
:获取集合所有元素。
- 有序集合操作
redisTemplate.opsForZSet().add(zsetKey, value, score)
:添加有序集合元素及分数。redisTemplate.opsForZSet().range(zsetKey, start, end)
:按索引范围获取元素。
七、Redis 分布式锁
- 分布式锁的概念及应用场景
- 概念:在分布式系统中,用于协调多个进程或线程对共享资源的访问,确保同一时间只有一个进程或线程能够获取锁并进行操作。
- 应用场景:如分布式任务调度、分布式事务处理等。
- 实现方式 - Redisson
- Redisson 是一个基于 Redis 的 Java 分布式锁实现框架。
- 提供了丰富的锁类型和特性,如可重入锁、公平锁、读写锁等。
- 示例代码:
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
RLock lock = redisson.getLock("your_lock_key");
try {
// 尝试获取锁,最多等待 10 秒,锁自动释放时间为 30 秒
boolean acquired = lock.tryLock(10, 30, TimeUnit.SECONDS);
if (acquired) {
// 执行业务逻辑
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 释放锁
lock.unlock();
}
- 分布式锁的注意事项
- 锁的超时时间设置要合理,避免锁提前释放或无法释放。
- 处理锁获取失败的情况,进行适当的重试或错误处理。
八、Redis 的过期策略
- 定时删除
- 为每个设置了过期时间的键创建一个定时器,当过期时间到达时,删除键。
- 优点:保证内存及时释放。
- 缺点:消耗 CPU 资源。
- 惰性删除
- 当获取键时,检查键是否过期,如果过期则删除。
- 优点:节省 CPU 资源。
- 缺点:可能导致内存无法及时释放。
- 定期删除
- 每隔一段时间,随机检查一定数量的设置了过期时间的键,删除其中过期的键。
- 是定时删除和惰性删除的一种平衡策略。
九、Redis 的淘汰策略
noeviction
:默认策略,当内存使用达到限制时,不删除数据,新的写入操作会报错。volatile-lru
:从设置了过期时间的数据中,使用 LRU 算法删除最近最少使用的数据。volatile-ttl
:从设置了过期时间的数据中,删除即将过期的数据。volatile-random
:从设置了过期时间的数据中,随机删除数据。allkeys-lru
:从所有数据中,使用 LRU 算法删除最近最少使用的数据。allkeys-random
:从所有数据中,随机删除数据。
十、Redis 的持久化
- RDB(Redis Database Backup)
- 原理:将 Redis 在某一时刻的数据快照保存到磁盘文件中。
- 优点:恢复数据速度快,适合大规模数据的备份。
- 缺点:可能会丢失数据,因为是定时保存。
- AOF(Append Only File)
- 原理:将 Redis 执行的写命令记录到日志文件中。
- 优点:数据完整性更好,最多丢失一秒的数据。
- 缺点:文件较大,恢复数据相对较慢。
十一、Redis 作为缓存的应用
- 缓存数据的策略
- 确定缓存的粒度,是缓存整个对象还是部分属性。
- 设置合适的缓存过期时间,根据数据的更新频率和重要性。
- 缓存穿透、缓存雪崩和缓存击穿的解决方案
- 缓存穿透:
- 对不存在的数据也进行缓存(空值或特殊标识)。
- 使用布隆过滤器快速判断数据是否存在。
- 缓存雪崩:
- 给不同的缓存设置不同的过期时间,避免集中过期。
- 增加互斥锁或分布式锁,控制并发访问数据库。
- 缓存击穿:
- 对热点数据设置永不过期。
- 使用锁机制,保证只有一个线程去查询数据库并更新缓存。
- 缓存穿透:
十二、注意事项
- 数据一致性
- 当使用 Redis 作为缓存时,要注意与数据库的数据一致性问题,通过合适的更新策略和同步机制来解决。
- 内存管理
- 监控 Redis 的内存使用情况,及时调整数据结构和优化存储方式。
- 性能优化
- 根据业务需求,合理选择数据结构和操作命令,以提高性能。
综上所述,Spring Boot 与 Redis 的集成提供了强大的功能和灵活的应用方式,但在实际使用中需要充分考虑各种因素,以确保系统的稳定和高效运行。