什么保证消费者接受信息之相继

Redis的7只应用场景

背景

事先面试的时给咨询到关于mq如何保证信息的各个问题,当时从来不答好,网上为无找到如意的答案,于是自己想了一个

 

题材讲述

若,A和B通过信息队列通信,A发了先后作了2条信息m1和m2。A发出之逐条是m1、m2,结果m2先到队列,m1后迈入之,那么当班中m2在前m1每当晚,假要即半修信息是起赖关系的,必须是先行m1再m2,那么B可能先收下至m2后吸收及m1,问这时候怎么处置?

葡京签到送彩金 1

本身之琢磨

1、B接收至信息之次第跟A发出消息的先后顺序以及信息于队中的逐一是尚未提到之。消息到达队列的先后顺序没法保证,同样,队列将消息投递出去以后收到信息之次第吧没法保证,所以,我思无论怎样作为消费者的B都必须确保工作的对,无论生产者怎么怎么发信息,队列怎么送消息,作为消费者还不能不意识及:接收到的音信是无序的,必须抓好处理,务必管工作健康。

2、我当这是一个通用的题材,也是当消费者要要考虑的问题

3、消息的逐一并无紧要,重要的凡如果管工作的末段一致性

一:缓存——热数据

解决方案

看好数据(经常会于询问,但是未经常为改或者去的数据),首选是利用redis缓存,毕竟强到冒泡的QPS和太强之长治久安不是有着类似工具还有些,而且比于memcached还提供了丰富的数据类型可以采取,另外,内存中的数为供了AOF和RDB等持久化机制好选,要冷、热的要忽冷忽热的且可选。

方案一:本地消息表+定时扫描

1、接收及信息之后,将信息保存至本地数据库的表中,标记为非处理

2、若满足处理原则,直接处理,成功以后,标记表中的记录为就处理,然后往行确认消息

3、若无满足处理原则,则暂时无处理

4、定时扫描本地消息表,将那些不处理的重复过同样遍

5、幂等性判断好重大

整合现实运用得留意一下:很多人数所以spring的AOP来构建redis缓存的自动生产和排,过程可能如下:

推个栗子

而,签到送积分。

又要,签到和送积分是分手的,签到的逻辑是望签到表中插入一久记下,送积分的逻辑是判定积分所对应的登录记录是否存在,存在则送积分,否则不送。

随即要,消息队列中起少数久信息,一长达是签到消息,另一样长条凡送积分消息,这漫长积分消息牵动在签到记录之id。

这就是说,送积分的时候就要靠是否生记名记录。按照点的反驳,将信息先保存于该地,然后定时扫描,是可以健康进行的。

 

~水平有限,暂时仅想到这种方式,欢迎批评指正!!!~

 

  • Select 数据库前查询redis,有的话使redis数据,放弃select
    数据库,没有的话,select 数据库,然后拿数据插入redis

  • update或者delete数据库钱,查询redis是否是拖欠多少,存在的口舌先去redis中数量,然后还update或者delete数据库中之数目

面这种操作,如果连发量很有点之情形下中心没有问题,但是高并发的情状请留意下面场景:

为update先删掉了redis中之欠数额,这时候另一个线程执行查询,发现redis中从未,瞬间实行了查询SQL,并且插入到redis中同样长条数,回到刚才格外update语句,这个悲催的线程压根不知底刚刚十二分该死的select线程犯了一个弥天大摩!于是这redis中的不当数据就永远的是了下来,直到下一个update或者delete。

二:计数器

像统计点击数等利用。由于单线程,可以避免起问题,保证不见面错,而且100%毫秒级性能!爽。

命令:INCRBY

本爽了了,别忘持久化,毕竟是redis只是存了内存!


三:队列

  • 相当给信息网,ActiveMQ,RocketMQ等工具类,但是个人认为简单用一下还行,如果对数据一致性要求大之话语还是用RocketMQ等标准系统。

  • 出于redis把数量增长到行列是回到添加元素葡京签到送彩金在队的第几各,所以可以举行判断用户是第几只访问这种事情

  • 班不仅可拿并发请求变成串行,并且还得做行或者仓库使用


季:位操作(大数量处理)

用来数据量上亿的光景下,例如几亿用户系统的报到,去再登录次数统计,某用户是否在线状态等等。

想一下腾讯10亿用户,要几单毫秒内查询及某用户是否在线,你会怎么开?千万别说为每个用户建立一个key,然后沿着个记(你可算是一下需要之内存会很害怕,而且这种近似的急需很多,腾讯光这个得多花费多少钱。。)好吧。这里要因此得操作——使用setbit、getbit、bitcount命令。

原理是:

redis内构建一个够长之屡屡组,每个数组元素只能是0和1点滴独价值,然后这个数组的下标index用来代表我们地方例子里的用户id(必须是数字哈),那么坏引人注目,这个几亿添加的老数组就能够经过下标和元素值(0同1)来构建一个记忆系统,上面我说之几乎单情景呢即能落实。用到的指令是:setbit、getbit、bitcount


五:分布式锁和单线程机制

  • 说明前端的再请求(可以随便扩展类似状况),可以由此redis进行过滤:每次要将request
    Ip、参数、接口等hash作为key存储redis(幂等性请求),设置多长时间有效期,然后下次恳请过来的时候先在redis中查找有没发生这key,进而证实是无是必然时间内恢复的又提交

  • 秒杀系统,基于redis是单线程特征,防止出现数据库“爆破”

  • 全局增量ID生成,类似“秒杀”


六:最新列表

比如说新闻列表页面时的消息列表,如果总数量特别充分之气象下,尽量不要以select
a from A limit 10这种low货,尝试redis的
LPUSH命令构建List,一个个依次都填进去便足以啊。不过若是内存清掉了啃办?也简单,查询不至囤key的言语,用mysql查询而初始化一个List到redis中不怕哼了。


七:排行榜

哪位得分高孰排名为上。命令:ZADD(有续集,sorted set)

不久前以研股票,发现量化交易是单大好之艺术,通过臆想出来规律,用程序对历史数据进行验证,来判定这臆想出来的原理是否中,这玩意真牛!有没有产生哪位玩这的于自己留给个开口,交流一下嘛。