spring boot使用經驗分享(四)redis

一、pom.xm文件引入對應的包

<code><dependency> 

<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-data-redis/<artifactid>
/<dependency>/<code>

二、redis配置

常用client有兩種:Jedis和Lettuce,spring boot框架中在1.x.x的版本時默認使用的jedis,2.x.x版本默認使用的lettuce

Jedis :

jedis是直連模式,在多個線程間共享一個 Jedis 實例時是線程不安全的,需要使用連接池。但是當連接數量增多時,成本較高。

Lettuce:(推薦)

Lettuce連接基於Netty,連接實例可以在多個線程間併發訪問。可以滿足多線程環境下的併發訪問,一個連接實例不夠的情況也可以按需增加連接實例。

<code># Redis服務器地址
spring.redis.host=127.0.0.1
# Redis服務器連接端口
spring.redis.port=6379
# Redis數據庫索引(默認為0)
spring.redis.database=0
# Redis服務器連接密碼(默認為空)
spring.redis.password=
# 連接超時時間(毫秒)
spring.redis.timeout=1000
# Lettuce
# 連接池最大連接數(-1表示沒有限制)默認 8
spring.redis.lettuce.pool.max-active=8

# 連接池最大阻塞等待時間(-1表示沒有限制)默認 -1
spring.redis.lettuce.pool.max-wait=1000
# 連接池中的最大空閒連接,默認 8
spring.redis.lettuce.pool.max-idle=8
# 連接池中的最小空閒連接,默認 0
spring.redis.lettuce.pool.min-idle=0
/<code>

三、redis配置類

@Configuration

@EnableCaching

public class RedisConfig extends CachingConfigurerSupport {

@Bean(name = "redisTemplate")

public RedisTemplate<string> redisTemplate(RedisConnectionFactory redisConnectionFactory) {/<string>

RedisTemplate<string> template = new RedisTemplate<>();/<string>

template.setConnectionFactory(redisConnectionFactory);

//使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值

Jackson2JsonRedisSerializer<object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);/<object>

ObjectMapper mapper = new ObjectMapper();

mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(mapper);

template.setValueSerializer(jackson2JsonRedisSerializer);

StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

//使用StringRedisSerializer來序列化和反序列化redis的key值

template.setKeySerializer(stringRedisSerializer);

template.setKeySerializer(stringRedisSerializer);

// hash的key也採用String的序列化方式

template.setHashKeySerializer(stringRedisSerializer);

// value序列化方式採用jackson

template.setValueSerializer(jackson2JsonRedisSerializer);

// hash的value序列化方式採用jackson

template.setHashValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;

}

@Bean

public CacheManager cacheManager(RedisConnectionFactory factory) {

RedisSerializer<string> redisSerializer = new StringRedisSerializer();/<string>

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);

// 配置序列化(解決亂碼的問題)

RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()

.entryTtl(Duration.ZERO)

.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))

.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))

.disableCachingNullValues();

RedisCacheManager cacheManager = RedisCacheManager.builder(factory)

.cacheDefaults(config)

.build();

return cacheManager;

}

}

四、緩存註解

1)@Cacheable@Cacheable可以標記在方法上(表示該方法是支持緩存的),也可以標記在一個類上(表示該類所有方法都支持緩存)。

方法上添加了@Cacheable標記,Spring會在其被調用後將其返回值緩存起來(以鍵值對方式)下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果。

針對緩存的key,Spring支持兩種策略,默認策略和自定義策略

@Cacheable需要配置的有value、key和condition。

value表示當前方法的返回值會被緩存Cache的名稱。可以是一個Cache也可以是多個Cache,當需要指定多個Cache時其是一個數組。

用來指定Spring緩存時對應的key的。該屬性支持SpringEL表達式自定義key。如果沒有指定該屬性時,Spring將使用默認策略生成key。

<code>@Cacheable(value = "product", key = "#id")
public Product findById(Long id)/<code>

2)@CacheEvict清除緩存,根據cachename,key和condition刪除緩存

比@Cacheable多兩個屬性:allentries,beforeInvocation

allentries 默認為false,設置為true的話就不用設置key了,會刪除value指定的cachename下所有的緩存

beforeInvocation 默認為false,默認spring是會在調用方法成功之後清除緩存的,如果方法裡面拋錯了自然也就不清除了,但是把此值設置為true的話spring會在調用方法前就刪除緩存,也就是說不管方法執行結果如何緩存都刪。

3)@CachePut@CachePut將執行結果以鍵值對的形式存入指定的緩存中,常用於更新緩存。

4)@Caching

有時候我們可能組合多個Cache註解使用,如下。

<code>@Caching(put = {
@CachePut(value = "product", key = "#product.id"),
@CachePut(value = "product", key = "#product.name"),
@CachePut(value = "product", key = "#product.price")
})/<code>


spring boot使用經驗分享(四)redis


分享到:


相關文章: