文档章节

简述基于redis和数据库实现的消息系统

乌龟壳
 乌龟壳
发布于 2016/03/18 23:40
字数 467
阅读 314
收藏 16

首先要确定一个无可否认的事实,redis里的数据是易失的,所以用redis只是为了做到高性能的发布通知。 其次如下所说的只是简化版,极为简陋,但骨架子确实是能搭出来的

  • 在数据库中建立一个消息表,有uuid,message,timestamp,is_used几个字段
  • 每次往消息表推送一条消息后,把消息的uuid通过RPUSH指令推送到redis
  • 取消息的进程使用BLPOP通过阻塞模式接收消息,收到uuid后从数据库的消息表里取出message进行后续操作,取的同时设置is_used = 1,或者可以根据业务,select for update那条消息,业务确实处理完成后再设置为1,这都是数据库本身的事,和redis的不可靠性无关
  • redis可能因各种原因,丢失uuid,则需要一个独立的服务检测长时间未处理(timestamp > timeout and is_used = 0)的uuid,再次推送到redis中

接下来是一些QA

Q:如何解决重复推送uuid到redis中

A:redis只是为了协调分布式系统中多个组件,使其尽快处理消息,实际并发控制和防重复的控制在数据库

Q:一定要用uuid吗?

A:啥id都行,找到message就行了

Q:和postgres的queue有啥区别

A:用postgres自身的notify/listen和数据表实现的队列,一个监听服务就要开启一个数据库连接进程,如果监听的服务比较多,对数据库资源有点浪费。优势就是postgres的notify虽然也有瑕疵,但不会断电丢失。

© 著作权归作者所有

乌龟壳

乌龟壳

粉丝 115
博文 22
码字总数 13436
作品 0
深圳
程序员
私信 提问
加载中

评论(4)

乌龟壳
乌龟壳 博主

引用来自“溱”的评论

可以实现类似于 消息公告的系统
很多需要实时处理的地方都用得上
溱
可以实现类似于 消息公告的系统
乌龟壳
乌龟壳 博主

引用来自“罗文浩”的评论

写的有点儿简单
基本骨架都出来了,细节根据项目情况自调呗,这只是个思路不算方案
罗文浩
罗文浩
写的有点儿简单
Swoft 1.0 正式来袭,首个基于 Swoole 原生协程的框架

历时 1 年多紧锣密鼓的开发,以及愉快而忙碌的春节假期,期间 github star 数从 500 到快破 1k,码云首页推荐,Swoole 作者 Rango 和社区的大力支持,Swoft 1.0 正式版终于要和大家见面。此次...

stelin
2018/03/07
8.8K
31
Linux运维工程师笔试题第十三套

这套题的出处是http://blog.51cto.com/nolinux/1670406 ,看到了周末闲着没事就做一做,答案都是我结合自己的工作得到的,不一定百分百准确,现在拿出来跟各位分享一番。 1、请写出五种系统性...

苏幕遮618
2018/01/08
0
0
BAT最新Java面试题汇总:并发编程+JVM+Spring+分布式+缓存等!

前言 作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责。 今天给大家分享下我整理的Java架构面试...

别打我会飞
06/03
320
0
2019年阿里Java面试必问:JVM与性能优化+Redis+设计模式+分布式

前言 一年之计在于春 金三银四已经要到来,2019的新的开始,作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对...

java知识分子
02/18
698
0
【干货合集】NoSQL技术体系深度解读系列(一):Redis,从技术原理到最佳实践

2018年开年知识盛会——NoSQL数据库直播大讲堂峰会,将于1月19日、23日、25日与大家见面,阿里云Redis、MongoDB、HBase的15位技术专家、产品专家将给大家带来深度的技术及产品分享。本次峰会...

场景研读
2018/01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
28分钟前
3
0
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
6
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部