背景

问题分析

在以往的经历中出现了在大批用户涌入消息中心时,造成数据库负载急剧升高的问题,经过排查,发现原因主要有以下几点:

  1. 消息中心相关表中,部分体量较大的数据表没有创建索引,查询操作中数据库连接不能及时释放,导致API服务器不能及时响应,拖垮API服务器;
  2. 目前的访问量级对消息中心没有做数据库的读写分离,导致在缺失索引的情况下,影响主库性能,拖累其他业务;

目前解决方案

  1. 结合数据库日志,补全消息中心索引;
  2. 对消息中心数据库进行读写分离操作,降低主库压力;

仍然存在的问题

在完成上述改造后,仍然有部分较为严重的问题,比如:

  1. 在发送真对全量用户的布告板消息时,在仅依靠数据库的前提下,采用为每个用户插入相同的消息来处理,从而导致数据库中无效数据的增多。(需求方不允许单独拆分出公告消息,需将公告消息合并至系统消息中)
  2. 对于一些活动推广消息,增加用户组概念,即:对于推广消息,不用的用户查询到的推广消息的内容不同,依赖数据库进行用户分组的查询,即使在创建索引的情况下,仍会导致查询开销的急剧增长;
  3. 对于推广消息,支持多图文等富文本格式,依赖数据库查询,在做推广活动时,可能会导致数据库负载明显升高;

需求

类似于淘宝的消息中心,主要体现在如下几点:

  1. 系统中心首页包涵多个选项卡:喜欢消息,关注消息,评论消息,系统消息(包含公告板消息),推广消息,物流消息等;
  2. 推广消息分用户组进行查看;
  3. 推广消息详情支持多图文;

解决方案

基于上述需求单独依赖数据库的话,查询或者更新的开销均较大,因此对消息中心进行缓存改造,由于目前公司的业务需求,缓存系统基于redis,为了增强缓存中内容的可读性,缓存中存放类的信息是采用json格式,其使用的第三方Json为阿里的fastjson;

缓存设计

常规消息

常规消息主要包括:喜欢消息,关注消息,评论消息和物流消息。其主要思想为:

  1. 每个用户均订阅4个消息概要序列,使用的redis数据类型为Zset(有序集合),采用Zset的原因为:(1)Zset可以进行排重操作,避免对同一个用户出现相同的Id;(2)ZSet中的score值可以用于排序操作,避免用户单个序列中的乱序问题;
  2. 概要列表中的数据格式为:value: prefix + id,其中没种类型的消息的prefix不同,例如:评论的是”comment_”,关注的为:”follow_”;
  3. 以上消息的详情存储在一个Map中,其中Map的key为”prefix + id”,value为该消息的详细信息的json串;
  4. 查询消息的操作流程如下图:

  5. 新增消息操作:新增消息时候,需要同时更新两个缓存:概要信息和详细信息,按照以上提到的结构进行存储即可

系统及布告板消息

与常规信息不通,布告板消息由运营人员进行相应的配置,主要为消息的展示时间和消息可见的用户组;并且在用户查询系统消息时,需要检测布告板是否有更新,并同步到系统消息列表中,因此在本节中,缓存中需要维护一个针对应用的布告板消息的有序列表,并为每个用户维护一个系统消息的订阅列表;其主要思想如下:

  1. 缓存中维护一个布告板消息配置的Zset:bulletin_notification_congfig,其中value为bulletin_id_userGroupId,score为display_time
  2. 缓存中维护一个布告板消息相信信息的Map,其中key为bulletin_id_userGroupId,value为布告板详细信息的json格式;
  3. 缓存中为每个用户维护一个系统消息的订阅列表,也是Zset格式,其中value为system_id,score为消息产生的timestamp;
  4. 系统消息的详细内容与常规消息的内容Map一起维护,其key值为”system_id”,value为系统消息的详细内容的json;
  5. 缓存中维护一个键值对bulletin:update:time,其值为布告板消息更新的timestamp;
  6. 缓存中为每个用户维护一个键值对bulletin:access:time:{userId},其值为用户上次访问布告板的timestamp;
  7. 查询消息的操作流程如下:

继续进行中。。。这两天补全。。。。
8. 更新消息的操作流程如下:

推广消息

基于Redis的消息中心缓存搭建相关推荐

  1. 【BCVP】实现基于 Redis 的消息队列

    聆听自己的声音 如果自己学不动了,或者感觉没有动力的时候,看看书,听听音乐,跑跑步,休息两天,重新出发,偷懒虽好,可不要贪杯. 话说上回书我们说到了,Redis的使用修改<[BCVP更新]Sta ...

  2. Spring Boot之基于Redis实现MyBatis查询缓存解决方案

    转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis.本文主要 ...

  3. activemq消息丢失_基于Redis实现消息队列的典型方案

    基于Redis实现消息队列典型方案 1 概述 2 基于List的 LPUSH+BRPOP 的实现 3 PUB/SUB,订阅/发布模式 4 基于SortedSet有序集合的实现 5 基于 Stream ...

  4. 基于Redis的消息队列php-resque

    转载:http://netstu.5iunix.net/archives/201305-835/ 最近的做一个短信群发的项目,需要用到消息队列.因此开始了我对消息队列选型的漫长路. 为什么选型会纠结呢 ...

  5. 秒杀抢购异步下单:基于Redis的消息队列秒杀抢购异步下单功能

    学习Redis时,练习的实战项目代码--基于Redis的Stream类型的秒杀抢购异步下单. 说明: Redis的stream类型的消息队列实现异步下单功能.Redis版本至少要5.0及以上版本才可以 ...

  6. 【分布式微服务】消息中心初步搭建

    初级的消息中心准备提供一个统一的消息中心接口,用户通过消息中心可以将消息发送到kafka集群 ,然后通过消费去推送企业微信消息,或者企业邮箱 实战 框架 首先框架上使用了spring-kafka 2. ...

  7. 骑士卡:基于Kafka搭建消息中心,上亿消息推送轻松完成

    全球购骑士卡是国内领先的会员制特权电商平台,汇聚国内外"吃喝玩乐买"超 300 项会员专属优惠特权.全球购骑士卡基于移动互联生活方式,打通线上.线下消费场景,汇集时下热门.高频的商 ...

  8. java 缓存分页_基于redis做缓存分页

    在实际业务中我们会将一些热数据缓存到redis里面,这时候数据量比较大的话,我们就要对这些热数据进行分页,分页的方式有2种: 第一:从redis拿出所有数据后,再做内存分页(不推荐),热点数据小的时候 ...

  9. Redis做消息队列,香吗?

    来自:架构师修行之路 菜菜哥,我刚做完了一个订单系统,感觉很简单呀 说说看,大量的订单状态怎么处理的? 我设计的时候可是考虑了这一点,所以用了异步处理,采用了MQ 那用的什么MQ呢,透露一下呗 我用的 ...

最新文章

  1. 【转】将 Linux 应用程序移植到 64 位系统上
  2. Linux accept tcp,Linux TCP accept without SYN|ACK
  3. 3年营收翻8倍,网易智慧企业业务多品牌战略升级
  4. 一口气说出 4种 “附近的人” 实现方式,面试官笑了,嘿嘿
  5. python json 不好用_Python之json使用
  6. 【Ubuntu16.04】解决Qt安装包(.run文件)不能用./命令执行的问题
  7. 面向对象 之重写重载
  8. 是否可以从头来过——时间旅行为什么不可能
  9. Opencv摄像头相关参数
  10. 微信企业者开发接口文档
  11. 命令行字符界面与图形界面切换
  12. 利用Visual C++ 实现QQ消息群发 ,大神实际测试,已成功发送消息
  13. git加速 用谷歌浏览器插件
  14. 数据结构——错误一览(概念类)
  15. vivo开机动画不显示Android,vivo手机开机后一直显示开机画面如何解决
  16. 高斯模糊磨皮——ps
  17. VR/AR工作原理、目前存在的技术问题
  18. B40 - 基于STM32单片机的电热蚊香蓝牙控制系统
  19. JavaWeb技术内幕八:JVM内存管理
  20. 史上最小白之RNN详解

热门文章

  1. homeassistant主动推送信息
  2. 【JUC】什么是ABA问题?
  3. 渗透实战-JSP上传webshell报错500
  4. 基于JavaSwing开发书店管理系统+论文 毕业设计 课程设计 大作业
  5. 无法启动此程序,因为计算机中丢失vcruntime140.dll”的解决方法
  6. 0X01 ——位运算
  7. 【图像处理】gamma校正通俗解释及python实现(替代matlab imadjust)
  8. centos 7升级内核,yum方式升级内核,编译方式升级内核
  9. 字符串——OKR-Periods of Words(kmp求最短相同前后缀或者说求最长循环节)
  10. 欧阳修与梅尧臣:逢君伊水畔,一见已开颜