八、springboot 集成 redis

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、特点

  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  3. 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、结语

按照惯例写个结语,嗯...看了很多大佬的教程,结合我自己的总结了一波,当然了,不足之处请多包涵,也请多指教...如有雷同,也请多包涵......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章