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 ...
随机推荐
- Java日志 (zhuan)
http://www.cnblogs.com/bird-li/p/4696662.html ************************************************* 日志对于 ...
- [已修正]安装struts找不到tld文件
今天安装的struts1.3,但是缺少tld文件,所以无法使用taglib,找了半天 假设你的struts版本为1.3.10 解压后的目录为F:\struts-1.3.10-all\struts-1. ...
- iptables进行DNAT(目标地址转换)
前言:对于Linux服务器而言,一般服务器不会直接提供公网地址给用户访问,服务器在企业防火墙后面,通常只是暴露一个公网给用户,下面已80端口进行实现. 演示环境:VM (1)host: 172.16. ...
- SpringMVC之学习(2)值得接收和传递
springmvc中 @Controller 来标识一个控制器 @RequestMapping来标识请求路径,可以写在类名上,也可以写在方法名上.写在类,表示所有的方法都在此路径下. package ...
- Linux mdev 热拔插配置
在嵌入式领域使用比较多的是用 mdev 进行热插拔的操作. 文件系统进行配置 # 首先对 /etc/fstab 进行配置 # <file system> <mount pt> ...
- Fiddler2 java代码拦截设置
jre -DproxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888 Or: jre -DproxySet=true -Dproxy ...
- CentOS安装redmine 2后的简单配置
CentOS5.4安装redmine详细步骤 http://blog.csdn.net/leekwen/article/details/8516832 <<<<输出日志的配置& ...
- 怎样使用 RMAN 增量备份恢复 data guard log gap(日志断档)
主库查询最小scn 信息: SQL> col current_scn for 999999999999999 SQL> SELECT CURRENT_SCN FROM V$DATABAS ...
- es 配置文件
[root@es02 config]# egrep -v "^(#|$)" elasticsearch.yml cluster.name: v5-applicationnode.n ...
- XMLHttpRequest对象的常用属性与方法
方法 一, open(); 书上解释: 用于设置请求的目标url请求方法, 以及其他参数信息 个人理解: 发送请求的页面在不刷新的情况能将参数传给一个服务器进行处理, 这个方法就是将这些个参数传送过去 ...