回到目录

Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis驱动,而它将Redis的事务机制(MULTI,Exec,Watch等)封装成了比较友好的实现方式,如下面的代码

    using (IRedisClient RClient = prcm.GetClient()){using (IRedisTransaction IRT = RClient.CreateTransaction()){ IRT.QueueCommand(r => r.AddItemToList("zzl", "2"));            IRT.QueueCommand(r => r.AddItemToList("lr", "2"));IRT.Commit(); // 提交事务
        }}

当然上面漂亮的代码有一些功劳要归于C#漂亮的语法,你在JAVA里可以很难写出如此漂亮的东西,当然上面的代码是ServiceStack.Redis为我们封装的,平时我们可以直接使用,现在再说一下大叔Lind.DDD框架里的RedisRepository对它的支持!

如果大叔RedisRepository想支持redis事务,前提:仓储的IRedisClient必须与产生事务的IRedisClient是同一个对象,否则redis事务在大叔框架里不会起作用

实现方法:

一  RedisRepository<T>实现SetDataContext方法,将IRedisClient从外面传入,这样可以保存事务的和仓储的用的是一个对象

      public void SetDataContext(object db){try{//手动Redis数据库对象,在redis事务时启用redisDB = (IRedisClient)db;redisTypedClient = redisDB.GetTypedClient<TEntity>();table = redisTypedClient.Lists[typeof(TEntity).Name];}catch (Exception){throw new ArgumentException("redis.SetDataContext要求db为IRedisClient类型");}}

二 添加基于Redis的事务管理者,让大叔仓储与事务更好的结合,方便开发人员的使用

    /// <summary>/// Redis事务管理机制/// </summary>public class RedisTransactionManager{/// <summary>/// 事务块处理/// </summary>/// <param name="redisClient">当前redis库</param>/// <param name="action">事务中的动作</param>public static void Transaction(IRedisClient redisClient, Action action){using (IRedisTransaction IRT = redisClient.CreateTransaction()){try{action();IRT.Commit();}catch (Exception){IRT.Rollback();}}}}

三 在领域代码中,我们通常可以这样使用大叔redis的事务块,看代码

            var redis = new Lind.DDD.Repositories.Redis.RedisRepository<User>();IRedisClient redisClient = Lind.DDD.RedisClient.RedisManager.GetClient();redis.SetDataContext(redisClient);Lind.DDD.RedisClient.RedisTransactionManager.Transaction(redisClient, () =>{redis.Insert(new User { UserName = "gogod111" });redis.Insert(new User { UserName = "gogod211" });});

这样,大叔框架就支持了Redis的事务,希望MongoDB早日也能对事务进行支持,到那时,大叔将会为它提供一种实现机制,呵呵!

下面是大叔对分布式多数据源事务的测试,可以实现SQLSERVER与Redis的事务共存机制,下面是代码

           Lind.DDD.RedisClient.RedisTransactionManager.Transaction(redisClient, () =>{redis.Insert(new User { UserName = "gogod111" });redis.Insert(new User { UserName = "gogod211" });using (var trans = new TransactionScope()){userRepository.Insert(new UserInfo { UserName = "zzl3" });trans.Complete();}});

上面代码我们还能进行一些封装,一些修改,让它支持redis和sql两种事务,使用.net4.5的默认参数,可以省去一个方法的重载,代码又便得越来越简洁了!

        /// <summary>/// 事务块处理/// </summary>/// <param name="redisClient">当前redis库</param>/// <param name="redisAction">Redis事务中的动作</param>/// <param name="sqlAction">Sql事务中的动作</param>public static void Transaction(IRedisClient redisClient, Action redisAction, Action sqlAction = null){using (IRedisTransaction IRT = redisClient.CreateTransaction()){try{redisAction();if (sqlAction != null){using (var trans = new TransactionScope()){sqlAction();trans.Complete();}}IRT.Commit();}catch (Exception){IRT.Rollback();}}}

代码在调用时,我们很方便,简单!

           Lind.DDD.RedisClient.RedisTransactionManager.Transaction(redisClient, () =>{redis.Insert(new User { UserName = "gogod111" });redis.Insert(new User { UserName = "gogod211" });}, () =>{userRepository.Insert(new UserInfo { UserName = "zzl3" });});

对于C#代码团队的不段进步,也是我们这些程序员喜爱它的原因之一,毕竟人都有个腻的时候,多多改善,对自己,对他人都是件不错好事!

回到目录

Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现相关推荐

  1. Redis学习笔记(一)—— 在windows下搭建redis服务器

    redis简介: redis是一个缓存数据库,里面的数据都是字符串,使用key-value形式存储,使用redis缓存数据可以提高系统的访问性能,一般开发时使用windows下的redis服务器,生产 ...

  2. Redis学习笔记②实战篇_黑马点评项目

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  3. Redis 学习笔记八:集群模式

    Redis 学习笔记八:集群模式 作者:Grey 原文地址: 博客园:Redis 学习笔记八:集群模式 CSDN:Redis 学习笔记八:集群模式 前面提到的Redis 学习笔记七:主从复制和哨兵只能 ...

  4. Redis学习笔记 - 数据类型与API(1)Key

    Redis学习笔记 - 数据类型与API(1)Key Key相关命令 1. 常用命令 命令 含义 时间复杂度 keys 查找所有符合给定模式 pattern 的 key O(N), N 为数据库中 k ...

  5. Redis学习笔记①基础篇_Redis快速入门

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  6. Redis学习笔记(一) 数据类型事务异常Jredis

    Redis学习笔记(一) NoSql概述 Nosql四大分类 Redis入门 简介 Windows安装 基础使用 问题 Redis4.0之前为什么是单线程 单线程为什么这么快 Redis4.0后的多线 ...

  7. Redis学习笔记---Redis的事务

    Redis学习笔记-Redis的事务 1. Redis事务(弱事务)和Mysql事务对比 Atomicity(原子性):构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行. Redi ...

  8. Redis学习笔记(实战篇)(自用)

    Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...

  9. Redis学习笔记(B站狂神说)(自己总结方便复习)

    Redis学习笔记B站狂神说 redis: 非关系型数据库 一.NoSQL概述 1.为什么要用Nosql 1.单机Mysql的年代 思考一下,这种情况下:整个网站的瓶颈是什么? 1.数据量如果太大,一 ...

最新文章

  1. 赫夫曼编码(基于赫夫曼树的实现)
  2. 协方差中的正相关与负相关 指的是线性代数中的线性相关
  3. java 分段读取数据_java _io_ .read()分段读取字节
  4. Android-i9023 Root
  5. 【渝粤教育】国家开放大学2018年秋季 0299-21T中国古代文学(1) 参考试题
  6. ssm 静态资源处理器
  7. 珍爱生命,远离大厂政治斗争
  8. 从CUDA开始读OpenCL
  9. 学习笔记(1):activiti6.0从入门到精通-设置流程变量(概述)
  10. 分区工具parted的详解及常用分区使用方法
  11. onload 事件、DOMContentLoaded事件、DOM加载顺序
  12. 二十四、Java集合框架(一)
  13. SQL Server 连接到服务器-错误233的解决办法
  14. PKUWC2018 5/6
  15. Ansible+Redfish+Idrac管理DELL服务器
  16. 小白必学的Ps火焰字制作教程
  17. 庆科EMW3080 mxos开发环境搭建helloworld编译
  18. 用VMware安装Windows 8.x虚拟机镜像系统详细流程
  19. mov格式的视频转换成mp4,教你3种快速方法来处理
  20. 【树莓派】一、新坑入门-购买篇、基础配置篇

热门文章

  1. 计算机无法转换文件,电脑中excel转换器无法打开文件的解决方法
  2. 消息队列之Kafka 再平衡问题(七)
  3. 五、Scikit-learn的应用-为CHarityML寻找捐献者
  4. 华为手机鸿蒙系统手机_华为鸿蒙系统迎巨大利好,世界首富正式认错,放弃第三大手机系统...
  5. 字节面试归来,四面竟然都考了算法!
  6. 142、解密POE交换机供电秘密,8芯网线断芯不再害怕!
  7. 基于谁也不信任的安全建设思路 打造安全防御体系
  8. 《放学后》《解忧杂货店》《等风来》读后感
  9. oracle修改scott密码
  10. 怎么设置ep4ce6e22b8n引脚_利用EP4CE6E22做一块FPGA核心转接板(原理图、PCB源文件、测试程序)...