设为首页 收藏本站
查看: 1001|回复: 0

[经验分享] 如何用redis来生成唯一Id

[复制链接]

尚未签到

发表于 2017-12-21 07:40:42 | 显示全部楼层 |阅读模式
  在之前的项目中需要用到一个自动增长的主键,该主键需要包含字母,所以没有办法用到数据库的自增主键。楼主要高手的指导下,发现Redis的RedisAtomicLong类可以解决这个麻烦。而且redis为单线程,不存在线程安全问题
  那么,就让楼主来介绍一下RedisAtomicLong类吧~
  RedisAtomicLong类的构造方法如下:


  • 构造方法一:
  

public RedisAtomicLong(java.lang.String redisCounter,  
RedisConnectionFactory factory)
  


  • 1
  • 2


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


  • 构造方法二:
  

public RedisAtomicLong(java.lang.String redisCounter,  
RedisConnectionFactory factory,
  
long initialValue)
  


  • 1
  • 2
  • 3


  • 1
  • 2
  • 3
  创建一个新的RedisAtomicLong实例,该实例对应的自动增长的主键的key的名字为为redisCounter,并将key name为redisCounter的值设置为initialValue;
  RedisAtomicLong类有以下几个主要的方法:


  • 方法一:
  

public long get();//返回当前的值  


  • 1


  • 1


  • 方法二:
  

public void set(long newValue);//设置当前实例的值为newValue  


  • 1


  • 1


  • 方法三:
  

public long incrementAndGet();//将当前实例的key值加一并且返回  


  • 1


  • 1
  那么,我们如何获得一个RedisAtomicLong实例呢?楼主提供以下两个方法:
  在获取实例之前,我们需要设置好jedis的配置。
  在application.xml文件中,加入以下配置:
  

<bean>  
<property name="maxTotal" value="${redis.pool.maxTotal}" />
  
<property name="maxIdle" value="${redis.pool.maxIdle}" />
  
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
  
</bean>
  

  
<!-- jedis服务器配置 -->
  
<bean>
  
<constructor-arg index="0" value="${redis.ip}" />
  
<constructor-arg index="1" value="${redis.port}" type="int" />
  
</bean>
  

  
<bean        
  
p:host-name="${redis.ip}" p:port="${redis.port}" p:password="${redis.pass}"  p:pool-config-ref="jedisPoolConfig"/>
  

  

  
<bean>
  
<property name="connectionFactory" ref="jedisConnFactory"/>
  
<property name="keySerializer" ref="keySerializer"/>
  
<property name="enableTransactionSupport" value="false"/>
  
</bean>
  

  
<!-- redis 序列化-->
  
<bean
  
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
  


  • 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


  • 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
  方法一:直接在配置文件中配置
  

<!-- someKey为设置的自增长主键的key的名字-->  
<bean>
  
<constructor-arg name="redisCounter" value="someKey"></constructor-arg>
  
<constructor-arg name="factory" ref="jedisConnFactory"></constructor-arg>
  
</bean>
  


  • 1
  • 2
  • 3
  • 4
  • 5


  • 1
  • 2
  • 3
  • 4
  • 5
  在需要用到redisAtomicLong实例的类里面加入下面这段代码即可
  

@Resource  
private RedisAtomicLong redisAtomicLong;
  


  • 1
  • 2


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

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


  • 1


  • 1
  好了,获得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
  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  有人或许会问,如果我想要同时有两个自增长的主键怎么办?下面的这段代码就可以解决这个问题~
  

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426312-1-1.html 上篇帖子: Redis接口的调用 下篇帖子: redis发布和订阅(pub/sub)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表