博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis(3):redis如何做队列
阅读量:5880 次
发布时间:2019-06-19

本文共 1064 字,大约阅读时间需要 3 分钟。

hot3.png

前言:缓存不仅可以减少数据库的查询读取压力,还可以减少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

你可能感兴趣的文章
ServlertContext
查看>>
eclipse编辑器生命周期事件监听
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
Python学习笔记
查看>>
java String
查看>>
renhook的使用
查看>>
Linux学习笔记(十二)--命令学习(用户创建、删除等)
查看>>
DOCKER windows 7 详细安装教程
查看>>
养眼美女绿色壁纸
查看>>
U盘启动盘制作工具箱 v1.0
查看>>
增强myEclipse的提示功能
查看>>
Zabbix汉化方法
查看>>
Java I/O系统基础知识
查看>>
Java多线程设计模式(2)生产者与消费者模式
查看>>
对象并不一定都是在堆上分配内存的
查看>>
刘宇凡:罗永浩的锤子情怀只能拿去喂狗
查看>>