本文介绍PHP操作redis string类型 hash类型 以及list类型操作。封装代码如下
/**
* @author jinanav 2020年1月13日16:40:38
* @desc 自定义Redis服务类
*/
class RedisService{
//redis操作对象
private static $redis = null;
//全局用户token
private static $token = null;
//全局user信息
private static $user = null;
//前缀
private static $fix = "token_";
/**
* 初始化
*/
public function __construct(){
if(empty(self::$redis)){
self::$redis = new \Redis();
self::$redis->connect("127.0.0.1",6379,5);
self::$redis->auth('7b857da97cf6d95d5b824c4c42c9a9bb');
self::$redis->select(3);
}
//这里用到tp5.1的门面
//!empty(Request::header('token')) && self::$token = Request::header('token');
}
/**
* 初始化
*/
public static function init(){
new static();
}
/**
* 根据token获取当前登录用户
* @author jinanav 2020年1月13日16:40:57
* @return array | string | null
*/
public static function getUser($key = null){
if(!isset(self::$user[$key]) || empty(self::$user[$key])){
if (empty(self::$token)) return null;
self::$user = self::$redis->get(self::$token);
self::$user = empty(self::$user) ? [] : json_decode(self::$user,true);
}
return empty($key) ? self::$user : self::$user[$key] ?? null;
}
/**
* 设置用户登录信息
* @author jinanav 2020年1月13日17:47:15
* @param array $user 用户信息
* @param int $timeout 失效时间
* @return array|bool
*/
public static function setUser($userInfo,$timeout = 86400 * 7){
empty(self::$token) && self::$token = self::createToken($userInfo['id'] ?? 0);
self::$user = array_merge(self::getUser(),$userInfo);
return self::$redis->set(self::$token,json_encode(self::$user),$timeout);
}
/**
* 注销用户
* @author jinanav 2020年1月17日15:53:11
* @return bool
*/
public static function delUser($token = null){
return self::$redis->del(empty($token) ? self::$token : $token);
}
/**
* 根据用户uid生成token
* @author jinanav 2020年1月13日17:47:15
* @param int $string 用户识别字符串
* @retrun string;
*/
public static function createToken($string){
return self::$fix.strtoupper(md5($string.time().rand(100,999)));
}
/**
* 统计key长度,默认获取当前在线用户
* @author jinanav 2020年1月13日19:45:03
* @return int
*/
public static function onLineNumber($key = null){
empty($key) && $key = self::$fix."*";
return count(self::$redis->keys($key));
}
/**
* 校验是否需要登录
* @author jinanav 2020年1月19日14:56:29
* @param bool $needLogin 是否需要登录
* @return string Json
*/
public static function loginStatus($needLogin = false){
return self::existKey() ? true : $needLogin ? ajaxReturn(302,'请先到登录...') : false;
}
/**
* 查询当前token是否存在
* @author jinanav 2020年1月19日14:59:26
* @return bool
*/
public static function existKey($key = null){
return self::$redis->exists(!empty($key) ? $key : self::$token);
}
/**
* 日志数据写入队列
* @author jinanav 2020年1月17日15:05:06
* @param array $data 写入队列的消息
* @param string $queue 队列key名称 与日志表名相关联
* @return boolean
*/
public static function enqueue($data,$queue = 'api_queue'){
//MQ过长不予写入,建议自定义长度
if(self::queueLen($queue) < 8000 && !empty($data)){
return self::$redis->lPush($queue,json_encode($data));
}
return false;
}
/**
* 读取队列数据
* @author jinanav 2020年1月17日15:11:44
* @param string $queue 队列key名称
* @return array
*/
public static function dequeue($queue = 'api_queue'){
$info = self::$redis->rPop($queue);
return !empty($info) ? json_decode($info,true) : [];
}
/**
* 获取当前token
* @author jinanav 2020年3月6日15:35:44
* @return string|null
*/
public static function getToken(){
return self::existKey() ? self::$token : null;
}
/**
* 设置当前token
* @author jinanav 2020年3月6日15:35:44
* @return string
*/
public static function setToken($token){
self::$token = $token;
}
/**
* 返回当前redis操作对象
* @author jinanav 2020年4月21日15:32:57
* @return \Redis
*/
public static function op(){
return self::$redis;
}
/**
* 删除键
* @author jinanav 2020年6月4日00:13:12
* @return bool
*/
public static function remove($key){
return self::$redis->del($key);
}
/**
* 查看指定键的生存时间
* @author jinanav 2020年6月4日00:13:12
* @return bool
*/
public static function ttl($key = null){
return self::$redis->ttl(empty($key) ? self::$token : $key);
}
/**
* 设置指定键的过期时间
* @author jinanav 2020年6月29日00:29:25
* @return bool
*/
public static function expire($timeout = 600,$key = null){
return self::$redis->expire(empty($key) ? self::$token : $key,$timeout);
}
/**
* 写新值,并返回旧值
* @author jinanav 2020年6月29日00:29:25
* @return bool
*/
public static function getSet($key,$value){
return self::$redis->GetSet(empty($key) ? self::$token : $key,$value);
}
/**
* 将value绑定到key,并重置过期时间
* @author jinanav 2020年6月29日00:29:25
* @return bool
*/
public static function setex($key,$value,$timeOut){
return self::$redis->setex(empty($key) ? self::$token : $key,$timeOut,$value);
}
/**
* hash操作,设置hash
* @param string $key redis键
* @param string $hashKey 哈希键
* @param string $value 哈希值
* @return bool|int
*/
public static function hSet($key,$hashKey,$value){
return self::$redis->hSet($key,$hashKey,$value);
}
/**
* hash操作,设置hash
* @param string $key redis键
* @param string $hashKey 哈希键
* @return string | bool
*/
public static function hGet($key,$hashKey){
return self::$redis->hGet($key,$hashKey);
}
/**
* hash操作,判断hashKey是否存在
* @param string $key redis键
* @param string $hashKey 哈希键
* @return bool
*/
public static function hExists($key,$hashKey){
return self::$redis->hExists($key,$hashKey);
}
/**
* 删除指定的哈希key
* @param string $key redis键
* @param string $hashKey 哈希键
* @return bool
*/
public static function hDel($key,$hashKey){
return self::$redis->hDel($key,$hashKey);
}
/**
* 同时设置某个哈希表的多个字段值
* @param string $key redis键
* @param array $hashKey 键值对
* @return bool
*/
public static function hMset($key,$hashKey){
return self::$redis->hMset($key,$hashKey);
}
/**
* 同时获得哈希表中多个字段值
* @param string $key redis键
* @param array $hashKey 键值对
* @return array
*/
public static function hMget($key,$hashKeys){
return self::$redis->hMget($key,$hashKeys);
}
/**
* 获取完整的哈希表
* @param string $key redis键
* @return array
*/
public static function hGetAll($key){
return self::$redis->hGetAll($key);
}
/**
* 获取指定哈希表的所有字段
* @param string $key redis键
* @return array
*/
public static function hKeys($key){
return self::$redis->hKeys($key);
}
/**
* 获取指定哈希表的所有值
* @param string $key redis键
* @return array
*/
public static function hVals($key){
return self::$redis->hVals($key);
}
/**
* 获取哈希表长度
* @param string $key redis键
* @return int
*/
public static function hLen($key){
return self::$redis->hLen($key);
}
/**
* 给指定字段添加数值
* @param string$key 哈希表名
* @param string $hashKey 哈希字段
* @param int|float $number 获取哈希表长度
* @return int
*/
public static function hIncrBy($key,$hashKey,$number){
return self::$redis->hIncrBy($key,$hashKey,$number);
}
/**
* 列表头部插入一个值,当列表不存在时自动创建一个列表,$listKey为列表名
* @param string $listKey 列表名
* @param string $value 列表值
* @return int
*/
public function lpush($listKey,$value){
return self::$redis->lpush($listKey,$value);
}
/**
* 列表尾部插入一个值,当列表不存在时自动创建一个列表,$listKey为列表名
* @param string $listKey 列表名
* @param string $value 列表值
* @return int
*/
public function rpush($listKey,$value){
return self::$redis->rpush($listKey,$value);
}
/**
* 将一个插入已存在的列表头部,列表不存在时操作无效
* @param string $listKey 列表名
* @param string $value 列表值
* @return int
*/
public static function rPushx($listKey,$value){
return self::$redis->rPushx($listKey,$value);
}
/**
* 删除并返回列表的第一个元素
* @param string $listKey 列表名
* @return string
*/
public static function lPop($listKey){
return self::$redis->lPop($listKey);
}
/**
* 删除并返回列表的最后一个元素
* @param string $listKey 列表名
* @return string
*/
public static function rPop($listKey){
return self::$redis->rPop($listKey);
}
/**
* 删除并返回列表的第一个元素 堵塞 返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值
* @param string $listKey 列表名
* @param int $timeOut 过期时间
* @return array
*/
public static function blPop($listKey,$timeOut){
return self::$redis->blPop($listKey,$timeOut);
}
/**
* 删除并返回列表的最后一个元素 堵塞 返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值
* @param string $listKey 列表名
* @param int $timeOut 过期时间
* @return array
*/
public static function brPop($listKey,$timeOut){
return self::$redis->brPop($listKey,$timeOut);
}
/**
* 将列表from的末端元素移动到列表to的头部
* @param string $from 源列表
* @param string $to 目标列表
* @return string
*/
public static function rpoplpush($from,$to){
return self::$redis->rpoplpush($from,$to);
}
/**
* 将列表from的末端元素移动到列表to的头部,并设置堵塞超时时间
* @param string $from 源列表
* @param string $to 目标列表
* @param int $timeOut 超时时间
* @return string
*/
public static function brpoplpush($from,$to,$timeOut){
return self::$redis->brpoplpush($from,$to,$timeOut);
}
/**
* 返回列表长度
* @author jinanav 2020年7月12日12:49:45
* @param string $listKey 列表名称
* @return int
*/
public static function lLen($listKey){
return self::$redis->lLen($listKey);
}
/**
* 通过索引下标获取值
* @author jinanav 2020年7月12日12:51:21
* @param string $listKey 列表名称
* @param int $index 索引位置
* @return int
*/
public static function lindex($listKey,$index){
return self::$redis->lindex($listKey,$index);
}
/**
* 通过索引下标获设置值
* @author jinanav 2020年7月12日12:52:32
* @param string $listKey 列表名称
* @param int $index 索引位置
* @param int $value 值
* @return bool
*/
public static function lSet($listKey,$index,$value){
return self::$redis->lSet($listKey,$index,$value);
}
/**
* 在列表指定元素之前/之后插入元素 若指定元素不在列表中,或列表不存在时,不执行任何操作
* Redis::AFTER插入元素后面 Redis::BEFORE插入元素前面
* @author jinanav 2020年7月12日12:52:32
* @param string $listKey 列表名称
* @param string $perch 位置 在之前或之后
* @param int $pivot 指定元素
* @param int $value 值
* @return bool 插入成功返回插入后列表元素个数,若列表不存在返回0,若不是列表返回false
*/
public static function lInsert($listKey,$pivot,$value,$perch = \Redis::AFTER){
return self::$redis->lInsert($listKey, $perch, $pivot, $value);
}
/**
* 根据第三个参数(count),删除掉相对的value
* Redis::AFTER插入元素后面 Redis::BEFORE插入元素前面
* @author jinanav 2020年7月12日13:55:34
* @param string $listKey 列表名称
* @param string $value 值
* @param int $count 数量 //count > 0 : 从表头开始向表尾搜索,移除与value相等的元素,数量为count。//count < 0 : 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。//count = 0 : 移除表中所有与value相等的值。
* @return int 返回实际删除元素个数
*/
public static function lrem($listKey,$value,$count){
return self::$redis->lrem($listKey, $value,$count);
}
/**
* 获取存储的数据并输出列表下标$start,长度为$end的数据 类似mysql limit
* @author jinanav 2020年7月12日14:05:34
* @param string $listKey 列表
* @param string $start 索引位置
* @param string $end 读取长度
* @return array
*/
public static function lRange($listKey,$start=0,$end=10){
return self::$redis->lRange($listKey,$start,$end);
}
}
RedisService::init();
RedisService::setUser(['id'=>20,'age'=>18]);
echo "用户数据
";
var_dump(RedisService::getUser());
echo '
';
echo "token:
";
var_dump(RedisService::getToken());
echo '
';
echo "在线用户数:
";
var_dump(RedisService::onLineNumber());