计数器
背景:
利用INCR和DECR命令,可以作为计数器使用,统计网页访问量、商品库存数量等。
具体案例:
比如对于文章浏览量的统计,每篇博客文章都有一个唯一的标识符,如文章ID。每次文章被访问的时候,文章ID对应的浏览次数在Redis里递增。同时定期将浏览次数同步到数据库,用于历史数据分析和浏览量展示等场景。
优点:
- 实时性:能够实时更新或获取文章的浏览次数
- 高性能:原子操作确保了高并发场景下的计数准确性
思考:
这里的浏览量还要考虑是否对用户去重,如果去重的话需要额外的表来存储用户是否已经看过这篇文章。最好是异步写入数据库。
具体方案:
通过Redis实现对博客文章浏览次数的原子性递增和检索,以优化数据库访问并实时更新文章的浏览统计信息
分布式锁
背景:
通过SETNX命令实现分布式锁,保证分布式系统里的互斥访问。
SETNX的含义为当键不存在的时候才会赋值
具体案例:
分布式系统里,如果电商的秒杀活动或库存管理,需要确保同一时间只有一个进程/线程可以修改共享资源,以避免数据不一致的问题。
优点:
- 互斥性:确保同一时间只有一个进程可以访问共享资源,防止数据竞争和冲突
- 高可用性:分布式锁在节点故障或网络分区的情况下依旧可以正常工作,具有自动故障转移和恢复的能力(结合 Redis 的持久化和复制功能,可以在节点故障时保持锁的高可用性)
- 可重入性:支持同一个进程或线程多次获取同一个锁,避免死锁
- 性能开销:实现简单且性能开销小
具体方案:
使用Redis的SETNX命令实现分布式锁的获取和释放,通过lua脚本确保释放锁的原子性。
在执行业务逻辑前尝试获取锁,获取到以后执行业务逻辑,执行结束后确保释放锁。