八、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、結語

按照慣例寫個結語,嗯...看了很多大佬的教程,結合我自己的總結了一波,當然了,不足之處請多包涵,也請多指教...如有雷同,也請多包涵......

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