热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redismysql事务处理_SpringDataRedis事务处理

内容:1.Exactlyonce2.输出不重复一、SparkStreaming中确保数据处理Exactlyonce首先,说一下何为事物处理,

内容: 1.      Exactly once 2.      输出不重复     一、Spark Streaming中确保数据处理Exactly once 首先,说一下何为事物处理,事务性处理即数据一定会被处理且只被处理一次。(例如银行转账)。Spark Streaming可能会需要处理事务性的作业,例如Task输出

本文主要讲述如何在java里头使用redis进行cas操作。其实呢,redis不像memcached那样显示地支持cas操作,不过它有事务的概念。

准备

redis的乐观锁支持

Redis通过使用WATCH, MULTI, and EXEC组成的事务来实现乐观锁(注意没有用DISCARD),Redis事务没有回滚操作。在SpringDataRedis当中通过RedisTemplate的SessionCallback中来支持(否则事务不生效)。discard的话不需要自己代码处理,callback返回null,成的话,返回非null,依据这个来判断事务是否成功(没有抛异常)。

实例

@Test

public void cas() throws InterruptedException, ExecutionException {

String key = "test-cas-1";

ValueOperations strOps = redisTemplate.opsForValue();

strOps.set(key, "hello");

ExecutorService pool = Executors.newCachedThreadPool();

List> tasks &#61; new ArrayList<>();

for(int i&#61;0;i<5;i&#43;&#43;){

final int idx &#61; i;

tasks.add(new Callable() {

&#64;Override

public Object call() throws Exception {

return redisTemplate.execute(new SessionCallback() {

&#64;Override

public Object execute(RedisOperations operations) throws DataAccessException {

operations.watch(key);

String origin &#61; (String) operations.opsForValue().get(key);

operations.multi();

operations.opsForValue().set(key, origin &#43; idx);

Object rs &#61; operations.exec();

System.out.println("set:"&#43;origin&#43;idx&#43;" rs:"&#43;rs);

return rs;

}

});

}

});

}

List> futures &#61; pool.invokeAll(tasks);

for(Future f:futures){

System.out.println(f.get());

}

pool.shutdown();

pool.awaitTermination(1000, TimeUnit.MILLISECONDS);

}

输出事务处理在应用程序中起着至关重要的作用。本篇博客将进入Spring的事务处理学习。下面&#xff0c;首先我们来简单回想一下与事务有关的一些概念。【事务】    所谓事务&#xff0c;就是一系列必须成功的操作&#xff0c;只要有一步操作失败&#xff0c;所以其他步骤都将要撤销。当所有的步骤都

set:hello2 rs:null

set:hello3 rs:[]

set:hello1 rs:null

set:hello4 rs:null

set:hello0 rs:null

查看该值

127.0.0.1:6379> get test-cas-1

"\"hello3\""

SessionCallback

没有在SessionCallback里头执行watch、multi、exec&#xff0c;而是自己单独写

与数据库事务的混淆

template.setEnableTransactionSupport(true);

这个应该是支持数据库的事务成功才执行的意思。

/**

* Gets a Redis connection. Is aware of and will return any existing corresponding connections bound to the current

* thread, for example when using a transaction manager. Will create a new Connection otherwise, if

* {&#64;code allowCreate} is true.

*

* &#64;param factory connection factory for creating the connection

* &#64;param allowCreate whether a new (unbound) connection should be created when no connection can be found for the

* current thread

* &#64;param bind binds the connection to the thread, in case one was created

* &#64;param enableTransactionSupport

* &#64;return an active Redis connection

*/

public static RedisConnection doGetConnection(RedisConnectionFactory factory, boolean allowCreate, boolean bind,

boolean enableTransactionSupport) {

Assert.notNull(factory, "No RedisConnectionFactory specified");

RedisConnectionHolder connHolder &#61; (RedisConnectionHolder) TransactionSynchronizationManager.getResource(factory);

if (connHolder !&#61; null) {

if (enableTransactionSupport) {

potentiallyRegisterTransactionSynchronisation(connHolder, factory);

}

return connHolder.getConnection();

}

if (!allowCreate) {

throw new IllegalArgumentException("No connection found and allowCreate &#61; false");

}

if (log.isDebugEnabled()) {

log.debug("Opening RedisConnection");

}

RedisConnection conn &#61; factory.getConnection();

if (bind) {

RedisConnection connectionToBind &#61; conn;

if (enableTransactionSupport && isActualNonReadonlyTransactionActive()) {

connectionToBind &#61; createConnectionProxy(conn, factory);

}

connHolder &#61; new RedisConnectionHolder(connectionToBind);

TransactionSynchronizationManager.bindResource(factory, connHolder);

if (enableTransactionSupport) {

potentiallyRegisterTransactionSynchronisation(connHolder, factory);

}

return connHolder.getConnection();

}

return conn;

}

不要跟本文的乐观锁说的事务混淆在一起。

参考



推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 如何使用 `org.opencb.opencga.core.results.VariantQueryResult.getSource()` 方法及其代码示例详解 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
author-avatar
simona2006_827
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有