Skip to content

缓存配置

如何在Spring Boot项目中配置Redis,并提供了一些常用的缓存键名和键值格式化方法。

Maven坐标

xml
<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和登录端点信息联合起来构造出对应的登录用户信息键名。

使用流程


使用方式

🙅注意

下面的仅是使用示例,不代表所有用法。

  1. 通过pom文件引入依赖。
xml
<dependency>
	<groupId>com.ikingtech.platform</groupId>
	<artifactId>service-cache</artifactId>
<dependency>
  1. 使用示例
  • 在需要使用Redis缓存的地方,可以直接注入objRedisTemplate或者stringRedisTemplate进行操作。

例如,要保存一个用户对象到Redis:

  • 示例:
java
@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获取一个字符串值:

java
@Autowired
private StringRedisTemplate stringRedisTemplate;

public String getAccessToken(String token) {
    String key = CacheConstants.accessTokenKeyFormat(token);
    return stringRedisTemplate.opsForValue().get(key);
}

使用注意事项

  1. 注意数据类型选择:Redis支持多种数据类型(String, List, Set, Sorted Set, Hash),不同的数据类型应用于不同的场景。例如,如果需要记录用户的在线状态,可以采用Set进行操作。
  2. 缓存的过期时间:根据业务需求,在键值对创建时,应设置合适的过期时间,以避免数据长时间占用内存空间。
  3. 线程安全问题:在并发环境下,特别是涉及到修改操作(set/update)的时候,需要考虑线程安全问题。你可能需要使用事务或者分布式锁来确保数据的一致性。
  4. 序列化策略:在使用Redis存储对象时,需要选择合适的序列化策略。Jackson2JsonRedisSerializer 是一个常用的序列化工具,但也需要注意其在反序列化时可能存在的版本兼容性问题。
  5. 缓存穿透和雪崩问题:当大量请求同时查询一个不存在的键时(缓存穿透),或者大量数据同时过期时(缓存雪崩),都可能给Redis服务器带来巨大压力。为此,需要设计合理的缓存策略,如设置默认空值、预先热加载等。
  6. 错误处理:当Redis服务器出现故障或网络出现问题时,应如何处理?可能需要考虑的方案包括但不限于:降级(使用本地缓存)、切换备用服务器等。