前言
Redis的INCR命令用于将键的值增加1。如果键不存在,则会先将键的值设置为0,然后再执行INCR操作。INCR命令的作用是对计数器进行自增操作,可以用于实现多种场景,比如统计网站访问量、文章访问量、分布式锁等。
一、Redis键之INCR命令
1.INCR 命令
(1)用法:INCR key
(2)作用:将 key 中储存的数字值增一。
(3)返回值:执行 INCR 命令之后 key 的值。
(4)示例
redis> SET PageViewNum 20
OK
redis> INCR PageViewNum
(integer) 21
redis> GET PageViewNum # 数字值在 Redis 中以字符串的形式保存
"21"
二、INCR在Java中的实战运用
private static final long BEGIN_TIMESTAMP = 1701360000; // 开始时间戳:1701360000 -> 2023-12-01 12:00:00
private static final int COUNT_BITS = 32;
@Override
public <T> T redisIncrTest() {
HashMap<String, Object> responseObj = new HashMap<>();
responseObj.put("code", 200);
responseObj.put("success", true);
LocalDateTime now = LocalDateTime.now();
long currentTimestamp = now.toEpochSecond(ZoneOffset.UTC); // 当前时间戳:1702882165
System.out.println("redisIncrTest :: currentTimestamp -> " + currentTimestamp);
long dValue = currentTimestamp - BEGIN_TIMESTAMP; // 增长的差值:1551885
System.out.println("redisIncrTest :: dValue -> " + dValue);
String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd")); // 年月日:20231218
System.out.println("redisIncrTest :: date -> " + date);
String REDIS_ICR_KEY = "REDIS-INCR" + ":" + date; // REDIS-INCR:20231218
long count = stringRedisTemplate.opsForValue().increment(REDIS_ICR_KEY); // INCR REDIS-INCR:20231218
System.out.println("redisIncrTest :: count -> " + count); // 1
String countStr = stringRedisTemplate.opsForValue().get(REDIS_ICR_KEY);
System.out.println("redisIncrTest :: countStr -> " + countStr); // 1
// 说明:
// (1)|:或,当两个位都为0时,结果才为0,两边都会计算
// (2)<<:左移,各二进位左移若干位,高位丢弃,低位补零
// (3)左移一位相当于乘以2,左移32位相当于将某个数乘以2的32次方
long rs = dValue << COUNT_BITS | count;
System.out.println(rs);
System.out.println(dValue << 32);
responseObj.put("data", rs);
return (T) responseObj;
}
三、基于INCR实现的分布式锁思路
INCR命令还可以用于实现分布式锁。我们可以将某个键的值初始化为0,每次获取锁时使用INCR命令将值加1,释放锁时使用DECR命令将值减1。如果值为1,表示锁已被获取,否则表示锁已被释放。