需求背景
技术实现分析
技术方案
实现过程
Redis 原子操作原理
需求背景
计算某移动端应用设备每日版本的新增设备数、活跃设备数、累计设备数,用户有启动操作时计算。
每日新增设备数:一天内应用设备列表中某一版本的新增的数量
每日活跃设备数:一天内某一版本应用设备第一次启动记为活跃数
每日启动设备数:一天内某一版本应用设备第一次启动记为活跃数
技术实现分析
看到这样的需求,其实大家很容易想到,就是一个 +1 的累计的操作。那么对于高并发的的场景下,我们需要考虑哪些问题呢?
首先说下,多实例部署,能否保证数据的一致性问题,MySQL 数据的一致性,如果每次 +1 就更新数据库,则对 MySQL 增加不少压力,其数据一致性问题,利用悲观锁性能差些,用乐观锁数据丢的概率就大了。
如何保证不丢,又减少 MySQL 的压力呢?另外对于 ElasticSearch,由于历史原因项目中对设备信息的存储,采用 ES,其实大家很容易发现这里有些问题,为什么不用 MySQL 存储呢?
其实小编也有这样的疑问,只是,历史留下来的设计,暂时还不想迁移。那么面对这样的存储方案,我们会遇到的问题是什么呢?就是 ES 擅长做检索,其次做新增,但对于更新操作,es 是需要将原来的数据状态改为删除状态,然后新增一条记录,所以修改操作相对比较耗时。
技术方案
编程语言 Java,技术栈:Spring Boot、Redis、Elasticsearch、MySQL。其中 ElasticSearch 用于应用设备的存储,MySQL 用于存储新增数、活跃数、累计数的计算结果,Redis 做过滤和队列,用以异步处理。
E
隐藏内容