Spring boot下配置使用redis--註解形式,springredis--
繼上一篇的template編碼方式使用redis
編碼形式配置(一)
編碼形式使用(二)
經過深入學習發現註解形式的更好用一些,省去一些繁瑣的代碼,使得你代碼看起來更優雅
安裝redis服務端請看編碼形式配置(一)
1. pom.xml
添加jar包支援,使用springboot內建的redis啟動器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2. Redis設定檔
這裡新加入了緩衝管理器,來管理redis.
Spring 3.1 引入了基於注釋(annotation)的緩衝(cache)技術,它不是一個具體的緩衝實現方案(例如EHCache 或者 OSCache、Redis等),而是一個對緩衝使用的抽象,通過在既有代碼中添加少量它定義的各種 annotation,即能夠達到緩衝方法的返回對象的效果。
RedisConfig.java
import java.io.Serializable;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.HashOperations;import org.springframework.data.redis.core.ListOperations;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.SetOperations;import org.springframework.data.redis.core.ValueOperations;import org.springframework.data.redis.core.ZSetOperations;import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.lang.reflect.Method;@Slf4j@Configuration@EnableCaching//啟用緩衝,這個註解很重要;//繼承CachingConfigurerSupport,為了自訂產生KEY的策略。可以不繼承。public class RedisConfig extends CachingConfigurerSupport{//因為生產環境和開發環境使用不同的啟動資源檔,所以使用了@Profile,用來指定使用的啟動資源檔 @Configuration @Profile(value={"dev"})//如果你不需要的話可以刪掉 static class LocalConfiguration { //從application.properties中獲得以下參數 @Value("${redis.host}") private String host; @Value("${redis.port}") private Integer port; @Value("${redis.password}") private String password; /** * 緩衝管理器. * @param redisTemplate * @return */ @Bean public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) { CacheManager cacheManager = new RedisCacheManager(redisTemplate); return cacheManager; } @Bean public RedisTemplate<Serializable, Serializable> redisTemplate( JedisConnectionFactory redisConnectionFactory) { log.info("------------------------------------------"); log.info("-----------------local redis--------------"); log.info("------------------------------------------"); RedisTemplate<Serializable, Serializable> redisTemplate = new RedisTemplate<Serializable, Serializable>(); //key序列化方式;(不然會出現亂碼;),但是如果方法上有Long等非String類型的話,會報類型轉換錯誤; //所以在沒有自己定義key建置原則的時候,以下這個代碼建議不要這麼寫,可以不配置或者自己實現 ObjectRedisSerializer //或者JdkSerializationRedisSerializer序列化方式; redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate .setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate .setHashValueSerializer(new JdkSerializationRedisSerializer()); //以上4條配置可以不用 redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } @Bean public JedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(); redisConnectionFactory.setHostName(host); redisConnectionFactory.setPort(port); redisConnectionFactory.setPassword(password); return redisConnectionFactory; } } /** * 自訂key. * 此方法將會根據類名+方法名+所有參數的值產生唯一的一個key */ @Override public KeyGenerator keyGenerator() { log.info("RedisCacheConfig.keyGenerator()"); return new KeyGenerator() { @Override public Object generate(Object o, Method method, Object... objects) StringBuilder sb = new StringBuilder(); sb.append(o.getClass().getName()); sb.append(method.getName()); for (Object obj : objects) { sb.append(obj.toString()); } log.info("keyGenerator=" + sb.toString()); return sb.toString(); } }; }}
@Profile(value={“dev”})代表開發環境用的配置
@Slf4j 是lombok中的註解,不用的可以刪掉
3. 使用案例
import java.io.Serializable;import java.util.List;import javax.annotation.Resource;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.github.pagehelper.PageHelper;@Slf4j@Transactional@Servicepublic class UserServiceImpl implements IUserService { @Autowired private IUserDao userDao; // 因為設定檔繼承了CachingConfigurerSupport,所以沒有指定key的話就是用預設KEY建置原則產生,我們這裡指定了KEY @Cacheable(value = "userInfo", key = "'findUser' + #id", condition = "#id%2==0") // value屬性指定Cache名稱 // 使用key屬性自訂key // condition屬性指定發生的條件(如上樣本表示只有當user的id為偶數時才會進行緩衝) @Override public UserDto findProperty(String id) { UserDto user = userDao.findUser(id); return user; } /** * * @CachePut也可以聲明一個方法支援緩衝功能。 * 與@Cacheable不同的是使用@CachePut標註的方法在執行前不會去檢查緩衝中是否存在之前執行過的結果, * 而是每次都會執行該方法,並將執行結果以索引值對的形式存入指定的緩衝中。 * */ @CachePut("users") // 每次都會執行方法,並將結果存入指定的緩衝中 @Override public List<UserDto> mybatisQueryAll() { return userDao.selectAll(); } @Override // @CacheEvict(value="propertyInfo",allEntries=true) 清空全部 // 刪除指定緩衝 @CacheEvict(value = "propertyInfo", key = "'findUser' + #id") // 其他屬性 // allEntries是boolean類型,表示是否需要清除緩衝中的所有元素。預設為false,表示不需要。當指定了allEntries為true時,Spring Cache將忽略指定的key。 // 清除操作預設是在對應方法成功執行之後觸發的,即方法如果因為拋出異常而未能成功返回時也不會觸發清除操作。 // 使用beforeInvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,Spring會在調用該方法之前清除緩衝中的指定元素。 public String cacheEvict(String id) { log.info("刪除緩衝" + id); return null; } /** * @Caching註解可以讓我們在一個方法或者類上同時指定多個Spring Cache相關的註解。 * 其擁有三個屬性:cacheable、put和evict,分別用於指定@Cacheable、@CachePut和@CacheEvict。 */ @Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"), @CacheEvict(value = "cache3", allEntries = true) }) public UserDto find(Integer id) { return null; }}
註解詳細說明請參考註解說明
是不是感覺註解的形式代碼很優雅
有任何問題,請留言^^
-
頂
-
2
-
踩
-
0
查看評論