如何用redis來生成惟一Id

在以前的項目中須要用到一個自動增加的主鍵,該主鍵須要包含字母,因此沒有辦法用到數據庫的自增主鍵。樓主要高手的指導下,發現Redis的RedisAtomicLong類能夠解決這個麻煩。並且redis爲單線程,不存在線程安全問題java

那麼,就讓樓主來介紹一下RedisAtomicLong類吧~mysql

RedisAtomicLong類的構造方法以下:redis

  • 構造方法一:
    public RedisAtomicLong(java.lang.String redisCounter,
                   RedisConnectionFactory factory)
    

      

該實例對應的自動增加的主鍵的key的名字爲爲redisCounter,若是redis中存在key的name爲redisCounter的鍵值對,那麼,則取其值;不然,將redisCounter對應的key值設置爲0;spring

  • 構造方法二:
    public RedisAtomicLong(java.lang.String redisCounter,
                   RedisConnectionFactory factory,
                   long initialValue)  

建立一個新的RedisAtomicLong實例,該實例對應的自動增加的主鍵的key的名字爲爲redisCounter,並將key name爲redisCounter的值設置爲initialValue;sql

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" />
 

  

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

<!-- 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實例的類裏面加入下面這段代碼便可atom

@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
相關文章
相關標籤/搜索