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);
}
}
}

  

Redis生成Id主键的工具的更多相关文章

  1. Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略

    一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...

  2. Hibernate的ID主键生成策略

    ID生成策略(一) 通过XML配置实现ID自己主动生成(測试uuid和native) 之前我们讲了除了通过注解的方式来创建一个持久化bean外.也能够在须要持久化的bean的包路径下创建一个与bean ...

  3. 分布式中的分库分表之后,ID 主键如何处理?

    面试题 分库分表之后,id 主键如何处理?(唯一性,排序等) 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定 ...

  4. 面试官:分库分表之后,id 主键如何处理?

    面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全 ...

  5. 深入理解Redis中的主键失效及其实现机制

    参考:http://blog.sina.com.cn/s/articlelist_1221155353_0_1.html 作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Reids ...

  6. JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理

    获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: /** * 获取数据 ...

  7. javaweb学习总结(三十七)——获得MySQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  8. 【转】JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理

    转自:http://www.cnblogs.com/ysw-go/ 获取数据库自动生成的主键 我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. ...

  9. javaweb(三十七)——获得MySQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

随机推荐

  1. ny710 外星人的供给站

    外星人的供给站 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本 ...

  2. form表单提交数据编码方式和tomcat接受数据解码方式的思考

    http://blog.sina.com.cn/s/blog_95c8f1ac010198j2.html *********************************************** ...

  3. uml 符号关系示意

    类(Class) 类(图A)是对象的蓝图,其中包含3个组成部分.第一个是Java中定义的类名.第二个是属性(attributes).第三个是该类提供的方法.属性和操作之前可附加一个可见性修饰符.加号( ...

  4. eclipse 启动报share library load faild

      eclipse 与 jdk 版本要一致 *32 - 对应32位 *64 - 对应64位

  5. js弹出window.open窗口

    <html> <head> <SCRIPT LANGUAGE="JavaScript"> function openwin() {OpenWin ...

  6. C#播放器控件的常用方法介绍

    右击工具箱->选择项(I)... -> 显示"选择工具箱项" -> COM组件 -> Windows Media Player   wmp.dll 添加 [ ...

  7. cmder小技巧

    1.修改config下的aliases文件,可以添加别名 $* 表示所有参数,$i 表示第几个参数 比如cd cd=cd /d $* 这样window下的cd就可以直接切换盘符+路径了. 有用的别名 ...

  8. I/O限制异步操作

    CLR非异步操作读取文件的过程图 非异步操作主要是因为每次请求硬件如(硬盘,网卡等)的线程都处于阻塞状态,导致以后的请求都需要重新创建新的线程.导致线程上下文的切换频繁. 异步IO操作主要是通过每次的 ...

  9. 【C#】获取泛型<T>的真实类型

    需求:在包含泛型T的类或方法中,想要根据T的具体类型,进行相应的处理,需求伪代码如下: public void Test<T>() { if(T is string) { // do so ...

  10. USB 之传输编码格式 NRZI 介绍

    记录NRZI (Non-Return-to-Zero Inerted code) 非归零翻转编码,之前,我先稍微记录一下他的前身. RZ 编码(Return- to - zero coding) RZ ...