程序人生

写优雅的程序,做优雅的人

重构系统广播功能

| Comments

以前薄荷伙伴子系统的广播功能使用 redis 存储数据,随着时间推移数据积累,消耗内存十分严重,属于典型的 redis 误用。现在进行大幅重构,更改为 cache + storage 的存储方式,取消了 redis 存储。重构后,消耗资源大幅下降,性能上还有所改进。

先说说广播功能特性。广播功能主要用于薄荷向全体用法传递的消息(包括各种广告,告示和提醒等),当系统管理员在后台发出一条广播后,用户 app 上的消息图标显示小红点,当用户点击图标进入广播列表查看消息内容后,小红点消除。

重构前,广播功能采用了 redis 存储方案,为每一位用户建立一个已读广播集合 set,该 set 中存放用户已读的广播 id。最常见的操作是获取某位用户未读广播和数量,其方法是:使用全体 广播 id 集合与已读广播 id 集合比较,差异部分就是未读广播,对其计数得到未读广播数量。

这种方法的问题有两个:一是 redis 消耗内存巨大,随着用户数增加和发送广播数量增加,内存一直累积;二是当广播数量增加到比较大的数量后,获取未读广播很慢。

对其重构如下:去除了 redis 存储,在数据库中存储每一个用户最新访问广播的时间 last_read_time,建立一个全体的广播列表缓存,广播列表只存放广播 id 和 created_time,列表根据 created_time 从新到旧排序。获取某个用户未读广播和其数量方法:把广播列表缓存的生成时间 created_time 和用户的 last_read_time 比较,比 last_read_time 大的属于未读广播,比 last_read_time 小的属于已读广播。

这次重构,去除 redis 存储,大幅减少内存使用,算法调整让常见操作速度更快,效果很棒。

Comments