個人博客:haichenyi.com。感謝關注
前面一篇說到了spring boot自帶的緩存SimpleCache,我們也聊到了他的底層實際上就是HashMap,並且這個緩存是放在內存當中的,這樣弊端也是有的,比如:內存大小,當服務器關閉之後,緩存就沒了等等。
簡介
實際開發中,一般使用緩存中間件:Redis,EHCache,MemCache等等,今天,我們就來聊聊,經常聽到的——Redis。
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)——來自官方介紹
不去追究原理,我們可以這樣理解Redis:
- 支持多種數據類型,redis支持set,zset,list,hash,string這五種數據類型,操作方便。
- 作爲一個內存數據庫,最擔心的,就是萬一機器死機宕機,數據就會消失掉。redis使用RDB和AOF做數據的持久化存儲。主從數據同時,生成rdb文件,並利用緩衝區添加新的數據更新操作做對應的同步。
- 與服務器解耦,緩存是一個單獨的服務器,當我們項目重啓的時候,緩存依然存在。
- 我們只用的話,它就是給我們提供了一系列方法的接口,我們只用調用它的API即可。
用法
第一步,添加啓動器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
第二步,配置你的服務器地址,不配置的話,默認是本地:配置信息一樣在 自動配置類——data包——redis包——RedisProperties類 裏面去找
#指定redis服務器地址,指定的是本地
spring.redis.host=127.0.0.1
第三步,添加了redis的配置類,當數據庫添加複雜數據的時候,也能以Json的格式正常顯示。
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
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);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
第四步,正常寫接口,在service層裏面,自己去把數據寫進緩存裏面,
package com.haichenyi.springboottask.service;
import com.haichenyi.springboottask.Provider;
import com.haichenyi.springboottask.mapper.ProviderMapper;
import com.haichenyi.springboottask.utils.RedisClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Desc
* @Auther 海晨憶
* @Time 2019/11/6
*/
@Service
public class ProviderService {
@Autowired
ProviderMapper providerMapper;
@Autowired
RedisClient redisClient;
public Provider getProviderById(Integer pid) {
Provider provider = (Provider) redisClient.get(pid);
if (provider != null) {
return provider;
}
Provider provider1 = providerMapper.getProviderByPid(pid);
redisClient.set(pid, provider1);
return provider1;
}
}
如上代碼,我們通過id獲取一個Provider,我們先從緩存去取,如果,取不到,說明緩存沒有,那麼,我們就去從數據庫去取,取到之後,再把這條數據放進緩存裏面。
就是上一篇講默認緩存的註解的功能,redis裏面需要我們自己去實現。
這裏的 RedisClient 類,是自己封裝的redis使用的類,至於redis怎麼使用,redis的中文官網的命令頁面寫的很清楚。
記得本地電腦裝一個Redis服務。然後再本地裝一個redis可視化工具。