集成Redis緩存

一 簡介

1 場景

由於首頁數據變化不是很頻繁,而且首頁訪問量相對較大,所以我們有必要把首頁數據緩存到redis中,減少數據庫壓力和提高訪問速度。

2 RedisTemplate

Jedis是Redis官方推薦的面向Java的操作Redis的客戶端,而RedisTemplate是Spring Data Redis中對Jedis api的高度封裝。

Spring Data Redis是spring大家族的一部分,提供了在srping應用中通過簡單的配置訪問redis服務,對reids底層開發包(Jedis, JRedis, and RJC)進行了高度封裝,RedisTemplate提供了redis各種操作、異常處理及序列化功能,支持發佈訂閱,並對spring cache進行了實現。

二 引入redis

1 項目中集成redis

common父模塊中添加redis依賴,Spring Boot 2.0以上默認通過commons-pool2連接池連接redis

<!-- spring boot redis緩存引入 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- lecttuce 緩存連接池-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2 添加redis連接配置

service_cms 和 service_edu 的 application.yml 中添加如下配置

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0
    password:
    lettuce:
      pool:
        max-active: 20  #最大連接數,負值表示沒有限制,默認8
        max-wait: -1    #最大阻塞等待時間,負值表示沒限制,默認-1
        max-idle: 8     #最大空閒連接,默認8
        min-idle: 0     #最小空閒連接,默認0

3 配置Redis

service-base添加RedisConfig

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory){
        RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer()); //key的序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //value序列化
        return redisTemplate;
    }
}

三 測試redisTemplate

1 測試redis數據存儲

ApiAdController中添加下面的方法進行測試

@Autowired
private RedisTemplate redisTemplate;

@PostMapping("save-test")
public R saveAd(@RequestBody Ad ad){
    redisTemplate.opsForValue().set("index::myad", ad);
    return R.ok();
}

@GetMapping("get-test/{key}")
public R getAd(@PathVariable String key){
    Ad ad = (Ad)redisTemplate.opsForValue().get(key);
    return R.ok().data("ad", ad);
}

@DeleteMapping("remove-test/{key}")
public R removeAd(@PathVariable String key){
    Boolean delete = redisTemplate.delete(key);
    System.out.println(delete);
    Boolean aBoolean = redisTemplate.hasKey(key);
    System.out.println(aBoolean);
    return R.ok();
}

2 常用方法

redisTemplate提供了以下幾種存儲數據的方法

redisTemplate.opsForValue(); //操作字符串
redisTemplate.opsForHash(); //操作hash
redisTemplate.opsForList(); //操作list
redisTemplate.opsForSet(); //操作set
redisTemplate.opsForZSet(); //操作有序set

四 使用緩存註解

1 修改Redis配置類

配置類上添加註解

@EnableCaching

添加bean配置

@Bean
public CacheManager cacheManager(LettuceConnectionFactory connectionFactory) {
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            //過期時間600秒
            .entryTtl(Duration.ofSeconds(600))
            // 配置序列化
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
            .disableCachingNullValues();
    RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
            .cacheDefaults(config)
            .build();
    return cacheManager;
}

2 添加緩存註解

@Cacheable(value = "xxx", key = "'xxx'"):標註在方法上,對方法返回結果進行緩存。下次請求時,如果緩存存在,則直接讀取緩存數據返回;如果緩存不存在,則執行方法,並把返回的結果存入緩存中。一般用在查詢方法上。

service_cms:AdServiceImpl

@Cacheable(value = "index", key = "'selectByAdTypeId'")

service_edu:CourseServiceImpl

@Cacheable(value = "index", key = "'selectHotCourse'")

service_edu:TeacherServiceImpl

@Cacheable(value = "index", key = "'selectHotTeacher'")

 

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