ssdb队列的使用
来源:互联网 发布:矩阵除法 编辑:程序博客网 时间:2024/05/14 03:27
最近接触到了ssdb,个人感觉用起来跟redis是差不多的。暂时也没有过多的深究,反正连命令用起来都差不多。
目前使用的框架是yii
需求:
由于用户导出数据量过大,为了监控服务器内存的使用率,采用队列的形式去排队执行任务 。
配置什么的就不介绍了,贴一份代码而已。
当执行导出按钮的控制器操作:
//往队列里面添加一个记录 $uid = Yii::app()->user->id; $createTime = Helper::zeqiiTime('u'); $filename = '订单统计报告'; Yii::app()->ssdb->_cache->qpush('export_csv',$uid.'|'.$createTime); Yii::app()->ssdb->_cache->hset('export_csv',$uid.'|'.$createTime,json_encode(array( 'uid' => $uid, 'createTime' => Helper::zeqiiTime('l'), 'sql' => $sql, 'status' => 0, 'count' => $count, 'type' => 'order_export', 'filename' => $filename.''.date('YmdHis',time()) . '.csv' )));
解释下上述代码中ssdb的使用:
往export_csv队列中添加一条数据,名字是export_csv,值是用uid和时间戳拼接的的一个字段,避免重复。
再ssdb中设置一个hashmap名字也叫export_csv,key的值就是当前队列中的值,便于取出来的时候使用。
第三个参数是一个json格式的数据,这里根据自己的业务逻辑去放任意数据。
然后这个数据就写到了export_csv队列和hashmap中,再服务器端搞个定时任务执行出队操作就可以了。
代码如下:
public function run( $args ){ if( Yii::app()->ssdb->_cache->qsize('export_csv')->data == 0 ){ exit; } $fp = fopen(dirname(__FILE__).'/../../../runtime/keys/'.md5('export_csv_running'), 'w+'); //非阻塞 if (!flock($fp, LOCK_EX | LOCK_NB)) { exit; } try { while ($hashMapKey = Yii::app()->ssdb->_cache->qfront('export_csv')->data) { $content = Yii::app()->ssdb->_cache->hget('export_csv', $hashMapKey)->data; if ($content) { $data = json_decode($content, true); $dir = Html::realStaticPath() . "files/export/" . date('Ymd', strtotime($data['createTime'])) . '/'; if (!is_dir($dir)) { mkdir($dir, 0777, true); } $filename = $dir . $data['filename']; if (file_exists($filename)) { continue; } //加个类型方便扩展其他数据的导出 switch ($data['type']) { case 'order_export': $this->orderExpoer($filename, $data); break; default: break; } //更改当前任务的状态,为已完成 $data['status'] = 1; Yii::app()->ssdb->_cache->hset('export_csv', $hashMapKey, json_encode($data)); } //循环一次自动弹出一个 Yii::app()->ssdb->_cache->qpop('export_csv', 1); } flock($fp, LOCK_UN); fclose($fp); }catch (Exception $e){ Yii::log('Running exportCsv error:'.$e->getMessage(), 'error', 'info'); flock($fp, LOCK_UN); fclose($fp); } }
解释下上述代码的逻辑:
先判断队列export_csv里的长度,如果是0就证明没有数据,直接退出。
然后再加一个文件锁的判断,因为有可能前面的任务还没执行完,后面的定时任务又开始执行这个脚本了。
在然后循环的取出数据,做自己想做的操作就可以了。
阅读全文
0 0
- ssdb队列的使用
- ssdb中TTL的使用
- SSDB使用
- ssdb使用
- SSDB安装与python环境的使用
- SSDB 说明,安装使用
- SSDB的安装配置
- SSDB的介绍
- ssdb
- ssdb
- SSDB
- SSDB基础说明及使用
- 安装使用ssdb个人记录
- SSDB与Redis的区别
- 关于ssdb的一点想法
- ssdb get的设计问题
- 关于SSDB的网络模型
- 基于SSDB的分布式锁
- 头文件 #include 引号 尖括号
- 如何分析Listener和Filter的特性?
- SmartRecycleView的使用
- 数据结构——二叉树及其基本操作
- SpringMvc+Maven多模块项目。集成mina框架
- ssdb队列的使用
- pandas--系列之groupby
- 关于SSH无密登录出现的一些细节问题
- GVE基金会亮相北京中关村 出席区块链前沿技术分享论坛
- 针对摄像机很难对准物体问题
- 水仙花数
- Ndk学习之JNI方法和静态方法(java-->C)
- 第十周 项目3
- pycharm当中,如何导入python2或者python3环境