spring-data-redis 2.0 的使用示例代碼
在使用Spring Boot2.x運(yùn)行Redis時(shí),發(fā)現(xiàn)百度不到順手的文檔,搞通后發(fā)現(xiàn)其實(shí)這個(gè)過程非常簡(jiǎn)單和簡(jiǎn)潔,覺得有必要拿出來分享一下。
Spring Boot2.x 不再使用Jedis,換成了Lettuce。Lettuce是基于 Netty 實(shí)現(xiàn)的,所以性能更好。但是我看到很多文章居然在Spring Boot 2.x還在寫Jedis的配置。
依賴
依賴比較簡(jiǎn)單,spring-boot-starter-data-redis、commons-pool2 即可。
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
屬性配置
在屬性中配置Redis Server的訪問地址、密碼、數(shù)據(jù)庫(kù),并配置連接池的屬性。
redis:
# reids的連接ip
host: 127.0.0.1
port: 6379
password: helloworld
# Redis默認(rèn)情況下有16個(gè)分片,這里配置具體使用的分片,默認(rèn)是0
database: 0
# 連接超時(shí)時(shí)間(毫秒)
timeout: 10000ms
# redis client配置,使用lettuce
lettuce:
pool:
# 連接池中的最小空閑連接 默認(rèn) 0
min-idle: 0
# 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制) 默認(rèn) -1
max-wait: 1000ms
# 連接池最大連接數(shù)(使用負(fù)值表示沒有限制) 默認(rèn) 8
max-active: 8
# 連接池中的最大空閑連接 默認(rèn) 8
max-idle: 8
注解配置
全局使能緩存
@EnableSwagger2 // 使用swagger api 功能
@EnableCaching // 使用緩存
@SpringBootApplication
public class Starter {
public static void main(String[] args) {
SpringApplication.run(Starter.class, args);
}
}
通過注解使用緩存,@Cacheable 將獲取值存入緩存
/**
* 基于id 獲取用戶信息
*/
@Cacheable(value="user", key="#id", unless="#result == null")
public UserDTO GetUserById(int id) {
User userEntity = userMapper.getUserByID(id);
if (userEntity == null){
return null;
}
/* entity 轉(zhuǎn) DTO */
UserDTO userDTO = new UserDTO();
userDTO.setAge(userEntity.getAge());
userDTO.setId(id);
userDTO.setName(userEntity.getName());
userDTO.setCreateTime(unixTime2String(userEntity.getCreateTime()));
userDTO.setPhone(userEntity.getPhone());
userDTO.setEmail(userEntity.getEmail());
return userDTO;
}
@CachePut 更新緩存
@CachePut(value = "user", key="#p0.id")
public UserDTO updateUser(InputUserInfoDTO inputUserInfoDTO){
userMapper.updateUser(inputUserInfoDTO.getId(), inputUserInfoDTO.getName(), inputUserInfoDTO.getAge());
User userEntity = userMapper.getUserByID(inputUserInfoDTO.getId());/* entity 轉(zhuǎn) DTO */
if (null == userEntity){
return null;
}
UserDTO userDTO = new UserDTO();
userDTO.setAge(userEntity.getAge());
userDTO.setId(userEntity.getId());
userDTO.setName(userEntity.getName());
userDTO.setCreateTime(unixTime2String(userEntity.getCreateTime()));
userDTO.setPhone(userEntity.getPhone());
userDTO.setEmail(userEntity.getEmail());
return userDTO;
}
@CacheEvict 刪除緩存
@CacheEvict(value = "user", key="#id")
public void deleteUser(int id){
userMapper.deleteUser(id);
}
當(dāng)然為了支持序列化,我的UserDTO得implements Serializable
@Data
public class UserDTO implements Serializable {
//public class UserDTO implements Serializable {
private int id;
private String name;
private int age;
private String createTime;
private String phone;
private String email;
}
至此緩存已經(jīng)可以用起來了,不需要編寫RedisConfig代碼,有點(diǎn)小遺憾,直接去Redis查看數(shù)據(jù),發(fā)現(xiàn)是亂碼。這是因?yàn)槲沂褂玫氖荍ava自帶的序列化,如果要更換Redis序列化方法,就要重寫RedisConfig了。
RedisConfig
這個(gè)配置也不復(fù)雜,使用Jackson2JsonRedisSerializer將對(duì)象轉(zhuǎn)換為Json串,注意這里一定要使用ObjectMapper,否則再將json串反序列化為對(duì)象時(shí)會(huì)報(bào)。
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig extends CachingConfigurerSupport{
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解決查詢緩存轉(zhuǎn)換異常的問題
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;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot+mybatis-plus+oracle實(shí)現(xiàn)邏輯刪除
最近在做一個(gè)前后端分離的小項(xiàng)目,需要?jiǎng)h除用戶表的用戶,本文主要實(shí)現(xiàn)了springboot+mybatis-plus+oracle邏輯刪除,具有一定的參考價(jià)值,感興趣的可以了解一下2021-08-08
SpringBoot執(zhí)行有返回值的異步任務(wù)問題
這篇文章主要介紹了SpringBoot執(zhí)行有返回值的異步任務(wù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
java隨機(jī)生成8位數(shù)授權(quán)碼的實(shí)例
下面小編就為大家?guī)硪黄猨ava隨機(jī)生成8位數(shù)授權(quán)碼的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
Java利用Zxing生成二維碼的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄狫ava利用Zxing生成二維碼的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
Springcloud整合stream,rabbitmq實(shí)現(xiàn)消息驅(qū)動(dòng)功能
官方定義SpringCloud?Stream?是一個(gè)構(gòu)建消息驅(qū)動(dòng)微服務(wù)的框架。我們只需要搞清楚如何與Spring?Cloud?Stream?交互就可以方便使用消息驅(qū)動(dòng)的方式。本文將通過Springcloud整合stream,rabbitmq實(shí)現(xiàn)消息驅(qū)動(dòng)功能,需要的可以參考一下2022-02-02

