最近在工作中遇到一個需求,要面向所有用戶發送公告,用戶可以删除或者設為已讀。這個用數據沒辦法去實現,我用redis模拟結合數據的方式去實現這個功能。說了這麼多廢話,還是來點幹貨吧。直接貼代碼
<?php /** * 消息列表類 * redis key類型為 set * yxt_notice_read_ 已讀列表(表後綴 uid除以1000) * 存儲方式:鍵值 消息id 用戶id(逗号拼接) * yxt_notice_del 已讀列表 * 存儲方式:鍵值 用戶id 消息id(逗号拼接) * author fong */class MessageBox extends Redis{ public $uid; private $readListKey='yxt_notice_read_'; private $delListKey ='yxt_notice_del'; public $mid; //消息id private $listSize=1000; private $init = false; public function __construct() { $this->connect(config('redis.host'), config('redis.port')); $this->auth(config('redis.password')); } //添加一條已讀信息 public function read($uid,$mid){ $this->uid = $uid; $this->mid = $mid; $this->buildKey(); $res = $this->hGet($this->readListKey,$this->mid); if(isset($res) && in_array($this->uid,explode(',',$res))) return; if(empty($res)) $res=''; $this->hSet($this->readListKey,$this->mid,$res.','.$this->uid); }
public function getIndexKey(){ return ceil( $this->uid / $this->listSize ); } //删除一條已讀信息 public function del($uid,$mid){ $this->uid = $uid; $this->mid = $mid; $this->buildKey(); $res = $this->hGet($this->delListKey,$this->uid); if(isset($res) && in_array($this->mid,explode(',',$res))) return; if(empty($res)) $res=''; $this->hSet($this->delListKey,$this->uid,$res.','.$this->mid); } //拼接已讀列表鍵值 public function buildKey(){ if($this->init) return; //防止多次循環的時候,改變鍵值 $this->readListKey = $this->readListKey.$this->getIndexKey() ; $this->init = true; } //獲取用戶已讀列表 public function getReadList($uid){ $this->uid = $uid; $this->buildKey(); $res = $this->hGetAll($this->readListKey); foreach ( $res as $k=>$v ) { if(in_array($uid,explode(',',$v))){ $lists[] = $k; } } return $lists; } //獲取用戶已删除的列表 public function getDelList($uid){ $this->uid = $uid; $this->buildKey(); // var_dump($this->hGet($this->delListKey,$this->uid));die; return trim($this->hGet($this->delListKey,$this->uid),','); }}
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!