时间:2021-05-19
在使用Spring Boot2.x运行Redis时,发现百度不到顺手的文档,搞通后发现其实这个过程非常简单和简洁,觉得有必要拿出来分享一下。
Spring Boot2.x 不再使用Jedis,换成了Lettuce。Lettuce是基于 Netty 实现的,所以性能更好。但是我看到很多文章居然在Spring Boot 2.x还在写Jedis的配置。
依赖
依赖比较简单,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的访问地址、密码、数据库,并配置连接池的属性。
redis: # reids的连接ip host: 127.0.0.1 port: 6379 password: helloworld # Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0 database: 0 # 连接超时时间(毫秒) timeout: 10000ms # redis client配置,使用lettuce lettuce: pool: # 连接池中的最小空闲连接 默认 0 min-idle: 0 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 max-wait: 1000ms # 连接池最大连接数(使用负值表示没有限制) 默认 8 max-active: 8 # 连接池中的最大空闲连接 默认 8 max-idle: 8注解配置
全局使能缓存
@EnableSwagger2 // 使用swagger api 功能@EnableCaching // 使用缓存@SpringBootApplicationpublic 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; } 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()); 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); }当然为了支持序列化,我的UserDTO得implements Serializable
@Datapublic 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;}至此缓存已经可以用起来了,不需要编写RedisConfig代码,有点小遗憾,直接去Redis查看数据,发现是乱码。这是因为我使用的是Java自带的序列化,如果要更换Redis序列化方法,就要重写RedisConfig了。
RedisConfig
这个配置也不复杂,使用Jackson2JsonRedisSerializer将对象转换为Json串,注意这里一定要使用ObjectMapper,否则再将json串反序列化为对象时会报。
@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); //解决查询缓存转换异常的问题 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; }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1,利用spring-data-redis整合项目使用的pom.xml:
Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis,
Spring-Data-Redis项目(简称SDR)对Redis的Key-Value数据存储操作提供了更高层次的抽象,类似于SpringFramework对JD
应该有不少人在使用spring-data-redis时遇到各种各样的问题。反正我是遇到了。由于是隔了一段时间才写的本篇博客,也懒得去重现哪些错误场景了,下面凭着
依赖如下:org.springframework.bootspring-boot-starter-data-redis配置文件如下:spring:redis:o