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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

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事务机制的实现如需转载请自行联系原博主。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
23天前
|
NoSQL Redis 数据库
什么是Redis的事务?
Redis事务提供原子性和顺序性,确保命令按顺序执行且不被打断。核心概念包括原子性、顺序性、隔离性和持久性。关键指令有MULTI、EXEC、DISCARD和WATCH,用于事务的开始、执行、取消和监视。这保障了命令的完整性,防止并发操作导致的数据不一致。
12 2
|
1月前
|
存储 缓存 NoSQL
【Redis】Redis魔法:揭秘Key的自动消失术——过期删除机制解析
【Redis】Redis魔法:揭秘Key的自动消失术——过期删除机制解析
131 0
|
2月前
|
缓存 NoSQL 数据处理
Redis事务悄然而至:命令的背后故事
Redis事务悄然而至:命令的背后故事
27 0
|
23天前
|
NoSQL Redis
Redis事务:保证数据操作的一致性和可靠性
Redis事务:保证数据操作的一致性和可靠性
|
28天前
|
NoSQL Java Redis
【Redis深度专题】「踩坑技术提升」一文教会你如何在支持Redis在低版本Jedis情况下兼容Redis的ACL机制
【Redis深度专题】「踩坑技术提升」一文教会你如何在支持Redis在低版本Jedis情况下兼容Redis的ACL机制
217 0
|
28天前
|
缓存 NoSQL Shell
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)
148 0
|
28天前
|
存储 缓存 NoSQL
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)(一)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)
321 0
|
1月前
|
NoSQL 应用服务中间件 Linux
Redis的内存回收机制
Redis的内存回收机制
25 2
|
1月前
|
NoSQL 算法 数据管理
【Redis】Redis配置参数详解:优化过期删除机制
【Redis】Redis配置参数详解:优化过期删除机制
79 0
|
1月前
|
存储 NoSQL Java
【Redis】1、学习 Redis 的五大基本数据类型【String、Hash、List、Set、SortedSet】
【Redis】1、学习 Redis 的五大基本数据类型【String、Hash、List、Set、SortedSet】
54 0

热门文章

最新文章