最近用incr和incrBy在接口裏做了下埋點統計每天請求總數,這兩個命令還是挺好用的,先說下這倆命令吧
注:redis後臺服務是串行的單線程執行,不存在併發,即多線程調用Incr/incrby方法,在redis服務器上仍然是串行的單線程執行,不存在併發,所以這倆命令都是原子自增、線程安全的。
1、Incr 命令 (菜鳥教程)
Redis Incr 命令將 key 中儲存的數字值增一。
如果 key 不存在,那麼 key 的值會先被初始化爲 0 ,然後再執行 INCR 操作。
如果值包含錯誤的類型,或字符串類型的值不能表示爲數字,那麼返回一個錯誤。
本操作的值限制在 64 位(bit)有符號數字表示之內。
2、Redis Incrby 命令
Redis Incrby 命令將 key 中儲存的數字加上指定的增量值。
如果 key 不存在,那麼 key 的值會先被初始化爲 0 ,然後再執行 INCRBY 命令。
如果值包含錯誤的類型,或字符串類型的值不能表示爲數字,那麼返回一個錯誤。
本操作的值限制在 64 位(bit)有符號數字表示之內。
3、實現按天統計的思路
以你自定義的字符串+當前年月日 作爲key ;例:
public static final String BATCH_COMMIT_DAY_COUNT="test:wugui:";
public static String getCurrentDate() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
return simpleDateFormat.format(new Date());
}
redisClient.incr(BATCH_COMMIT_DAY_COUNT + DateUtil.getCurrentDate());//redis的key
當然我並沒有爲這個key用expire設置超時時間,因爲我需要保留每天的統計;
incrBy 可以在現有值的基礎上累加你的增量值,比如你要在一個批量審覈接口裏統計每天批量審覈的所有人數,例:
redisClient.incrBy(BATCH_COMMIT_DAY_COUNT + DateUtil.getCurrentDate(), 63l);
注意redis的 incrBy 第二個參數是long類型,不是參數名的integer.....
public Long incrBy(final String key, final long integer) {
checkIsInMultiOrPipeline();
client.incrBy(key, integer);
return client.getIntegerReply();
}
4、總結
除了簡單計數,還可以實現控制用戶單位時間內請求等,可根據業務需求靈活運用;
有興趣可以參考下這位朋友的博客,簡單實用 https://blog.csdn.net/Roy_70/article/details/78260826