项目开发过程中需要设计提供可平衡的处理多个用户请求的队列。
需求:
当用户登录后,查看系统中已经登录的管理员队列,然后查看后台管理员的处理能力,如果已经不能处理新的请求,则把该管理员从处理队列中删除,否则把
该管理员分配给该用户,管理员的处理能力减一,系统当前所指向的管理员+1即指向下一位可以处理问题的管理员。
分析:
最简单的设计就是维护一个循环链表的队列,可以方便的删除和修改信息,但是Redis中并不能处理这样复制的结构信息,因此只能另辟蹊径了,考虑使用
二重的结构来转换循环链表结构。先看下原来的结构:
这样的结构可以方便的处理问题,不过在redis中存储这样的结构并不能轻易的做到,于是考虑使用用户ID建立队列list,然后使用用户ID建立(key,value),当然也可以把
用户的信息建立一个以ID为KEY的list,于是经过这样的二级结构的转换,Redis就可以处理原本复杂的结构了,这里处理的时候,先检查主队列元素,然后根据以值为
Key来获取其他复杂的信息进行处理,这样设计的结构: 
这样的结构,无论删除或者添加都必须操作两个地方....以操作的复杂性换取存储的复杂性,未必设计的好,不过先用来实现功能再说吧。
Redis类: 

  

<?php
if (!defined('BASEPATH'))exit('No direct script access allowed');
class Redisdb
  {
private $size ;
private $redis ;
private $channel_queue;
private $current_index ;
public function __construct() {
$this->size = 100;
$this->redis = new Redis();
$this->channel_queue = 'staffs';
$this->redis->connect('127.0.0.1', '6379');
$this->set_index();
}
  public function set_index($index=0){
    $this->redis->set('current_index',$index);
  }
  public function en_queue($key,$value) {
    return $this->redis->rpush($this->channel_queue, $key) && $this->redis->set($key,$value);;
   }
   public function is_empty(){
   return $this->redis->lsize('admins')<=0;
   }
public function is_full(){
   return $this->redis->lsize($this->channel_queue) >= $this->size;
}
public function remove($value){
   return $this->redis->lrem($this->channel_queue,$value);
}
public function get_list(){
  return $this->redis->lrange($this->channel_queue,0,-1);
}
public function delete_key($key){
return $this->redis->delete($key);
}
public function get_value($key){
return $this->redis->get($key);
}
public function allocate_admin(){
   $index = $this->redis->get('current_index');
   $size = $this->redis->lsize('admins');
if($size ==0){
    return false;
   }
   if($index<$size){
     $key = $this->redis->lindex('staffs',$index);
   if($this->redis->get($key)<=1){
     $this->remove($key);
      return $key;
}
   else
   {
   $this->redis->decr($key);
   $this->redis->incr('current_index');
   return $key ;
}
}
else
{
   $this->redis->set('current_index',0);
   $this->allocate_admin();
  }
}
}

CI项目设计Redis队列的更多相关文章

  1. [bigdata] 使用Redis队列来实现与机器无关的Job提交与执行 (python实现)

    用例场景: 定时从远程多台机器上下载文件存入HDFS中.一开始采用shell 一对一的方式实现,但对于由于网络或者其他原因造成下载失败的任务无法进行重试,且如果某台agent机器down机,将导致它对 ...

  2. 我心中的核心组件~MSMQ与Redis队列

    回到目录 这个文章其实是我心中的核心组件的第七回,确实在时间上有些滞后了,但内容并不滞后!本文MSMQ只是个引题,我确实不太想说它,它是微软自己集成的一套消息队列,寄宿在Window服务里,稳定性十在 ...

  3. c#之Redis队列在邮件提醒中的应用

    场景 有这样一个场景,一个邮件提醒的windows服务,获取所有开启邮件提醒的用户,循环获取这些用户的邮件,发送一条服务号消息.但问题来了,用户比较少的情况下,轮询一遍时间还能忍受,如果用户多了,那用 ...

  4. c#之Redis队列

    摘要 这两天一直在考虑redis队列:一个生产者,多个消费者的情况,这里弄了一个demo进行测试. 一个例子 关于如何引用Redisclient 可以参考之前的这篇文章:c#之Redis实践list, ...

  5. redis队列的实现

    redis中文官网:http://www.redis.cn/ 关于redis队列的实现方式有两种: 1.生产者消费者模式. 2.发布者订阅者模式. 详解: 1.生产者消费者模式. 普通版本: 比如一个 ...

  6. (3)redis队列功能

    Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpus ...

  7. 转载:【高并发简单解决方案 | 靠谱崔小拽 】redis队列缓存 + mysql 批量入库 + php离线整合

    需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...

  8. redis 队列缓存 + mysql 批量入库 + php 离线整合

    问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入 ...

  9. PHP电商订单自动确认收货redis队列

    一.场景 之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的x天自动确认收货.所谓的订单自动确认收货,就是 ...

随机推荐

  1. xargs详细

    转自  http://czmmiao.iteye.com/blog/1949225 简介之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命 ...

  2. 地图js及json包

    echarts github上的地图js及json包:https://github.com/apache/incubator-echarts/tree/master/map 上面链接没有县及的地图js ...

  3. Python实战案例:这是你见过的最详细的JS加密登录某博

    0x00 抓包分析 简单的搜索之后发现,很多参数都是登陆上面这个请求返回的值,这个请求在输入完账号光标到达密码框时就会生成! 0x01 加密逻辑分析 搜索su=可以很快找到加密的位置,上图看到e.su ...

  4. 留学Essay写作:从入门到精通

    Essay作为最常见的英国大学作业形式,几乎是每个留学生都绕不过去的任务. 大部分人提到自己在英国的大学生活,都会回想起无数个“血泪交加”的夜晚,从白天到傍晚再到深夜,点灯熬油的查资料,写essay. ...

  5. 长篇Essay写作凑字数的小技巧

    当一个留学党面对一篇5000字的essay,写一半之后却没法继续~这类的感觉是很多同学无法想象的!此时唯一的一个有效的方法:凑字数!但是essay写作怎么凑字数呢?如何写够5000字essay?下面我 ...

  6. Es知识整理

    一.Es是如何实现分布式的 1.Es本身基于lucene,高度支持分布式的核心思想就在于,在多个服务器上启动多个Es进程实例,组建了一套Es集群. 2.其次,因为shard分片的应用,非常灵活的支持数 ...

  7. Web基础之Redis

    Redis 什么是Redis?Redis是一个基于内存的非关系型数据库,简单来说就是一个可持久化的高速缓存. 常用场景: 缓存(数据查询,端链接,新闻内容,商品内容等等)--使用最多 聊天室的在线好友 ...

  8. UML图的种类

    一.作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语 ...

  9. element穿梭框el-transfer增加拖拽排序和shift多选checkbox功能

    <template> <div class="demo"> <el-transfer v-model="value" filter ...

  10. 四、Antd组件扩展

    注意:先安装扩展,在安装antd框架,否则会提示 一.安装扩展 1.组件 dva 查看项目依赖 原因是我全局安装,依赖为空, npm i dva 查看依赖 cli装global 当访问报错: Warn ...