七十四.引入Redis缓存
程序员文章站
2024-02-27 20:53:03
...
在webshop-prodect项目的pom.xml文件中引入相关依赖,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!--排除redis的异步客户端lettuce-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入redis的客户端jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
修改webshop-prodect项目的application.yml文件,加上redis的相关配置,如下:
新建redis的配置类RedisConfig,具体内容如下:
package com.example.springboot.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import javax.annotation.PostConstruct;
@Configuration
public class RedisConfig {
@Autowired
private RedisTemplate redisTemplate;
@PostConstruct
public void init() {
initRedisTemplate();
}
/**
* 设置redis的key-value序列化器为字符串序列化器
*/
private void initRedisTemplate() {
RedisSerializer stringSerializer = redisTemplate.getStringSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
}
}
之后就可以使用注入RedisTemplate类来操作redis中的相应数据,或者使用SpringCache的注解方式来操作redis中数据,而哪些数据是可以放入redis的,需要根据业务情况做分析,读多写少的数据放入redis可以大程度减少与数据库的磁盘交互,基于内存的数据读取可以极大的优化数据查询性能,但是如果是写多读少的数据,要考虑的点就比较多了,如何保证缓存一致性就是一个大问题,是采用双写模式还是失效模式,解决方案就还得针对到具体的数据类型了,比如如果要求数据是强一致性的,那么建议加锁排队,保证操作数据的顺序,如果要求数据是最终一致性,可以容忍短时间的数据不一致,那么给缓存数据加上过期时间即可,当然了,还有一种类型的锁叫做读写锁,可以做到读读操作时无锁,而只要有写操作发生就加锁,阻塞后续的操作,这样在写时就可以保证数据的一致性,而读时的性能又不会受影响。