Redis自增计数

Redis自增计数

引言

浏览量、点赞数、库存扣减、日活统计这类计数场景,用Redis的INCR原子自增比MySQL计数器性能高得多。单条命令在内存里完成加一,天然原子,并发下不会丢计数,是高并发计数的首选方案。

INCR 自增一

INCR article:1001:views

键不存在先按0初始化再加一,返回自增后的最新值,原子操作,并发安全。

INCRBY 指定步长

INCRBY score:user:2001 10

一次加指定整数,适合批量加分、累计积分场景。

DECR 与 DECRBY 递减

DECR stock:item:88
DECRBY stock:item:88 5

库存扣减用递减,扣到0前配合判断,避免出现负数库存。

读取当前计数

GET article:1001:views

返回字符串形式的数字,业务层转整型使用。

计数加过期时间

INCR day:uv:20261022:user:3001
EXPIRE day:uv:20261022:user:3001 86400

日活、每日点击这类临时计数,自增后设置过期时间,自动清理不占内存。

PHP 代码示例

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$views = $redis->incr('article:1001:views');
echo '当前浏览量:' . $views;

PHP扩展里incr对应INCR,decr对应DECR,返回自增后整数。

注意事项

  • INCR只对字符串数字生效,非数字值会报错;
  • 计数要持久化到MySQL时定时批量回写,别每次都写库;
  • 计数器长期不清理会膨胀,临时计数务必加TTL;
  • 库存扣减要先判断再递减,或用Lua脚本保证判断与扣减原子;
  • 分布式下INCR是单key原子,跨多个key计数仍需事务或Lua;
  • 计数初始值可用SET先设定,避免从0起步不符合业务。

总结

INCR原子自增一,INCRBY按步长增加,DECR/DECRBY递减,GET读取当前值。浏览量、点赞、积分、库存等高并发计数用Redis内存操作替代MySQL计数器,性能提升明显。临时日活计数自增后配EXPIRE自动清理,重要计数定时批量回写数据库。库存扣减建议用Lua脚本保证判断与扣减的原子性,避免超卖。


emer 发布于  2026-10-22 07:12