zoukankan      html  css  js  c++  java
  • 从业务的角度考虑使用分布式锁

      在消费者一端采用异步处理数据,但是从队列里面拉取出来的数据有一些会是重复的,所以在异步处理中,需要有一个节点来控制重复插入数据的问题,想到同步序列处理,必然是使用到锁的概念。一般情况下使用Lock来锁住一个代码块,使达到并行到串行的效果,但是去重复的效果达不到,其实重复的数据在数据库insert的时候有校验,但是在高并发的的情况下也是会有失效的情况,因为业务逻辑链条相对较长,所以这里采用的redis实现一个锁。

      

            public List<T> GetCacheList(string dataKey, string signKey,
                List<T> idList,string message)
            {
                if (idList == null || idList.Count < 1)
                {
                    return new List<T>();
                }
    
                StackExchangeRedisBase redis = new StackExchangeRedisBase(_dbNum);
                string ountSignKey = redis.Get(signKey);
                if (string.IsNullOrEmpty(ountSignKey))
                {
                    ountSignKey = Guid.NewGuid().ToString();
                    redis.Set(signKey, ountSignKey, 10);
                }
    
                var listRes = GetCurrentList(dataKey, signKey, idList, message, ref ountSignKey);
                var currentSign = redis.Get(signKey);
                if (ountSignKey.Equals(currentSign))
                    return listRes;
                else
                    return GetCacheList(dataKey, signKey, idList,message);
            }

      
            private List<T> GetCurrentList(string dataKey, string signKey, List<T> idList, string message, ref string outSignKey)
            {
                if (idList == null || idList.Count < 1)
                {
                    return new List<T>();
                }
    
                StackExchangeRedisBase redis = new StackExchangeRedisBase(_dbNum);
                var listRes = new List<T>(idList);
                var dataList = redis.GetList<string>(dataKey);
                var isChange = false;
                if (dataList == null)
                    dataList = new List<string>();
                idList.ForEach(t =>
                {
                    string tString = JsonConvert.SerializeObject(t).ToString();
                    if (dataList.Count > 0 && dataList.Contains(tString.ToString().ToUpper()))
                    {
                        listRes.Remove(t);
                    }
                     
                    else
                    {
                        isChange = true;
                        dataList.Add(tString.ToString().ToUpper());
                    }
                });
    
                if (isChange)
                {
                    redis.SetList<string>(dataKey, dataList, 10);
                    outSignKey = Guid.NewGuid().ToString();
                    redis.Set(signKey, outSignKey, 10);
                }
                return listRes;
            }

      

  • 相关阅读:
    Java之正則表達式【使用语法】
    2015年创业中遇到的技术问题:71-80
    2015年创业中遇到的技术问题:71-80
    Kinect小小玩偶游戏----小小潜水员
    微信开发学习日记(三):6点经验
    微信开发学习日记(二):3个案例
    2015年创业中遇到的技术问题:61-70
    2015年创业中遇到的技术问题:61-70
    2次创业经验谈(想创业想做事的人不要错过)
    Kinect舒适区范围--UE4 的Blueprint测试范例
  • 原文地址:https://www.cnblogs.com/yangkangIT/p/7825112.html
Copyright © 2011-2022 走看看