因爲 Ehcache 存在於單個 java 程序的進程中,沒法知足多個程序分佈式的狀況,須要將多個服務器的緩存集中起來進行管理,須要一個緩存的寄存器,這裏使用的是 Redis。css
當應用程序要去緩存中讀取數據,可是緩存中沒有找到該數據,則從新去數據庫中獲取數據,而後將數據存入緩存中。
還有當咱們須要更新或者刪除緩存中的數據時候,須要讓緩存失效。html
在系統配置文件中加入 redis 的鏈接參數:java
spring:
redis:
host: 192.168.19.200 # 120.79.208.199 # host ,默認 localhost
port: 6379 # 端口號,默認6379
pool:
# 設置都是默認值,能夠按需求設計
max-active: 8 # 可用鏈接實例的最大數目,默認值爲8;若是賦值爲-1,則表示不限制;
max-idle: 8 # 控制一個pool最多有多少個狀態爲idle(空閒的)的redis實例,默認值也是8。
max-wait: -1 # 等待可用鏈接的最大時間,單位毫秒,默認值爲-1,表示永不超時。
min-idle: 0 # 控制一個pool最少有多少個狀態爲idle(空閒的)的redis實例,默認值爲0。
timeout: 0 # 鏈接超時時間 單位 ms,默認爲0
password: master # 密碼,根據本身的 redis 設計,默認爲空
而後在系統入口啓動類上面加入打開緩存的註解 @EnableCaching
。
若是沒啓用其餘緩存,這樣就自動打開 redis 緩存。redis
還能夠自定義註冊 RedisCacheManager,設置相關參數:spring
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
// 設置緩存最大時間 24 h
redisCacheManager.setDefaultExpiration(24 * 60 * 60);
return redisCacheManager;
}
@Service
@CacheConfig(cacheNames = "em")
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeDao dao;
@Override
@Cacheable(key = "#p0")
public Employee findOne(Long id) {
return dao.findOne(id);
}
/** * 更新緩存中的數據, * 因爲 redis 是存在外部,不是 ehcache 那樣存在於項目進程中,須要咱們主動去更新 緩存 * @param employee * @return */
@Override
@Transactional(rollbackFor = Exception.class)
@CachePut(key = "#p0.id")
public Employee update(Employee employee) {
return dao.save(employee);
}
/** * 一樣主動去刪除 cache * @param id */
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(key = "#p0")
public void delete(Long id) {
dao.delete(id);
}
}
註解的使用參考前面的學習Spring Boot:(二十一)使用 EhCache 實現數據緩存 數據庫