
Redis是我们开发中最常用的缓存中间件它性能极高支持丰富的数据类型。本文详细介绍Spring Boot如何整合Redis实现缓存、session共享等功能。一、Redis简介Redis是一个开源的内存数据结构存储系统可以用作数据库、缓存和消息队列。数据类型应用场景String缓存、计数器、分布式锁Hash存储对象、购物车List消息队列、排行榜Set好友列表、标签ZSet排行榜、优先级队列二、引入依赖!-- SpringDataRedis-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !--连接池-- dependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId /dependency三、配置文件spring: redis: host:localhost port:6379 password: # Redis密码没有则为空 database:0 # 使用哪个数据库 lettuce: pool: max-active:8# 最大连接数 max-idle:8 # 最大空闲连接 min-idle:0 # 最小空闲连接 max-wait:-1ms# 最大等待时间四、Redis配置类Configuration publicclass RedisConfig { Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(factory); // JSON序列化配置 Jackson2JsonRedisSerializerObject serializer new Jackson2JsonRedisSerializer(Object.class); ObjectMapper mapper new ObjectMapper(); mapper.setTimeZone(TimeZone.getTimeZone(GMT8)); serializer.setObjectMapper(mapper); // key采用String序列化 StringRedisSerializer stringSerializer new StringRedisSerializer(); template.setKeySerializer(stringSerializer); template.setHashKeySerializer(stringSerializer); // value采用JSON序列化 template.setValueSerializer(serializer); template.setHashValueSerializer(serializer); template.afterPropertiesSet(); return template; } }五、基本使用RestController publicclass RedisController { Autowired private RedisTemplateString, Object redisTemplate; // String操作 PostMapping(/set) public ResultVoid set(RequestParam String key, RequestParam String value) { redisTemplate.opsForValue().set(key, value); return Result.success(); } GetMapping(/get) public ResultObject get(RequestParam String key) { Object value redisTemplate.opsForValue().get(key); return Result.success(value); } // Hash操作 PostMapping(/hset) public ResultVoid hset(RequestParam String key, RequestParam String field, RequestParam String value) { redisTemplate.opsForHash().put(key, field, value); return Result.success(); } GetMapping(/hget) public ResultObject hget(RequestParam String key, RequestParam String field) { Object value redisTemplate.opsForHash().get(key, field); return Result.success(value); } // 过期时间 PostMapping(/setWithExpire) public ResultVoid setWithExpire(RequestParam String key, RequestParam String value, RequestParam long seconds) { redisTemplate.opsForValue().set(key, value, seconds, TimeUnit.SECONDS); return Result.success(); } }六、封装Redis工具类Component publicclass RedisUtils { Autowired private RedisTemplateString, Object redisTemplate; // String public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public void set(String key, Object value, long time) { redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } public Boolean delete(String key) { return redisTemplate.delete(key); } // Hash public void hSet(String key, String field, Object value) { redisTemplate.opsForHash().put(key, field, value); } public Object hGet(String key, String field) { return redisTemplate.opsForHash().get(key, field); } public Long hDelete(String key, Object... fields) { return redisTemplate.opsForHash().delete(key, fields); } // 自增 public Long increment(String key) { return redisTemplate.opsForValue().increment(key); } public Long decrement(String key) { return redisTemplate.opsForValue().decrement(key); } }七、Redis缓存应用Service publicclass UserService { Autowired private UserMapper userMapper; Autowired private RedisUtils redisUtils; privatestaticfinal String CACHE_KEY_PREFIX user:; public UserVO getById(Long id) { String cacheKey CACHE_KEY_PREFIX id; // 1. 查询缓存 Object cache redisUtils.get(cacheKey); if (cache ! null) { return (UserVO) cache; } // 2. 缓存不存在查询数据库 User user userMapper.selectById(id); if (user null) { returnnull; } // 3. 存入缓存30分钟过期 UserVO vo convertToVO(user); redisUtils.set(cacheKey, vo, 1800); return vo; } public void updateById(User user) { userMapper.updateById(user); // 删除缓存 redisUtils.delete(CACHE_KEY_PREFIX user.getId()); } public void deleteById(Long id) { userMapper.deleteById(id); // 删除缓存 redisUtils.delete(CACHE_KEY_PREFIX id); } }八、Redis实现分布式锁Service publicclass LockService { Autowired private RedisTemplateString, Object redisTemplate; /** * 尝试获取分布式锁 */ public Boolean tryLock(String lockKey, String requestId, long expireTime) { Boolean result redisTemplate.opsForValue() .setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS); return result ! null result; } /** * 释放分布式锁 */ public void unlock(String lockKey, String requestId) { String value (String) redisTemplate.opsForValue().get(lockKey); if (requestId.equals(value)) { redisTemplate.delete(lockKey); } } /** * 使用锁的示例 */ public void seckill(Long productId) { String lockKey lock:seckill: productId; String requestId UUID.randomUUID().toString(); try { // 尝试获取锁 if (tryLock(lockKey, requestId, 10)) { // 扣减库存 // 记录秒杀成功用户 } } finally { // 释放锁 unlock(lockKey, requestId); } } }九、总结Redis是后端开发中不可或缺的组件主要用途包括热点数据缓存分布式锁Session共享消息队列计数器记住Redis用得好系统性能没烦恼