一 簡介
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'")