CI项目设计Redis队列

Posted 大雾哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CI项目设计Redis队列相关的知识,希望对你有一定的参考价值。

项目开发过程中需要设计提供可平衡的处理多个用户请求的队列。
需求:
当用户登录后,查看系统中已经登录的管理员队列,然后查看后台管理员的处理能力,如果已经不能处理新的请求,则把该管理员从处理队列中删除,否则把
该管理员分配给该用户,管理员的处理能力减一,系统当前所指向的管理员+1即指向下一位可以处理问题的管理员。
分析:
最简单的设计就是维护一个循环链表的队列,可以方便的删除和修改信息,但是Redis中并不能处理这样复制的结构信息,因此只能另辟蹊径了,考虑使用
二重的结构来转换循环链表结构。先看下原来的结构:
技术分享图片
这样的结构可以方便的处理问题,不过在redis中存储这样的结构并不能轻易的做到,于是考虑使用用户ID建立队列list,然后使用用户ID建立(key,value),当然也可以把
用户的信息建立一个以ID为KEY的list,于是经过这样的二级结构的转换,Redis就可以处理原本复杂的结构了,这里处理的时候,先检查主队列元素,然后根据以值为
Key来获取其他复杂的信息进行处理,这样设计的结构: 
技术分享图片
这样的结构,无论删除或者添加都必须操作两个地方....以操作的复杂性换取存储的复杂性,未必设计的好,不过先用来实现功能再说吧。
Redis类: 
  1. <?php  
  2.   
  3. if (!defined(‘BASEPATH‘))  
  4.     exit(‘No direct script access allowed‘);  
  5.   
  6. class Redisdb {  
  7.     private $size ;  
  8.     private $redis ;  
  9.     private $channel_queue;  
  10.     private $current_index ;  
  11.     public function __construct() {  
  12.         $this->size = 100;  
  13.         $this->redis = new Redis();  
  14.         $this->channel_queue = ‘staffs‘;  
  15.         $this->redis->connect(‘127.0.0.1‘, ‘6379‘);  
  16.         $this->set_index();  
  17.     }  
  18.     public function set_index($index=0){  
  19.         $this->redis->set(‘current_index‘,$index);  
  20.     }  
  21.     public function en_queue($key,$value) {       
  22.         return  $this->redis->rpush($this->channel_queue, $key) && $this->redis->set($key,$value);;  
  23.     }  
  24.     public function is_empty(){  
  25.        return  $this->redis->lsize(‘admins‘)<=0;  
  26.     }  
  27.     public function is_full(){  
  28.         return $this->redis->lsize($this->channel_queue) >= $this->size;  
  29.     }  
  30.     public function remove($value){  
  31.         return $this->redis->lrem($this->channel_queue,$value);  
  32.     }  
  33.     public function get_list(){  
  34.         return $this->redis->lrange($this->channel_queue,0,-1);  
  35.     }  
  36.     public function delete_key($key){  
  37.         return $this->redis->delete($key);  
  38.     }  
  39.     public function get_value($key){  
  40.         return  $this->redis->get($key);  
  41.     }  
  42.   public function allocate_admin(){  
  43.     $index = $this->redis->get(‘current_index‘);  
  44.         $size  = $this->redis->lsize(‘admins‘);  
  45.     if($size ==0){  
  46.         return false;  
  47.     }  
  48.         if($index<$size){  
  49.             $key =  $this->redis->lindex(‘staffs‘,$index);  
  50.             if($this->redis->get($key)<=1){  
  51.                $this->remove($key);  
  52.                return $key;  
  53.             }else{  
  54.         $this->redis->decr($key);  
  55.         $this->redis->incr(‘current_index‘);          
  56.         return $key ;  
  57.                   
  58.             }  
  59.                
  60.         }else{  
  61.         $this->redis->set(‘current_index‘,0);  
  62.             $this->allocate_admin();  
  63.         }  
  64. }  
  65.   
  66. }  

以上是关于CI项目设计Redis队列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode----IPO「贪心/优先队列」

《Redis设计与实现剖析- 前言》

软件开发团队管理与项目经理

突发事件下的项目管理

设计精良的网上商城系统,包括前端、后端、数据库、负载均衡、数据库缓存、分库分表、读写分离、全文检索、消息队列等,使用SpringCloud公司框架,基于Java语言开发。该项目可部署到服务器上,不断完

网络云盘项目——Redis部署MySQL部署MySQL表设计