当前位置: 首页 > news >正文

Spring Boot 整合 Redis

Redis是我们开发中最常用的缓存中间件,它性能极高,支持丰富的数据类型。本文详细介绍Spring Boot如何整合Redis,实现缓存、session共享等功能。

一、Redis简介

Redis是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息队列。

数据类型

应用场景

String

缓存、计数器、分布式锁

Hash

存储对象、购物车

List

消息队列、排行榜

Set

好友列表、标签

ZSet

排行榜、优先级队列

二、引入依赖

<!-- SpringDataRedis--> <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>

三、配置文件

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 RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // JSON序列化配置 Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper mapper = new ObjectMapper(); mapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); 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 RedisTemplate<String, Object> redisTemplate; // String操作 @PostMapping("/set") public Result<Void> set(@RequestParam String key, @RequestParam String value) { redisTemplate.opsForValue().set(key, value); return Result.success(); } @GetMapping("/get") public Result<Object> get(@RequestParam String key) { Object value = redisTemplate.opsForValue().get(key); return Result.success(value); } // Hash操作 @PostMapping("/hset") public Result<Void> hset(@RequestParam String key, @RequestParam String field, @RequestParam String value) { redisTemplate.opsForHash().put(key, field, value); return Result.success(); } @GetMapping("/hget") public Result<Object> hget(@RequestParam String key, @RequestParam String field) { Object value = redisTemplate.opsForHash().get(key, field); return Result.success(value); } // 过期时间 @PostMapping("/setWithExpire") public Result<Void> 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 RedisTemplate<String, 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 RedisTemplate<String, 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用得好,系统性能没烦恼!

http://www.jsqmd.com/news/503386/

相关文章:

  • Kubernetes VIP 分配与负载均衡技术研究
  • 手把手教你Ubuntu20.04安装ROS2:从零开始搭建机器人开发环境
  • 广州半封闭复读学校深度解析及10家优质机构推荐 - 妙妙水侠
  • 彻底吃透 Java OOM 异常:从原理、场景、排查到解决方案全攻略
  • 分人群解决方案:哪类AI建站工具适合你?
  • Claude Architect认证到底考什么?一个重度用户用半年实战逐项拆解
  • web后端----后端框架基本架构、基本流程
  • 突破音乐格式枷锁:4大维度重构NCM文件的自由转换技术
  • 3大突破!Avalonia让跨平台音频界面开发效率提升200%
  • Ubuntu 22.04 LTS下NVIDIA驱动安装避坑指南:如何用终端一键搞定(附常见错误解决)
  • Step-by-Step Guide to Installing Anolis OS 8.10 for Cloud Environments
  • Qwen3智能字幕对齐系统在在线教育场景的应用
  • X上100万浏览只赚40美元,YouTube却能赚8000美元?程序员副业出海的200倍身份跃迁指南
  • 05_Priority Queues 优先队列
  • 彻底搞懂 Java 垃圾回收(GC)
  • OpenCV实战:5分钟搞定图像模板匹配(NCC算法+C++代码详解)
  • 6.4 日志到底怎么写才有用?排障效率提升的底层方法
  • 教学实验规范下的AI审核与IACheck:让样品分析检测报告更严谨与可复核
  • 鸿蒙HarmonyOS无线调试全攻略:摆脱USB线束缚的5个关键步骤
  • HBase实战:用Python+Thrift实现电商用户行为数据存储(含Region分裂优化)
  • 别再乱用Transform了!用MONAI处理医学图像,这5个核心操作你得先搞懂
  • 别再踩坑了!Vue中使用postMessage传值的5个注意事项(含window.opener最佳实践)
  • U8g2自定义中文字库实战:从零构建Arduino OLED专属字体
  • 华为防火墙双线路故障切换避坑指南:健康检查配置常见误区解析
  • Llava-v1.6-7b模型部署教程:Linux环境一键安装指南
  • QGIS插件开发避坑指南:从安装Plugin Builder到第一个Hello World插件
  • 多语言情感分析挑战与解决方案
  • 锤子科技Android开源项目深度解析:一步与大爆炸的创新实现
  • LingBot-Depth实测分享:在RTX 4090上实现1080p深度图实时精炼
  • 6.5 Git协作不踩坑:提交规范分支策略冲突处理全流程