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

目录
相关文章
|
缓存 NoSQL Redis
Redis 事务
10月更文挑战第18天
133 1
|
3月前
|
监控 NoSQL 关系型数据库
Redis:事务(Transactions)
Redis事务支持将多个命令打包执行,但与MySQL不同,它不保证原子性、一致性、持久性和隔离性。Redis事务的核心在于“打包”命令,避免其他客户端插队,通过MULTI、EXEC、DISCARD等命令实现。此外,Redis提供WATCH和UNWATCH机制,用于监控键变化,实现类似“乐观锁”的功能,提升并发操作的安全性。
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
353 5
|
7月前
|
缓存 NoSQL 算法
Redis数据库的键值过期和删除机制
我们需要注意的是,虽然Redis提供了这么多高级的缓存机制,但在使用过程中,必须理解应用的特性,选择合适的缓存策略,才能最大化Redis的性能。因此,在设计和实施应用程序时,理解应用的数据访问模式,以及这些模式如何与Redis的缓存机制相互作用,尤为重要。
258 24
|
11月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
173 7
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
1759 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
206 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
12月前
|
NoSQL Redis
Redis事务长什么样?一文带你全面了解
Redis事务是一组命令的有序队列,通过MULTI、EXEC、WATCH和DISCARD等命令实现原子性操作。事务中的命令在EXEC执行前不会实际运行,而是先进入队列,确保所有命令要么全部成功,要么全部失败。此外,Redis还支持Lua脚本实现类似事务的操作,通常更简单高效。事务适用于购物车结算、秒杀活动、排行榜更新等需要保证数据一致性的场景。
154 0
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
1396 3