1、简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
1.1、特点
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
2、引入依赖
<!-- redis 缓存依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
3、添加 yml 相关配置
只配置了最最基本的,我本人的redis是没有设置密码的,所以我这里没有添加密码设置
spring:
redis:
host: localhost
database: 0
timeout: 10000
3、创建配置类
添加一个 RedisConfig 类
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class) // 在加载配置的类之后再加载当前类
public class RedisConfig {
@Bean
public RedisCacheManager 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);
//配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
// .entryTtl(Duration.ZERO)
.entryTtl(Duration.ofDays(1L)) //设置默认缓存1天
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
Set<String> cacheNames = new HashSet<>();
cacheNames.add("wzpLjy");
// cacheNames.add("wzp");
// cacheNames.add("ljy");
// 对每个缓存空间应用不同的配置
Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
configMap.put("wzpLjy", config);
// configMap.put("wzp", config.entryTtl(Duration.ofSeconds(30L))); //这个缓存空间30秒
// configMap.put("ljy", config.entryTtl(Duration.ofHours(1L))); //这个缓存空间30秒
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.initialCacheNames(cacheNames)// 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
.withInitialCacheConfigurations(configMap)
.build();
return cacheManager;
}
}
注意:在项目启动类上加上 @EnableCaching 注解
4、示例
4.1、model实体类
@Entity
@Getter
@Setter
public class User implements Serializable {
private static final long serialVersionUID = -2565653911716253067L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Long createAt = System.currentTimeMillis();
private Long updateAt = System.currentTimeMillis();
private String username;
private String password;
private String name;
private String sex;
private String age;
private String tel;
}
4.2、Repository
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
@Override
@CacheEvict(value = "user",allEntries=true)
User save(User user);
@Override
@Cacheable(value = "user")
void delete(User user);
@Override
@Cacheable(value = "user")
List<User> findAll();
}
4.3、controller
@RestController
@Api(tags = "用户接口管理")
public class UserController {
@Autowired
private UserRepository userRepository;
@PostMapping("save")
@ApiOperation("新增用户")
public User save (@RequestBody User user){
userRepository.save(user);
return user;
}
@PostMapping("findAll")
@ApiOperation("查询用户")
public List findAll (){
List list = userRepository.findAll();
return list;
}
}
5、测试
测试我就不贴了,因为我是使用的 hibernate jpa 操作,控制台打印sql语句,第一次请求接口的时候缓存里面没有,会直接查找数据库,有sql语句打印。第二次是在缓存里面查询,未对数据库进行任何操作,故没有sql语句打印,即可判断redis缓存是否生效
6、结语
按照惯例写个结语,嗯...看了很多大佬的教程,结合我自己的总结了一波,当然了,不足之处请多包涵,也请多指教...如有雷同,也请多包涵......