zoukankan      html  css  js  c++  java
  • Redis生成Id主键的工具

    public class PrimaryKeyGenerator
    {
    	private static readonly NedisClient client = new NedisClient(GetRedisConfig());
    
    	/// <summary>
    	/// 获取当前Redis配置实例
    	/// </summary>
    	/// <returns></returns>
    	private static RedisConfiguration GetRedisConfig()
    	{
    		string strRedisConfiguration = getRedisConfiguration();
    		RedisConfiguration redisConfig = JsonConvert.DeserializeObject<RedisConfiguration>(strRedisConfiguration);
    		return redisConfig;
    	}
    
    	/// <summary>
    	/// 获取RedisConfiguration配置字符串
    	/// </summary>
    	/// <returns></returns>
    	private static string getRedisConfiguration()
    	{
    		return "{"MasterNumber":1,"Sentinel":"192.168.47.131:26379,192.168.47.140:26379,192.168.47.140:26380,192.168.47.139:26379","SentinelConnectTimeout":1000,"ReadWriteSeparate":true,"MasterName":"masterredis131","DbNumber":2,"PoolSizeMultiplier":0,"PoolTimeOutSeconds":0}";
    		//using (var client = new ConsulClient())
    		//{
    		//    var kvPair = client.KV.Get("redis/cluster/default/RedisConfig").Result;
    
    		//    if (kvPair.Response != null && kvPair.Response.Value != null)
    		//    {
    		//        return Encoding.UTF8.GetString(kvPair.Response.Value, 0, kvPair.Response.Value.Length);
    		//    }
    
    		//    return string.Empty;
    		//}
    	}
    
    	/// <summary>
    	/// 计算主键时的增量
    	/// </summary>
    	private uint increment = 1;
    
    	/// <summary>
    	/// 业务IdKey
    	/// </summary>
    	private string busnessIdKey = string.Empty;
    
    	/// <summary>
    	/// 使用业务ID的key,ID增量初始化
    	/// </summary>
    	/// <param name="BusnessIdKey">业务IdKey</param>
    	/// <param name="Increment">id增量</param>
    	public PrimaryKeyGenerator(string BusnessIdKey, uint Increment)
    	{
    		increment = Increment;
    		busnessIdKey = BusnessIdKey;
    	}
    
    	/// <summary>
    	/// 获取下一个主键ID
    	/// </summary>
    	/// <returns></returns>
    	public Int64 GetNextID()
    	{
    		return client.Increment(busnessIdKey, increment); 
    	}
    }
    

      测试代码:

    class Program
        {
            static void Main(string[] args)
            {
                //设work IOCP min值
                ThreadPool.SetMinThreads(300, 200);
    
                #region Id生成工具测试
    
                //单线程测试
                //GeneratorIDTest();
                //多线程测试
                for (int i = 0; i < 1000; i++)
                {
                    ThreadStart num = new ThreadStart(GeneratorIDTest);
                    Thread numThread = new Thread(num);
                    numThread.Start();
                }
                #endregion
    
               
                
                Console.WriteLine("开始" + ids.Count()+ "mainID:" + Thread.CurrentThread.ManagedThreadId.ToString());
                Thread.Sleep(30000);
                Console.WriteLine("结束未去重:"+ids.Count()+"去重:"+ ids.Distinct().Count());
                Console.WriteLine("结束未去重:" + safeIds.Count() + "去重:" + safeIds.Distinct().Count());
                //Console.WriteLine("结束未去重:" + safeIds2.Count() + "去重:" + safeIds2.Distinct().Count());
    
                Console.ReadKey();
            }
    
            
            static List<long> ids = new List<long>();
    	//https://blog.csdn.net/liunianqingshi/article/details/79025818
            static ConcurrentQueue<long> safeIds = new ConcurrentQueue<long>();
            static Queue<long> safeIds2 = new Queue<long>();
    		
            private static void GeneratorIdTest()
            {
                var primaryKey = new PrimaryKeyGenerator("blog_id", 1);
                for (int i = 0; i < 50; i++)
                {
                    var id = primaryKey.GetNextID();
                    ids.Add(id);
                    safeIds.Enqueue(id);
                    //safeIds2.Enqueue(id);//System.ArgumentException:“目标数组的长度不够。请检查 destIndex 和长度以及数组的下限。”
                    Console.WriteLine("线程ID"+Thread.CurrentThread.ManagedThreadId.ToString() +":"+id);
                }
            }
        }
    

      

  • 相关阅读:
    茶香账簿小程序开发进度(3)
    软件需求十步走阅读笔记(一)
    茶香账簿小程序开发进度(2)
    茶香账簿小程序开发进度(1)
    软件工程概论总结及对老师的意见
    人月神话阅读笔记03
    第二阶段第七次站立会议
    第二阶段第六次站立会议
    第二阶段第五次站立会议
    第二阶段第四次站立会议
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/9408197.html
Copyright © 2011-2022 走看看