/** * 保留每个用户最新的n个最近联系人,到redis中 */ function storeRecentMembers($data) { if ($data['type'] == \Config\St\Storekey::BROADCAST_MSG_TYPE) { return false; } $chatList = Api\Model\Muser::getChatListFromChatid($data['chatid']); foreach ($chatList as $username) { RedisModel::zAdd('webChat', $username . \Config\St\Storekey::RECENT_MEMBERS, $data['time'], $data['chatid'], 2592000); //删除一个月前的最近联系人 RedisModel::zRemRangeByScore('webChat', $username . \Config\St\Storekey::RECENT_MEMBERS, 0, $data['time'] - 2592000); } }
/** * 获取所有在线用户列表 clientid=>name */ public static function getOnlineUsers() { $key = \Config\St\Storekey::USER_ONLINE_LIST; $tryCount = 3; while ($tryCount--) { $clientList = \Vendors\Redis\RedisModel::hashGet(self::$redisServer, $key); if (false === $clientList) { $clientList = array(); } else { return $clientList; } } return $clientList; }
/** * 获得队列大小 */ public static function lSize($paramArr) { $options = array('serverName' => '', 'key' => false); if (is_array($paramArr)) { $options = array_merge($options, $paramArr); } extract($options); if (empty($key) || empty($serverName)) { return false; } $redis = RedisModel::getLink($serverName); $data = 0; $data = $redis->lSize($key); return $data; }
<?php //test文件,压入数据的时候可以参考 use Workerman\Autoloader; require_once '../../../Workerman/Autoloader.php'; Autoloader::setRootPath("../../"); //消息队列,向队列中rpush //require 'Redis.php'; //use \Vendors\RedisQuene\Redisq; use Vendors\Redis\RedisModel; //RedisModel::set('webChat', 'aaa', 'bbbbgggggg'); // RedisModel::hashSet('webChat', 'aaa', 'bbbbgggggg', 'dddd'); // RedisModel::hashSet('webChat', 'USER_ONLINE_LIST', 'bbbbggg', 'dddd'); // $res = RedisModel::hashGet('webChat', 'aaa'); // var_dump($res);die; $res = RedisModel::hashDel('webChat', 'wangjx:unread:msg', 'bbb'); var_dump($res); die; if (null === $res) { var_dump($res); } else { var_dump(2222222); } die; $a = substr(str_shuffle("qwertyuiopasdfghjklzxcvbnm"), 0, 4); $b = substr(str_shuffle("qwertyuiopasdfghjklzxcvbnm"), 0, 4); $messageVal = array('fromuser' => 'cuihb', 'touser' => 'xieyx', 'message' => $a . $b, 'time' => time()); Redisq::rpush(array('serverName' => 'webChat', 'key' => 'chat:message:quene', 'value' => serialize($messageVal))); $long = Redisq::getSize(array('serverName' => 'webChat', 'key' => 'chat:message:quene')); var_dump($long); $arr = Redisq::range(array('serverName' => 'webChat', 'key' => 'chat:message:quene', 'offset' => 0, 'len' => -1));
/** * 删除最近联系人 * 给出一个用户名(用户名组)和一个chatid,将属于该用户名下最近联系人为chatid的都删除掉(踢出群) */ public static function remRecentMembers($chatid, $userList) { if (!is_array($userList)) { return false; } foreach ($userList as $userid) { RedisModel::zRem(self::$redisServer, $userid . \Config\St\Storekey::RECENT_MEMBERS, $chatid); } return true; }
/** * 不允许多用户登录 * 剔除存储用户 */ public static function notAllowMoreClient($clientList, $clientName) { if (is_array($clientList)) { $unsetKey = array_keys($clientList, $clientName); if ($unsetKey) { Gateway::sendToAll(json_encode(array('type' => 'error', 'info' => 'loginconflict', 'msg' => '您已在另一客户端登陆')), $unsetKey); foreach ($unsetKey as $unkey) { unset($clientList[$unkey]); //下线用户 Gateway::closeClient($unkey); //删除存储用户 RedisModel::hashDel('webChat', Storekey::USER_ONLINE_LIST, $unkey); } } } return; }
/** * 用户某路对话的离线消息数加 num 个 * 每个用户有一个离线hash,hash中的键值分别是每路聊天对应的消息数量 */ public static function addUnreadMsg($username, $chatid, $partkey = '', $num = 1) { return RedisModel::hashIncrBy(self::$redisServer, $username . $partkey, $chatid, $num); }