文档章节

redis(3):redis如何做队列

fzxu_05
 fzxu_05
发布于 2013/01/31 17:22
字数 461
阅读 797
收藏 9


前言:缓存不仅可以减少数据库的查询读取压力,还可以减少db的写入io压力

方案:缓存实时更新数据,并将更新记录写入队列,db异步更新,

1.可以使用类似mq(如rabbitmq)队列软件

2.redis自行建队列

(注意要使用increment来维持队列序号:具体原因如下:使用 get 后处理数据再set的方式维护队列,会因为并发导致数据丢失。

示例说明:

ab测试下面的脚本,并发100,跑10000次

一.get& set脚本

ab -n 10000 -c 100 http://127.0.0.1/redis1.php

include_once 'redis.class.php';
$redis = new RedisCluster(false);
$redis->connect(array('host'=>'127.0.0.1','port'=>6379), true);// master

$var = $redis->get('var');
$var++;
$redis->set('var',$var);
$redis->close();


跑完脚本读取缓存数据(我的是在512M的虚拟机上跑的,不同的机器数据不同,不过肯定低于10000,其他的数字都在get & set中被覆盖掉了)

redis 127.0.0.1:6379> get var 
"628"


原因:

读写间隔中其他并发写入,导致数据丢失


二.incr


include_once 'redis.class.php';
$redis = new RedisCluster(false);
$redis->connect(array('host'=>'127.0.0.1','port'=>6379), true);// master
$redis->incr('var');
$redis->close();


会得到完整的10000条数据,不会丢失


redis 127.0.0.1:6379> get var 
"10000"


)

总结:用incr存储队列编号,用标记+编号作为key存储队列内容,比如商品竞拍功能

4.后台基于缓存队列读取更新数据并更新数据库

异步更新的风险:

(1).前后端同时写,有可能造成覆盖的风险

(2).缓存数据丢失或服务崩溃可能导致数据丢失风险

(3).异步更新如出现队列阻塞可能导致数据丢失风险,比如前台生成队列的速度>后台写数据库的速度



推荐一个不错的网站




© 著作权归作者所有

共有 人打赏支持
fzxu_05
粉丝 43
博文 165
码字总数 84201
作品 0
朝阳
程序员
私信 提问
非关系型数据库redis、memcached对比

- redis数据库的优点: (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,list,set,sorted set,has...

slashboywang
2018/09/29
0
0
redis list实现消息队列以及事件模块

@ganqing 你好,想跟你请教个问题: 您好,我是redis的初学者,想利用redis做消息队列,再看了您的文章后,我的理解还是不够透彻,所有想向您请教下。不知道您还有redis做消息队列这方面的资...

CrazyIllusion
2014/11/21
1K
3
redis——应用场景归纳,redis的用途

在“怎样让Redis在你的系统中发挥作用”一文中,Salvatore 'antirez’ Sanfilippo告诉我们如何利用Redis独有的数据结构处理能力来解决一些常见问题。一些Redis原语命令比如LPUSH、LTRIM和LRE...

_Mr_Computer_
2018/06/26
0
0
第一次用Redis做消息队列,求解答

之前没用过消息队列系统,第一次接触,目前在做一个API接口系统,考虑到接口调用频繁的问题,想采用队列机制实现, 环境PHP+Mysql+Redis/MongoDB。 目的:不实时操作Mysql数据库,而是进入Red...

工程师爸爸
2013/02/25
7.8K
6
phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题)

phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题) 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 当我们在开发一个项目时,我们可能会遇到很多问题,比如...

喵了_个咪
2015/12/12
114
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
1
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部