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

Spring Boot 集成 Redis 连续操作键值对示例

Spring Boot 集成 Redis 连续操作键值对示例


1. 配置 RedisTemplate
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        
        // 设置键序列化器(确保键为字符串)
        template.setKeySerializer(new StringRedisSerializer());
        
        // 设置值序列化器(支持复杂对象,如JSON)
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        
        return template;
    }
}

2. Service 层示例代码
@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 对键 "user:1001" 进行连续操作:
     * 1. 设置初始值(User对象)
     * 2. 获取值并打印
     * 3. 更新值的某个字段
     * 4. 设置过期时间
     */
    public void performAtomicOperations() {
        // 使用 SessionCallback 实现原子性操作
        redisTemplate.execute(new SessionCallback<Object>() {
            @Override
            public Object execute(RedisOperations operations) {
                operations.multi(); // 开启事务
                
                // 操作1:设置初始值(User对象)
                User user = new User("张三", 25);
                operations.opsForValue().set("user:1001", user);
                
                // 操作2:获取值并打印(实际开发中通常不在服务端直接打印)
                User fetchedUser = (User) operations.opsForValue().get("user:1001");
                System.out.println("获取到的用户:" + fetchedUser.getName());
                
                // 操作3:更新年龄字段(需反序列化后修改)
                // 注意:Redis 不支持部分更新,需全量读写
                fetchedUser.setAge(26);
                operations.opsForValue().set("user:1001", fetchedUser);
                
                // 操作4:设置过期时间
                operations.expire("user:1001", 60, TimeUnit.SECONDS);
                
                return operations.exec(); // 提交事务
            }
        });
    }
}

关键代码说明

  1. SessionCallback

    • 通过 operations.multi() 开启事务,确保所有操作原子性执行。
    • 通过 operations.exec() 提交事务,返回所有操作的结果列表。
  2. User 对象序列化

    • 使用 GenericJackson2JsonRedisSerializer 自动序列化对象为 JSON。
    • 需确保 User 类有无参构造函数和 getter/setter
  3. 更新字段的注意事项

    • Redis 不支持直接更新对象的某个字段,需全量读取-修改-写回
    • 需确保操作在事务中,避免竞态条件。

操作步骤与表格总结

步骤代码片段说明注意事项
1. 开启事务operations.multi();将后续操作放入事务队列必须在 multi()exec() 之间执行操作
2. 设置初始值operations.opsForValue().set("user:1001", user);存储 User 对象到 Redis确保序列化器支持复杂对象
3. 获取值User fetchedUser = (User) operations.opsForValue().get("user:1001");反序列化 JSON 为对象需强制类型转换
4. 更新值fetchedUser.setAge(26);
operations.opsForValue().set("user:1001", fetchedUser);
全量更新对象需重新写入整个对象
5. 设置过期时间operations.expire("user:1001", 60, TimeUnit.SECONDS);设置键的过期时间时间单位需明确
6. 提交事务return operations.exec();执行所有操作并返回结果返回结果为操作结果列表

总结与建议

  1. 原子性操作:通过 SessionCallback 确保多个操作的原子性,避免中间状态暴露。
  2. 对象更新:Redis 无法部分更新对象,需全量读写,注意性能影响。
  3. 序列化配置:根据业务需求选择合适的序列化器(如 JSON 或二进制)。
  4. 错误处理:捕获 RedisException 处理异常,确保事务回滚或重试逻辑。
// 调用示例
@Autowired
private RedisService redisService;

public void test() {
    redisService.performAtomicOperations(); // 执行连续操作
}
http://www.dtcms.com/a/106446.html

相关文章:

  • MySQL性能:存储过程+触发器基础实战攻略
  • Mysql中,利用窗口函数来优化掉子查询或者group by
  • IPD推进中关键角色与岗位(二)系统工程师SE确保产品开发过程的高效协同,减少项目失败的风险
  • mysql数据库通过命令行导入sql文件
  • Rust 中的高效视频处理:利用硬件加速应对高分辨率视频
  • 【2025】实操成功-使用Python连接谷歌邮箱发送邮件
  • PostgreSQL:高级SQL特性
  • 【接口重复请求】axios通过AbortController解决页面切换过快,接口重复请求问题
  • windosw11中的.msi文件打不开该怎么办?
  • [python] python四大数据结构(列表 元组 集合 字典)剖析
  • firefox 136.0.4版本离线安装MarkDown插件
  • JavaScript重难点突破:期约与异步函数
  • 从实用的角度聊聊Linux下文本编辑器VIM
  • LambdaQueryWrapper解释一下
  • Ubuntu 20.04 中 Git 的安装、配置和基本操作指南
  • Element Plus 主题色定制指南:从原理到实战
  • Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
  • L2-001 紧急救援
  • 编译原理:first集和follow
  • Python数据类型 - 元组(Tuple)
  • 第四章:检索器(Retriever)设计:从向量到图谱
  • Windows 实战-evtx 文件分析--做题笔记
  • Qt中的数据解析--XML与JSON处理全攻略
  • 前端开发时的内存泄漏问题
  • 数据结构第6篇:手撕排序算法(插入、希尔、堆)
  • 【通用级联选择器回显与提交处理工具设计与实现】
  • 中和农信:让金融“活水”精准浇灌乡村沃土
  • RustDesk 开源远程桌面软件 (支持多端) + 中继服务器伺服器搭建 ( docker版本 ) 安装教程
  • windows使用Python调用7-Zip【按大小分组】压缩文件夹中所有文件
  • C# Winform 入门(3)之尺寸同比例缩放