redis(3):redis如何做队列

本文探讨了使用缓存减轻数据库压力的方法,并通过对比get & set与incr操作,阐述了如何有效利用Redis队列实现数据的实时更新及异步处理。


前言:缓存不仅可以减少数据库的查询读取压力,还可以减少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).异步更新如出现队列阻塞可能导致数据丢失风险,比如前台生成队列的速度>后台写数据库的速度



推荐一个不错的网站




转载于:https://my.oschina.net/wojibuzhu/blog/106722

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值