如何用redis来生成唯一Id
在之前的项目中需要用到一个自动增长的主键,该主键需要包含字母,所以没有办法用到数据库的自增主键。楼主要高手的指导下,发现Redis的RedisAtomicLong类可以解决这个麻烦。而且redis为单线程,不存在线程安全问题
那么,就让楼主来介绍一下RedisAtomicLong类吧~
RedisAtomicLong类的构造方法如下:
- 构造方法一:
public RedisAtomicLong(java.lang.String redisCounter,
RedisConnectionFactory factory) 
该实例对应的自动增长的主键的key的名字为为redisCounter,如果redis中存在key的name为redisCounter的键值对,那么,则取其值;否则,将redisCounter对应的key值设置为0;
- 构造方法二:
public RedisAtomicLong(java.lang.String redisCounter,
RedisConnectionFactory factory,
long initialValue) 
创建一个新的RedisAtomicLong实例,该实例对应的自动增长的主键的key的名字为为redisCounter,并将key name为redisCounter的值设置为initialValue;
RedisAtomicLong类有以下几个主要的方法:
- 方法一:
public long get();//返回当前的值
 
- 方法二:
public void set(long newValue);//设置当前实例的值为newValue
 
- 方法三:
public long incrementAndGet();//将当前实例的key值加一并且返回
 
那么,我们如何获得一个RedisAtomicLong实例呢?楼主提供以下两个方法:
在获取实例之前,我们需要设置好jedis的配置。 
在application.xml文件中,加入以下配置:
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxTotal}" />
<property name="maxIdle" value="${redis.pool.maxIdle}" />
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
</bean> <!-- jedis服务器配置 -->
<bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis.ip}" />
<constructor-arg index="1" value="${redis.port}" type="int" />
</bean> <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.ip}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="jedisPoolConfig"/> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnFactory"/>
<property name="keySerializer" ref="keySerializer"/>
<property name="enableTransactionSupport" value="false"/>
</bean> <!-- redis 序列化-->
<bean id="keySerializer"
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
方法一:直接在配置文件中配置
<!-- someKey为设置的自增长主键的key的名字-->
<bean id="redisAtomicLong" class="org.springframework.data.redis.support.atomic.RedisAtomicLong">
<constructor-arg name="redisCounter" value="someKey"></constructor-arg>
<constructor-arg name="factory" ref="jedisConnFactory"></constructor-arg>
</bean>
在需要用到redisAtomicLong实例的类里面加入下面这段代码即可
@Resource
private RedisAtomicLong redisAtomicLong;
方法二:在代码中直接获得
RedisAtomicLong redisAtomicLong = new RedisAtomicLong("someKey",redisTemplate.getConnectionFactory());
好了,获得redisAtomicLong实例之后如何来获得自动增长的值呢?
// 第一次,设置初始值
long original = 0L; // 获取 code 值
original = redisAtomicLong.get();
System.out.println("*****************original:"+original); // 第一次,设置初始值
if (original == 0L) {
redisAtomicLong.set(5L);
}
//获得加1后的值
long now = redisAtomicLong.incrementAndGet();
System.out.println("*****************now:"+now); 输出值:
*****************original:0
*****************now:6
有人或许会问,如果我想要同时有两个自增长的主键怎么办?下面的这段代码就可以解决这个问题~
RedisAtomicLong atomicLong1 = new RedisAtomicLong("somekey1", redisTemplate.getConnectionFactory(),3L);//创建实例的时候就设置初始值为3
RedisAtomicLong atomicLong2 = new RedisAtomicLong("somekey2", redisTemplate.getConnectionFactory(),5L);//创建实例的时候就设置初始值为5
long now1 = atomicLong1.incrementAndGet();
long now2 = atomicLong2.incrementAndGet();
System.out.println("*****************now:"+now1);
System.out.println("*****************now:"+now2);
输出值:
*****************now:6
*****************now:7
如何用redis来生成唯一Id的更多相关文章
- php 生成唯一id的几种解决方法
		
php 生成唯一id的几种解决方法 网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid ...
 - PHP使用SnowFlake算法生成唯一ID
		
前言:最近需要做一套CMS系统,由于功能比较单一,而且要求灵活,所以放弃了WP这样的成熟系统,自己做一套相对简单一点的.文章的详情页URL想要做成url伪静态的格式即xxx.html 其中xxx考虑过 ...
 - php生成唯一id/唯一标识符/唯一订单号
		
/** * php 生成唯一id * https://blog.csdn.net/hzqghost/article/details/18914681 */ function guid($factor= ...
 - 如何使用php生成唯一ID的4种方法
		
php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID.由于生成唯一ID与微秒时间关联,因此ID的唯一性非常 ...
 - PHP获取时间戳和微秒数以及生成唯一ID
		
microtime函数 描述:返回当前Unix时间戳和微秒数 语法:mixed microtime( [ bool $get_as_float ] ) //直接输出 echo microtime(); ...
 - 根据twitter的snowflake算法生成唯一ID
		
C#版本 /// <summary> /// 根据twitter的snowflake算法生成唯一ID /// snowflake算法 64 位 /// 0---0000000000 000 ...
 - C# 根据twitter的snowflake算法生成唯一ID
		
C# 版算法: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
 - php 生成唯一id的几种解决方法(实例)
		
php 生成唯一id,网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid() uniqid ...
 - python学习之-- 生成唯一ID
		
以下以2种方法生成唯一ID def uuid_method(): """第一种方法""" import uuid return str(uu ...
 
随机推荐
- Mac 下安装Ruby环境(转)
			
步骤1 - 安装 RVM RVM 是干什么的这里就不解释了,后面你将会慢慢搞明白. $ curl -L https://get.rvm.io | bash -s stable 期间可能会问你sudo管 ...
 - 用Fiddler 发送post请求
			
在调试web api的时候,若是get 请求,可以直接在浏览器里查看结果,如果是put,或者post请求在浏览器地址栏里就没有办法了. 下面介绍一下,如何利用fiddler模拟post请求. 也可以用 ...
 - 用nodepad++生成导入数据的SQL
			
在工作中经常要往数据库里导入数据,如果是在本地,可以用SQL SERVER自带的工具 直接往表里导入或者 用ssis 导入 线上的数据库由dba负责,作为开发不能直接操作,需要程序员来生成sql语句, ...
 - 电子商务(电销)平台中订单模块(Order)数据库设计明细(转载)
			
电子商务(电销)平台中订单模块(Order)数据库设计明细 以下是自己在电子商务系统设计中的订单模块的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 订单表 (order)|-- ...
 - osgi应用使用桥接的方式打成war包部署在websphere上时遇到的与cxf相关的问题
			
原来我们的程序都是基于Equinox架构的,可是后面由于要实现打成war包在中间件中部署的需求,使用了eclipse官方提供的桥接方式实现. 桥接的部分后面有时间了我专门写一个文章来说,不明确的临时请 ...
 - ultragrid checkbox
			
울트라그리드에 체크박스 넣을 사용하는 속성. cols["checked"].Header.Caption = ""; cols["checked ...
 - 浏览器  UserAgent
			
IE Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C; .NET C ...
 - Linux中history历史命令使用方法详解
			
当你在玩Linux的时候,如果你经常使用命令行来控制你的Linux系统,那么有效地使用命令历史机制将会使效率获得极大提升.事实上,一旦你掌 握了我在下面给出的15个有关Linux history历史命 ...
 - php容易忽视的地方
			
一:bool in_array ( mixed $needle , array $haystack [, bool $strict ] ) 用的时候加最后一个参数,判断类型 <?php $a = ...
 - c#各类型转byte[]或转回
			
var tmp = BitConverter.ToInt32(new byte[]{...}); var bytes = BitConverter.GetBytes(tmp); 而String转byt ...