一、redis缓存
①service
package com.slj.springbootrediscache.service; import com.slj.springbootrediscache.entry.User; import com.slj.springbootrediscache.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class UserService2 { @Resource private UserMapper userMapper; @Autowired private RedisTemplate redisTemplate; public User findById(Long id){ redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); ValueOperations valueOperations=redisTemplate.opsForValue(); //1.先从redis中获取数据 Object o = valueOperations.get("user::findById::" + id); //2.如果存在,则直接返回 if(o!=null){ return (User) o; } //3.如果不存在则查询数据库,并把查询的结果返回给redis中 User user = userMapper.selectById(id); if(user!=null){ valueOperations.set("user::findById::"+id,user); } return user; } public void delete(Long id){ redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); ValueOperations valueOperations=redisTemplate.opsForValue(); //先删除缓存中的数据 redisTemplate.delete("user::findById::"+id); //再删除数据库的数据 userMapper.deleteById(id); } public void update(User user){ redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); ValueOperations valueOperations=redisTemplate.opsForValue(); //先修改缓存中的数据 valueOperations.set("user::findById::"+user.getId(),user); //在修改数据库的数据 userMapper.updateById(user); } public void insert(User user){ userMapper.insert(user); } }
②、controller
package com.slj.springbootrediscache.controller; import com.slj.springbootrediscache.entry.User; import com.slj.springbootrediscache.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController public class UserCotroller { @Autowired private UserService userService; @GetMapping("byId/{id}") public User byId(@PathVariable Long id) { return userService.findById(id); } @PutMapping("update") public User update(User user){ userService.update(user); return user; } @DeleteMapping("delete/{id}") public String delete(@PathVariable Long id){ userService.delete(id); return "删除成功"; } @PostMapping("insert") public String insert(User user){ userService.insert(user); return "修改成功"; } }
③application.properties
二、注解的redis缓存
① service
package com.slj.springbootrediscache.service; import com.slj.springbootrediscache.entry.User; import com.slj.springbootrediscache.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class UserService { @Resource private UserMapper userMapper; @Autowired private RedisTemplate redisTemplate; @Cacheable(cacheNames = "user::findById",key="#id") public User findById(Long id){ //3.如果不存在则查询数据库,并把查询的结果返回给redis中 User user = userMapper.selectById(id); return user; } @CacheEvict(cacheNames = "user::findById",key = "#id") public void delete(Long id){ //再删除数据库的数据 userMapper.deleteById(id); } @CachePut(cacheNames = "user::findById",key="#user.id") public User update(User user){ //在修改数据库的数据 userMapper.updateById(user); return user; } public void insert(User user){ userMapper.insert(user); } }
②controller
package com.slj.springbootrediscache.controller; import com.slj.springbootrediscache.entry.User; import com.slj.springbootrediscache.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController public class UserCotroller { @Autowired private UserService userService; @GetMapping("byId/{id}") public User byId(@PathVariable Long id) { return userService.findById(id); } @PutMapping("update") public User update(User user){ userService.update(user); return user; } @DeleteMapping("delete/{id}") public String delete(@PathVariable Long id){ userService.delete(id); return "删除成功"; } @PostMapping("insert") public String insert(User user){ userService.insert(user); return "修改成功"; } }
③加入缓存的配置类
package com.slj.springbootrediscache.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; @Configuration public class Redisconfig { //比如验证码 @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); 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); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @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); // 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 业务需求。 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化 .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } }
④启动缓存注解
⑤测试