SpringBoot+Redis的基本使用
SpringBoot+Redis的基本使用
[toc]一、SpringBoot+Redis 缓存数据
1、添加依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
2、添加配置:
spring: data: redis: host: localhost port: 6379 password: database: 0 lettuce: pool: max-active: 8 # 连接池最大连接数,默认 8 min-idle: 0 # 连接池最小空闲连接数,默认 0 max-wait: -1ms # 连接池最大等待时间(使用负值表示没有限制),默认 -1 max-idle-time: 1800000ms # 连接池中的最大空闲连接数,默认 8
3、配置redis的序列化,启用缓存:
@EnableCaching @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); ObjectMapper objectMapper = new ObjectMapper(); //FAIL_ON_UNKNOWN_PROPERTIES在序列化的时候,如果遇到不认识的字段的处理方式 //默认启用特性,这意味着在遇到未知属性时抛出JsonMappingException。在引入该特性之前,这是默认的默认设置。 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); //FAIL_ON_EMPTY_BEANS决定了在没有找到类型的存取器时发生了什么(并且没有注释表明它是被序列化的)。如果启用(默认), // 将抛出一个异常来指明这些是非序列化类型;如果禁用了,它们将被序列化为空对象,即没有任何属性。 //请注意,这个特性只对那些没有任何识别注释的“空”bean产生影响(如@json序列化):那些有注释的bean不会导致抛出异常。 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false); //在序列化时,只有那些值为null或被认为为空的值的属性才不会被包含在内。 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); //objectMapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY); objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); //是否允许单引号 objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(objectMapper,Object.class); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); javaTimeModule.addSerializer(LocalDate.class,new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); javaTimeModule.addSerializer(LocalTime.class,new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); javaTimeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); javaTimeModule.addDeserializer(LocalDate.class,new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); javaTimeModule.addDeserializer(LocalTime.class,new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); objectMapper.registerModule(javaTimeModule); template.setValueSerializer(jackson2JsonRedisSerializer); // 使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ZERO); return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory)) .cacheDefaults(redisCacheConfiguration).build(); } }
redis序列化的第二种写法:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); //key序列化 redisTemplate.setKeySerializer(new StringRedisSerializer()); //value序列化 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //hash类型value序列化 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); //注入连接工厂 redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } // @Bean // public DefaultRedisScript<Boolean> script() { // DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>(); // //lock.lua脚本位置和application.yml同级目录 // redisScript.setLocation(new ClassPathResource("lock.lua")); // redisScript.setResultType(Boolean.class); // return redisScript; // } // @Bean // public DefaultRedisScript<Long> script() { // DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(); // //lock.lua脚本位置和application.yml同级目录 // redisScript.setLocation(new ClassPathResource("stock.lua")); // redisScript.setResultType(Long.class); // return redisScript; // } }
4、使用:
调用被缓存注解修饰的方法时,会自动从缓存中查数据。
@Transactional @Service("userService") public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; // insert、update用 @CachePut 注解 @CachePut(value = "userCache",key = "#user.id") @Override public void updateById(User user) { userMapper.updateById(user); } // select 的时候使用 @Cacheable @Cacheable(value = "userCache",key="#uid") @Override public User findById(Integer uid) { return userMapper.findById(uid); } // 删除的时候使用 @CacheEvict @CacheEvict(value = "userCache",key = "#uid") @Override public void delById(Integer uid) { userMapper.delById(uid); } }
分类:
Java / SpringBoot
, Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南