1. 程式人生 > >SpringBoot快取-整合Redis

SpringBoot快取-整合Redis

現在我們都知道SpringBoot整合的套路了吧,開箱即用,所以我們基本引入依賴,稍作配置就可以使用了。
下面我們簡單的來看下SpringBoot和Redis的整合。

1.引入依賴

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置主機

spring:
  redis: 
    host: 192.168
.10.173

3.測試使用

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootCacheExamApplicationTests {

    @Autowired
    EmployeeMapper employeeMapper;

    @Autowired
    StringRedisTemplate stringRedisTemplate;  //操作k-v都是字串的

    @Autowired
    RedisTemplate<Object,Object> redisTemplate;  //操作k-v都是物件的
@Test public void test1(){//常用操作 stringRedisTemplate.opsForValue().append("msg","hello"); String msg = stringRedisTemplate.opsForValue().get("msg"); System.out.println(msg); stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS); stringRedisTemplate.boundValueOps
("test").increment(-1);//val做-1操作 stringRedisTemplate.boundValueOps("test").increment(1);//val做+1操作 stringRedisTemplate.opsForValue().get("test");//根據key獲取快取中的val stringRedisTemplate.getExpire("test");//根據key獲取過期時間 stringRedisTemplate.getExpire("test",TimeUnit.SECONDS);//根據key獲取過期時間並換算成指定單位 String str = stringRedisTemplate.opsForValue().get("test")+"___"+stringRedisTemplate.getExpire("test")+"___"+stringRedisTemplate.getExpire("test",TimeUnit.SECONDS); System.out.println("test1: "+str); stringRedisTemplate.delete("test");//根據key刪除快取 System.out.println("test2: "+stringRedisTemplate.opsForValue().get("test")); System.out.println(stringRedisTemplate.hasKey("546545"));//檢查key是否存在,返回boolean值 System.out.println(stringRedisTemplate.hasKey("msg")); stringRedisTemplate.opsForList().rightPush("testlist","1"); stringRedisTemplate.opsForList().rightPush("testlist","2"); stringRedisTemplate.opsForList().rightPush("testlist", "A"); stringRedisTemplate.opsForList().rightPush("testlist", "B"); // leftPush依次由左邊新增 stringRedisTemplate.opsForList().leftPush("testlist", "0"); stringRedisTemplate.opsForList().leftPush("testlist222", "0"); stringRedisTemplate.opsForSet().add("myset", "1","2","3");//向指定key中存放set集合 stringRedisTemplate.expire("myset",1000,TimeUnit.MILLISECONDS);//設定過期時間 System.out.println(stringRedisTemplate.opsForSet().isMember("myset", "1"));//根據key檢視集合中是否存在指定資料 System.out.println(stringRedisTemplate.opsForSet().members("myset"));//根據key獲取set集合 stringRedisTemplate.opsForHash().put("user:123456", "id","1"); stringRedisTemplate.opsForHash().put("user:123456", "name", "產品部"); stringRedisTemplate.opsForHash().put("user:1", "id","2"); stringRedisTemplate.opsForHash().put("user:1", "name", "技術部"); List<Object> keys = new ArrayList<Object>(); keys.add("name"); keys.add("id"); System.out.println(stringRedisTemplate.opsForHash().multiGet("user:1",keys)); } //測試redisTemplate儲存物件 @Test public void test2(){ Employee emp = employeeMapper.getEmpById(1); //如果儲存物件,預設使用jdk序列化機制,序列化後的資料儲存到redis中 //執行此句報錯org.springframework.data.redis.serializer.SerializationException: Cannot serialize;` redisTemplate.opsForValue().set("emp111",emp); //解決辦法: Employee實現序列化介面 //我們習慣存json格式,有兩種實現方式 //(1)將物件轉為json //(2)自定義redisTemplate序列化規則; }

3-1. 自定義redisTemplate序列化規則

@Configuration
public class RedisConfig {

    // 自定義快取key生成策略

    @Bean
    public KeyGenerator keyGenerator() {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(
            RedisConnectionFactory factory) {

        RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
        template.setConnectionFactory(factory);

        template.setKeySerializer(new StringRedisSerializer());

        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);        
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;

    }
}

3-2 .執行結果
這裡寫圖片描述

4.測試快取

4-1.快取原理

      我們之前用的是預設的快取管理器:ConcurrentMapCacheManager,然後ConcurrentMapCacheManager會幫我們創建出快取元件ConcurrentMapCache,ConcurrentMapCache來實現具體的CURD,給快取中存取資料。那麼我們加入了Redis以後會有什麼變化呢?
這裡寫圖片描述
我們可以看到此時我們的容器中儲存的是 RedisCacheManager【預設是開啟的SimpleCacheConfiguration】,然後RedisCacheManager 幫我們建立 RedisCache 來作為快取元件;RedisCache來操作資料。

4-2 快取測試
測試方法同上一篇部落格:https://blog.csdn.net/try_try_try/article/details/80666185

1.我們訪問http://localhost:8080/emp/1來查詢1號員工,控制檯列印SQL,我們的Redis中已經快取了1號員工的資料.
這裡寫圖片描述
我們可以看到key=1,如果有多個物件就不太好區分了,我們可以通過自定義快取管理器類設定一些所需要的規則。

@Primary  //將某個快取管理器作為預設的
    @Bean
    public RedisCacheManager myCacheManager(RedisTemplate<Object, Object> myRedisTemplate){
        RedisCacheManager cacheManager = new RedisCacheManager(myRedisTemplate);
        //使用字首,預設會將CacheName作為key的字首
        cacheManager.setUsePrefix(true);
        cacheManager.setDefaultExpiration(1800);

        return cacheManager;
    }

2.再次查詢1號員工,控制檯無輸出。