如何用redis来生成唯一Id

如何用redis来生成唯一Id

在之前的项目中需要用到一个自动增长的主键,该主键需要包含字母,所以没有办法用到数据库的自增主键。楼主要高手的指导下,发现Redis的RedisAtomicLong类可以解决这个麻烦。而且redis为单线程,不存在线程安全问题

那么,就让楼主来介绍一下RedisAtomicLong类吧~

RedisAtomicLong类的构造方法如下:

  • 构造方法一:
    ?
    1
    2
    public RedisAtomicLong(java.lang.String redisCounter,
                    RedisConnectionFactory factory)

      

该实例对应的自动增长的主键的key的名字为为redisCounter,如果redis中存在key的name为redisCounter的键值对,那么,则取其值;否则,将redisCounter对应的key值设置为0;

  • 构造方法二:
    ?
    1
    2
    3
    public RedisAtomicLong(java.lang.String redisCounter,
                    RedisConnectionFactory factory,
                    long initialValue)  

创建一个新的RedisAtomicLong实例,该实例对应的自动增长的主键的key的名字为为redisCounter,并将key name为redisCounter的值设置为initialValue;

RedisAtomicLong类有以下几个主要的方法:

  • 方法一:
    ?
    1
    public long get(); //返回当前的值

      

  • 方法二:
    ?
    1
    public void set( long newValue); //设置当前实例的值为newValue

      

  • 方法三:
    ?
    1
    public long incrementAndGet(); //将当前实例的key值加一并且返回

      

那么,我们如何获得一个RedisAtomicLong实例呢?楼主提供以下两个方法:

在获取实例之前,我们需要设置好jedis的配置。 
在application.xml文件中,加入以下配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
"jedisPoolConfig" class = "redis.clients.jedis.JedisPoolConfig" >
     "maxTotal" value= "${redis.pool.maxTotal}" />
     "maxIdle" value= "${redis.pool.maxIdle}" />
     "testOnBorrow" value= "${redis.pool.testOnBorrow}" />
 
"jedisShardInfo" class = "redis.clients.jedis.JedisShardInfo" >
     "0" value= "${redis.ip}" />
     "1" value= "${redis.port}" type= "int" />
 
"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" />
 
 
"redisTemplate" class = "org.springframework.data.redis.core.RedisTemplate" >
     "connectionFactory" ref= "jedisConnFactory" />
     "keySerializer" ref= "keySerializer" />
     "enableTransactionSupport" value= "false" />
 
"keySerializer"
     class = "org.springframework.data.redis.serializer.StringRedisSerializer" />

  

方法一:直接在配置文件中配置

?
1
2
3
4
5
"redisAtomicLong" class = "org.springframework.data.redis.support.atomic.RedisAtomicLong" >
         "redisCounter" value= "someKey" >
         "factory" ref= "jedisConnFactory" >
 

在需要用到redisAtomicLong实例的类里面加入下面这段代码即可

?
1
2
@Resource
private RedisAtomicLong redisAtomicLong;

  

方法二:在代码中直接获得

?
1
RedisAtomicLong redisAtomicLong = new RedisAtomicLong( "someKey" ,redisTemplate.getConnectionFactory());

  

好了,获得redisAtomicLong实例之后如何来获得自动增长的值呢?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 第一次,设置初始值
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

  

有人或许会问,如果我想要同时有两个自增长的主键怎么办?下面的这段代码就可以解决这个问题~

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

  

作者: lost blog

出处: http://www.cnblogs.com/JAYIT/

你可能感兴趣的:(redis)