SpringBoot快取-整合Redis
阿新 • • 發佈:2018-12-19
現在我們都知道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號員工,控制檯無輸出。