特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/
1、实现方法
Redis Incr 命令将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。
2、相关代码
a、工具方法
1 /** 2 * @Description: 获取自增长值 3 * @param key key 4 * @return 5 */ 6 public static Long getIncr(String key) { 7 RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); 8 Long increment = entityIdCounter.getAndIncrement(); 9 entityIdCounter.expire(0, TimeUnit.SECONDS); 10 return increment; 11 } 12 13 /** 14 * @Description: 初始化自增长值 15 * @param key key 16 * @param value 当前值 17 */ 18 public void setIncr(String key, int value) { 19 RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); 20 counter.set(value); 21 counter.expire(0, TimeUnit.SECONDS); 22 }
b、源码分析
1 private RedisAtomicLong(String redisCounter, RedisConnectionFactory factory, Long initialValue) { 2 Assert.hasText(redisCounter, "a valid counter name is required"); 3 Assert.notNull(factory, "a valid factory is required"); 4 5 RedisTemplate<String, Long> redisTemplate = new RedisTemplate<String, Long>(); 6 redisTemplate.setKeySerializer(new StringRedisSerializer()); 7 redisTemplate.setValueSerializer(new GenericToStringSerializer<Long>(Long.class)); 8 redisTemplate.setExposeConnection(true); 9 redisTemplate.setConnectionFactory(factory); 10 redisTemplate.afterPropertiesSet(); 11 12 this.key = redisCounter; 13 this.generalOps = redisTemplate; 14 this.operations = generalOps.opsForValue(); 15 16 if (initialValue == null) { 17 if (this.operations.get(redisCounter) == null) { 18 set(0); 19 } 20 } else { 21 set(initialValue); 22 } 23 }
3、参考网站
https://www.cnblogs.com/mao2080/p/9182688.html
http://www.runoob.com/redis/strings-incr.html