Redis自增计数
时间:2026-10-22 07:12 作者:emer 分类: 无
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脚本保证判断与扣减的原子性,避免超卖。