1 Redis介绍
1.1 Redis作为缓存
由于Redis的存取效率非常高,在开发实践中,通常会将一些数据从关系型数据库(例如MySQL)中读取出来,并写入到Redis中,后续当需要访问相关数据时,将优先从Redis中读取所需的数据,以此,可以提高数据的读取效率,并且对一定程度的保护关系型数据库。
一旦使用Redis后,相关的数据就会同时存在于关系型数据和Redis中,即同一个数据有2份或更多(如果你使用了更多的Redis服务或其它数据处理技术),则可能出现数据不同步的问题!
1.2 数据一致性问题
如果最终出现了关系型数据库和Redis中的数据不同的问题,则称之为“数据一致性问题
”
-
更新数据库成功 -> 更新缓存失败 -> 数据不一致
-
更新缓存成功 -> 更新数据库失败 -> 数据不一致
1.3 redis缓存使用场景
-
高频率访问的数据
- 例如热门榜单
-
修改频率非常低的数
- 例如商品的类别
-
对于数据的“准确性”要求不高的
- 例如商品的库存余量(因为不管余量为多少,只有真正付款的时候才会去判断是否买到)
1.4 redis使用缓存的时机
关于在项目中应用Redis,首先考虑何时将MySQL中的数据读取出来并写入到Redis中!常见的策略有:
1 直接尝试从Redis中读取数据,如果Redis中无此数据,则从MySQL中读取并写入到Redis
从运行机制上,类似于单例模式中的懒汉式
2 当项目启动时,就直接从MySQL中读取数据并写入到Redis
从运行机制上,类似于单例模式中的饿汉式
这种做法通常称之为“缓存预热”当使用缓存预热的处理机制时,需要使得某段代码是项目启动时就自动执行的,可以自定义组件类实现AppliacationRunner接口,重写其中的run( )方法,此方法将在项目启动完成之后自动调用。
2 SpringBoot集成Redis
2.1 安装redis
地址Releases · microsoftarchive/redis · GitHub
2.2 在springboot中引入依赖
<!--集成redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.7.18</version>
</dependency>
2.3 添加redis配置信息
# spring配置
spring:redis:database: 0 # redis数据库索引(默认为0)host: localhostport: 6379timeout: 5000 # mspassword: 123456
2.4 编写redis配置类、工具类
/*** redis配置*/
@Configuration
@AutoConfigureBefore(RedissonAutoConfiguration.class)
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {// 创建 RedisTemplate 对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。template.setConnectionFactory(factory);// 使用 String 序列化方式,序列化 KEY 。template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。template.setValueSerializer(RedisSerializerUtils.getSerializer());template.setHashValueSerializer(RedisSerializerUtils.getSerializer());return template;}}
public class RedisSerializerUtils {privat