redisTools-IdGenerator
public class IdGenerator : RedisToolBase
{
//redis客户端对象
private static readonly NedisClient client = new NedisClient(GetRedisConfig(redisConfigKey)); //redis客户端对象配置存放在Consul服务端的key
private static readonly string redisConfigKey = "redis/common/idgeneratorconfig"; private static readonly object objMaxIdsLock = new object();
// 存放BusinessIdKey,MaxId
private static readonly Dictionary<string, long> maxIds = new Dictionary<string, long>(); private static readonly object objNextIdsLock = new object();
// 存放BusinessIdKey,NextId
private static readonly Dictionary<string, long> nextIds = new Dictionary<string, long>(); private static readonly object objIncrementsLock = new object();
// 存放BusinessIdKey,id增量
private static readonly Dictionary<string, long> increments = new Dictionary<string, long>(); /// <summary>
/// 计算主键时的增量
/// </summary>
private static readonly uint persistenceIncrement = 10; /// <summary>
/// 业务IdKey
/// </summary>
private string busnessIdKey = string.Empty; /// <summary>
/// 使用业务ID的key,ID增量初始化
/// </summary>
/// <param name="BusnessIdKey">业务IdKey</param>
/// <param name="Increment">id增量,默认为1,不能大于10</param>
public IdGenerator(string BusinessIdKey, uint Increment=1)
{
Init(BusinessIdKey, Increment);
} /// <summary>
/// 初始化increments,maxIds,nextIds字典
/// </summary>
/// <param name="BusinessIdKey"></param>
/// <param name="Increment"></param>
private void Init(string BusinessIdKey,long Increment)
{
if (!increments.ContainsKey(BusinessIdKey))
{
lock (objIncrementsLock)
{
if (!increments.ContainsKey(BusinessIdKey))
{
increments.Add(BusinessIdKey, Increment);
}
}
}
if (!maxIds.ContainsKey(BusinessIdKey))
{
lock (objMaxIdsLock)
{
if (!maxIds.ContainsKey(BusinessIdKey))
{
maxIds.Add(BusinessIdKey, client.Increment(BusinessIdKey, persistenceIncrement));
}
}
}
if (!nextIds.ContainsKey(BusinessIdKey))
{
lock (objNextIdsLock)
{
if (!nextIds.ContainsKey(BusinessIdKey))
{
nextIds.Add(BusinessIdKey, maxIds[BusinessIdKey] - persistenceIncrement);
}
}
}
} /// <summary>
/// 重新设置MaxID
/// </summary>
/// <returns></returns>
private static void ResetMaxID(string BusinessIdKey)
{
maxIds[BusinessIdKey] = client.Increment(BusinessIdKey, persistenceIncrement);
nextIds[BusinessIdKey] = maxIds[BusinessIdKey] - persistenceIncrement;
} // 获取下一个ID的锁
private static readonly object nextIDLocker = new object(); /// <summary>
/// 根据业务Id键获取下一个主键ID
/// </summary>
/// <returns></returns>
public Int64 GetNextID(string BusinessIdKey)
{
lock (nextIDLocker)
{
nextIds[BusinessIdKey] = nextIds[BusinessIdKey] + 1; // 如果自增后的ID大于已经持久的ID,则先持久ID,再返回
if (nextIds[BusinessIdKey] >= maxIds[BusinessIdKey])
{
ResetMaxID(BusinessIdKey);
} return nextIds[BusinessIdKey];
}
}
}
1.IdGenerator使用说明:
var primaryKey = new IdGenerator("blog_id", 1);
var id = primaryKey.GetNextID("blog_id");
redisTools-IdGenerator的更多相关文章
- 流程开发Activiti 与SpringMVC整合实例
流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...
- Parallel并行之乱用
关于Parallel我也不细说了,一则微软封装的很好用,二来介绍这个的遍地都是. 我要说的是,要想成为一个优秀的标题党,一定要把重点放到别的地方,为了节省大家阅读时间,我先把结论说了,然后再慢慢从头说 ...
- 一步步学习 Spring Data 系列之JPA(一)
引入: Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服 ...
- 【DWR系列04】- DWR配置详解
table { margin-left: 30px; width: 90%; border: 1px; border-collapse: collapse } img { border: 1px so ...
- YbSoftwareFactory 代码生成插件【十五】:Show 一下最新的动态属性扩展功能与键值生成器功能
YbSoftwareFactory 各种插件的基础类库中又新增了两个方便易用的功能:动态属性扩展与键值生成器,本章将分别介绍这两个非常方便的组件. 一.动态属性扩展 在实际的开发过程中,你肯定会遇到数 ...
- Extjs 源码组成(4.0.7)
(function(){})()形式的自执行,构建Ext对象(0~584) 1 设置全局对象EXt:global.Ext = {}, 2 实现了Ext对象面向对象编程的基础方法,如,apply,ex ...
- 关于Spring注解
* @author 小郑 1 * @content ejb3注解的API定义在javax.persistence.*包里面. 2 * 注释说明: 3 * @E ...
- 自增长主键Id的另类设计
一.引言 在使用ORM框架时,一个表有一个主键是必须的,如果没有主键,就没有办法来唯一的更新一条记录.在Sql Server数据库和Mysql数据库设置自增长的主键是一件很轻松的事情,如果在Oracl ...
- MyBatis的应用
a)首先先导入固定的jar包 b)添加mybatis配置文件mybatis-config.xml 1.添加mybatis配置文件mybatis-config.xml <?xml version= ...
- 习课的视频播放器 video.js
jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncod ...
随机推荐
- Linux音频编程指南(转)
转自: http://www.ibm.com/developerworks/cn/linux/l-audio/ Linux音频编程指南 虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有 ...
- 【NOI】9272 偶数个三
题目 链接:bajdcc/ACM 描述 在所有的N位数中,有多少个数中有偶数个数字3?结果模12345.(1<=N<=10000) 样例输入 2 样例输出 73 方法一:穷举 评价:最简单 ...
- 部署hadoop2.7.2 集群 基于zookeeper配置HDFS HA+Federation
转自:http://www.2cto.com/os/201605/510489.html hadoop1的核心组成是两部分,即HDFS和MapReduce.在hadoop2中变为HDFS和Yarn.新 ...
- web-project的/WEB-INF/lib
哪些jar包应该放到你的/WEB-INF/lib中?(目前为止,我的classpath只配置了dt.jar和tools.jar,也就是说,我的web-project所用的所有jar包都没有配置到cla ...
- pyQt绘图
def paintEvent(self, e): qp = QtGui.QPainter() qp.begin(self) self.DrawChessBoard(qp) self.Draw_Ches ...
- JAVA经典算法40题面向过程
JAVA经典算法40题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...
- [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)
由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后 ...
- window 服务(一)
windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志.计算机启动时,服务会自动开始 ...
- Accumulator
Accumulator简介 Accumulator是spark提供的累加器,顾名思义,该变量只能够增加. 只有driver能获取到Accumulator的值(使用value方法),Task只能对其做增 ...
- htonl()函数学习
今天在网上看到一篇关于htonl()函数的解释,感觉有道理,贴过来大家一起学习! htonl就是把本机字节顺序转化为网络字节顺序 h---host 本地主机 to 就是to 了 n ---net 网络 ...