如何用redis来生成唯一Id
2017-03-17 16:45
232 查看
在之前的项目中需要用到一个自动增长的主键,该主键需要包含字母,所以没有办法用到数据库的自增主键。楼主要高手的指导下,发现Redis的RedisAtomicLong类可以解决这个麻烦。而且redis为单线程,不存在线程安全问题
那么,就让楼主来介绍一下RedisAtomicLong类吧~
RedisAtomicLong类的构造方法如下:
构造方法一:
1
2
1
2
该实例对应的自动增长的主键的key的名字为为redisCounter,如果redis中存在key的name为redisCounter的键值对,那么,则取其值;否则,将redisCounter对应的key值设置为0;
构造方法二:
1
2
3
1
2
3
创建一个新的RedisAtomicLong实例,该实例对应的自动增长的主键的key的名字为为redisCounter,并将key name为redisCounter的值设置为initialValue;
RedisAtomicLong类有以下几个主要的方法:
方法一:
1
1
方法二:
1
1
方法三:
1
1
那么,我们如何获得一个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
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
1
2
3
4
5
在需要用到redisAtomicLong实例的类里面加入下面这段代码即可
1
2
1
2
方法二:在代码中直接获得
1
1
好了,获得redisAtomicLong实例之后如何来获得自动增长的值呢?
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类吧~
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 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" />
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 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>
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
相关文章推荐
- 如何用redis来生成唯一Id
- 如何在高并发分布式系统中生成全局唯一Id
- 如何在高并发分布式系统中生成全局唯一Id
- 如何在高并发分布式系统中生成全局唯一Id
- Redis在集群环境中生成唯一ID
- js 如何生成唯一且不可预测的 ID
- 如何生成一个唯一的ID值
- 如何在高并发分布式系统中生成全局唯一Id
- 如何在高并发分布式系统中生成全局唯一Id(转)
- PHP如何随机生成一个唯一的id
- (转)如何在高并发分布式系统中生成全局唯一Id
- 如何在高并发分布式系统中生成全局唯一Id
- 如何在高并发分布式系统中生成全局唯一Id
- 10031---高并发 sql 生成不重复编号 (订单号) & 如何在高并发分布式系统中生成全局唯一Id
- iOS 如何生成唯一的设备ID
- 如何在高并发分布式系统中生成全局唯一Id
- 高并发 sql 生成不重复编号 (订单号) & 如何在高并发分布式系统中生成全局唯一Id
- 如何在高并发分布式系统中生成全局唯一Id
- 分布式系统如何生成全局唯一的ID
- 如何在高并发分布式系统中生成全局唯一Id