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 ...
随机推荐
- lua连续随机数
号外:惭愧,工作后几乎没有写博客了,其实是有时间的(每周单休),只是厌烦对着屏幕了,还有懒. 现在老板换人了,时间会多点,估计正常就每周双休了,决定还是每周写两篇(不一定是love2d), 写不出就翻 ...
- centos7搭建python3并和python2共存
注意事项:1.非root帐号加上sudo2.centos7自带Python 2.7.5是不能卸载的,很多系统级软件依赖这个 安装依赖# yum -y groupinstall "Develo ...
- localtime、localtime_s、localtime_r的使用
(1).localtime用来获取系统时间,精度为秒 #include <stdio.h>#include <time.h>int main(){ time_t time ...
- php结合msf反弹内网shell
感谢: perl6大佬分享的姿势. MSF: msf > use payload/php/bind_phpmsf exploit(handler) > set PAYLOAD payloa ...
- Maven学习:项目之间的关系
Maven不仅可以定义一个项目中各个模块之间的关系,还可以更延伸一步定义项目与项目之间的关系. 定义父子项目的好处还是挺多的.
- 飞飞影视cms标签
解析范围: 全站所有模板均可调用 模板名称: 所有模板 调用函数: ff_mysql_vod(参数1:值1;参数2:值2;参数3,值3....;参数n,值n),支持的参数列表如下 * 以下变量名如$v ...
- javascript中字符串拼接详解
字符串拼接是所有程序设计语言都需要的操作.当拼接结果较长时,如何保证效率就成为一个很重要的问题.本文介绍的是Javascript中的字符串拼接,希望对你有帮助,一起来看. 最近在研究<jav ...
- Android startActivityForResult 回传数据
一个activity打开新的activity,新的activity关闭之后,返回数据.原来的activity要接收返回的数据,在开启新的activity时,就需要调用startActivityForR ...
- 解析 Spring ConversionService
弄了张图,方便以后一眼能想起是怎么回事. 前提,看这里:Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(二) .
- 转:Python操作SQLServer示例
注:此文也是转载,2018年1月发现此文阅读量过万,略感不安.当时只是为了自己存档学习,未粘此文的原始连接.如有侵权,通过即删除,敬请谅解! 从网上找的,估计原文是:Python操作SQLServer ...