缓存配置
如何在Spring Boot项目中配置Redis,并提供了一些常用的缓存键名和键值格式化方法。
Maven坐标
<dependency>
<groupId>com.ikingtech.framework</groupId>
<artifactId>sdk-cache</artifactId>
</dependency>
Redis 缓存配置与使用说明
配置Redis
在 CacheConfiguration
类中,配置了三个Bean:
cacheManager, objRedisTemplate, 和 stringRedisTemplate.
cacheManager: 这是Spring Boot对缓存操作的抽象接口, 此处使用Redis作为缓存实现。通过连接工厂lettuceConnectionFactory,创建了一个RedisCacheManager。缓存键名规范化为单冒号分隔形式,并为所有缓存数据提供了默认的序列化机制。同时禁用了对空值的缓存。
objRedisTemplate: 用于对象的存储。其核心是使用了Jackson2JsonRedisSerializer进行序列化,这使得可以直接将复杂对象存储到Redis中。它支持在事务中使用。
stringRedisTemplate: 用于字符串的存储。它比objRedisTemplate更加基础,只能用来存储字符串类型的键值对。
定义缓存键名常量
在 CacheConstants 接口中,定义了一些常用的缓存键名,这样就可以避免在代码里硬编码这些键名。
键名 | 键名释意 |
---|---|
USER_AUTH_DETAILS | 数据权限信息缓存 |
USER_CONFIG | 用户配置信息缓存 |
ACCESS_TOKEN | 访问令牌 |
LOGIN_USER | 已登录用户信息 |
IDENTITY_EXTENSION_REPORTER | 已登录用户信息 |
SYSTEM_VARIABLE | 系统参数信息缓存 |
ABNORMAL_TENANT | 非正常状态租户缓存前缀 |
格式化缓存键值
在 CacheConstants
接口中,还提供了一些用于格式化缓存键值的静态方法。 例如 accessTokenKeyFormat(String token)
方法将访问令牌转换为Redis的键名形式。loginUserFormat(String userId, String endpoint)
方法则将用户ID和登录端点信息联合起来构造出对应的登录用户信息键名。
使用流程
使用方式
🙅注意
下面的仅是使用示例,不代表所有用法。
- 通过pom文件引入依赖。
<dependency>
<groupId>com.ikingtech.platform</groupId>
<artifactId>service-cache</artifactId>
<dependency>
- 使用示例
- 在需要使用Redis缓存的地方,可以直接注入objRedisTemplate或者stringRedisTemplate进行操作。
例如,要保存一个用户对象到Redis:
- 示例:
@Autowired
private RedisTemplate<String, Object> objRedisTemplate;
public void saveUser(User user) {
String key = CacheConstants.loginUserFormat(user.getId(), user.getEndpoint());
objRedisTemplate.opsForValue().set(key, user);
}
如果你需要从Redis获取一个字符串值:
@Autowired
private StringRedisTemplate stringRedisTemplate;
public String getAccessToken(String token) {
String key = CacheConstants.accessTokenKeyFormat(token);
return stringRedisTemplate.opsForValue().get(key);
}
使用注意事项
- 注意数据类型选择:Redis支持多种数据类型(String, List, Set, Sorted Set, Hash),不同的数据类型应用于不同的场景。例如,如果需要记录用户的在线状态,可以采用Set进行操作。
- 缓存的过期时间:根据业务需求,在键值对创建时,应设置合适的过期时间,以避免数据长时间占用内存空间。
- 线程安全问题:在并发环境下,特别是涉及到修改操作(set/update)的时候,需要考虑线程安全问题。你可能需要使用事务或者分布式锁来确保数据的一致性。
- 序列化策略:在使用Redis存储对象时,需要选择合适的序列化策略。Jackson2JsonRedisSerializer 是一个常用的序列化工具,但也需要注意其在反序列化时可能存在的版本兼容性问题。
- 缓存穿透和雪崩问题:当大量请求同时查询一个不存在的键时(缓存穿透),或者大量数据同时过期时(缓存雪崩),都可能给Redis服务器带来巨大压力。为此,需要设计合理的缓存策略,如设置默认空值、预先热加载等。
- 错误处理:当Redis服务器出现故障或网络出现问题时,应如何处理?可能需要考虑的方案包括但不限于:降级(使用本地缓存)、切换备用服务器等。