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);
}
}
}
Redis生成Id主键的工具的更多相关文章
- Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略
一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...
- Hibernate的ID主键生成策略
ID生成策略(一) 通过XML配置实现ID自己主动生成(測试uuid和native) 之前我们讲了除了通过注解的方式来创建一个持久化bean外.也能够在须要持久化的bean的包路径下创建一个与bean ...
- 分布式中的分库分表之后,ID 主键如何处理?
面试题 分库分表之后,id 主键如何处理?(唯一性,排序等) 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定 ...
- 面试官:分库分表之后,id 主键如何处理?
面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全 ...
- 深入理解Redis中的主键失效及其实现机制
参考:http://blog.sina.com.cn/s/articlelist_1221155353_0_1.html 作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Reids ...
- JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理
获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: /** * 获取数据 ...
- javaweb学习总结(三十七)——获得MySQL数据库自动生成的主键
测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...
- 【转】JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理
转自:http://www.cnblogs.com/ysw-go/ 获取数据库自动生成的主键 我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. ...
- javaweb(三十七)——获得MySQL数据库自动生成的主键
测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...
随机推荐
- code标签和pre标签的定义
前些日子一同事问了我一个关于code标签和pre标签的问题,嗯,是的,这两个标签凑到一块,便出现了问题.于是总结了一下.此文就重点谈一下code标签和pre标签喽,谈谈他们的定义,区别,应用以及这两个 ...
- Oracle update 日期
UPDATE Sf_Msg_Monthly SET smm_Closed_Time = to_date('2011-12-30 11:54:30','yyyy-MM-dd HH24:MI:SS') ;
- c++之——抽象基类
在一个虚函数的声明语句的分号前加上 =0:就可以将一个虚函数变成纯虚函数,其中,=0只能出现在类内部的虚函数声明语句处.纯虚函数只用声明,而不用定义,其存在就是为了提供接口,含有纯虚函数的类是抽象基类 ...
- CSS初始化设置
在网页开发时,由于浏览器默认加载的css样式使得页面显示的样式出现一些意想不到的意外样式,所以首先要进行css的初始化设置. 此外一些常用的样式,比如浮动等也可以放到初始化中备用.
- HOW TO:使用 Visual C# .NET 打印 RichTextBox 控件的内容
概要 本分步指南介绍了如何打印 RichTextBox 控件的内容.RichTextBox 控件没有提供任何打印 RichTextBox 内容的方法.您可以扩展 RichTextBox 类以使用 EM ...
- iOS NSURLConnection使用详解
一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetworkin ...
- 【WPF】弹窗定位、弹窗关闭后再打开的报错
需求:点击按钮,打开一个弹窗. // 获得窗体实例 Window window = openDesignViewModel.View as Window; // 这是使用了WAF框架 //Window ...
- valgrind: failed to start tool 'memcheck' for platform 'amd64-linux
valgrind运行错误 问题描述 valgrind运行时,无法找到相关工具文件,具体报错如下 valgrind: failed to start tool 'memcheck' for platfo ...
- 你用过Spring中哪些功能?
核心容器: IOC:依赖注入 AOP:日志记录,性能统计,安全控制,事务处理,异常处理 Spring MVC: Spring profile:生产和日常配置的切换 Spring事件触发功能:比较简单, ...
- Hibernate基本原理(一)
在开始学hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低? 如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎 ...