springboot整合redis的去中心化集群模式
1)引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2)编写配置类
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 业务需求。
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
3)编写实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "readers")
public class Reader {
@TableId(type = IdType.AUTO)
private Integer readerId;
private String name;
private String sex;
private String dept;
private String status;
private String address;
}
4)编写dao层
public interface ReaderMapper extends BaseMapper<Reader> {
}
5)编写service层
service层接口;public interface ReaderService {
/**
* 根据readerid查询相对应的reader信息
* @param readerId
* @return
*/
Reader getReaderByReaderId(Integer readerId);
/**
* 根据readerId删除相对应的reader信息
* @param readerId
* @return
*/
int deleteReaderByReaderId(Integer readerId);
/**
* 根据reader修改相对应的reader信息
* @param reader
* @return
*/
int updateReaderByReaderId(Reader reader);
}
service层实现类:
非注解模式
@Service
public class ReaderServiceImpl implements ReaderService {
@Autowired
private ReaderMapper readerMapper;
@Autowired
private RedisTemplate redisTemplate;
@Override
public Reader getReaderByReaderId(Integer readerId) {
Object o = redisTemplate.opsForValue().get("getReaderByReaderId::" + readerId);
if (o!=null){
return (Reader) o;
}
Reader reader = readerMapper.selectById(readerId);
redisTemplate.opsForValue().set("getReaderByReaderId::"+readerId,reader);
return reader;
}
@Override
public int deleteReaderByReaderId(Integer readerId) {
redisTemplate.delete("getReaderByReaderId::"+readerId);
int i = readerMapper.deleteById(readerId);
return i;
}
@Override
public int updateReaderByReaderId(Reader reader) {
redisTemplate.delete("getReaderByReaderId::"+reader.getReaderId());
int i = readerMapper.updateById(reader);
redisTemplate.opsForValue().set("getReaderByReaderId::"+reader.getReaderId(),reader);
return i;
}
}
注解模式
@Service
public class ReaderServiceImpl implements ReaderService {
@Autowired
private ReaderMapper readerMapper;
@Autowired
private RedisTemplate redisTemplate;
@Override
//该注解的作用是:会先去redis缓存中查询是否存在所需要的数据,
// 如果存在,则不执行代码块,直接返回缓存中的数据,
// 如果redis缓存中不存在所需数据,则执行该方法,并将查询的数据放入redis缓存中。
//缓存中的key默认以 getReaderByReaderId::readerid拼接起来
@Cacheable(cacheNames = "getReaderByReaderId" ,key = "#readerid")
public Reader getReaderByReaderId(Integer readerId) {
Reader reader = readerMapper.selectById(readerId);
return reader;
}
@Override
//beforeInvocation:默认为false,是否在方法执行前就清空,
// 如果指定为 true,则在方法还没有执行的时候就清空缓存。如果为false且方法执行抛出异常,则不会清空缓存。
@CacheEvict(cacheNames = "getReaderByReaderId",key = "#readerid")
public int deleteReaderByReaderId(Integer readerId) {
redisTemplate.delete("getReaderByReaderId::"+readerId);
int i = readerMapper.deleteById(readerId);
return i;
}
@Override
//这个注解是必须执行方法体,而且会把方法体执行的结果放入到缓存中。 如果发生异常则不操作缓存。
@CachePut(cacheNames = "getReaderByReaderId",key = "#reader.id")
public int updateReaderByReaderId(Reader reader) {
int i = readerMapper.updateById(reader);
return i;
}
}
6)编写controller层
@RestController
public class ReaderController {
@Autowired
private ReaderService readerService;
@GetMapping("getReaderByReaderId/{readerId}")
public Reader getReader(@PathVariable("readerId")Integer readerId){
Reader reader = readerService.getReaderByReaderId(readerId);
return reader;
}
@GetMapping("deleteReaderByReaderId/{readerId}")
public int deleteReader(@PathVariable("readerId")Integer readerId){
int i = readerService.deleteReaderByReaderId(readerId);
return i;
}
@GetMapping("updateReaderByReaderId")
public int updateReader(Reader reader){
int i = readerService.updateReaderByReaderId(reader);
return i;
}
}
在启动类上添加注解
@SpringBootApplication
@MapperScan(basePackages = "com.lipeng.fbms.dao")
@EnableCaching //开启缓存注解
public class FbmsLipengApplication {
public static void main(String[] args) {
SpringApplication.run(FbmsLipengApplication.class, args);
}
}