<?php
|
|
namespace RedisOper;
|
|
include_once "/Common/CommFunc.php";
|
include_once "/Common/Logging.php";
|
|
class RedisPool
|
{
|
// 注:由于php特殊原因,单次请求结束后会释放所有内存及链接,window系统下暂时无法处理链接池,故暂时只处理单次请求仅创建一个链接
|
private static $redis = null;
|
|
public static function Get($pconnet = false)
|
{
|
if (self::$redis) {
|
// \Logging\LogInfo("get static Redis ok! ");
|
return self::$redis;
|
}
|
|
if (!\CommFunc\GetConfig("Redis", "Enable", $Enable) || !$Enable) {
|
// \Logging\LogInfo("不启用redis!");
|
return;
|
}
|
|
if (
|
!\CommFunc\GetConfig("Redis", "Host", $Host) || !\CommFunc\GetConfig("Redis", "Port", $Port) ||
|
!\CommFunc\GetConfig("Redis", "Psw", $Psw) || !\CommFunc\GetConfig("Redis", "Select", $Select)
|
) {
|
return;
|
}
|
|
$rd = new \Redis();
|
if ($pconnet) {
|
$cntOK = $rd->pconnect($Host, $Port, 0);
|
} else {
|
$cntOK = $rd->connect($Host, $Port);
|
}
|
if (!$cntOK) {
|
\Logging\LogError("Redis connect error! " . $Host . ":" . $Port);
|
return;
|
}
|
if ($Psw != "") {
|
$psw = \Commfunc\GetDecodePsw($Psw);
|
$authOK = $rd->auth($psw);
|
if (!$authOK) {
|
\Logging\LogError("Redis auth error! " . $Host . ":" . $Port);
|
return;
|
}
|
}
|
$rd->select($Select);
|
\Logging\LogInfo("Redis connect ok: " . $Host . ":" . $Port);
|
self::$redis = $rd;
|
return self::$redis;
|
}
|
|
public static function Close($redis)
|
{
|
//归还,暂不处理
|
}
|
}
|
|
/**
|
* 获取DB数据对应rediskey
|
*/
|
function GetDBRedisKey($dbName, $collectionName, $find)
|
{
|
$redisKey = $dbName . ":" . $collectionName;
|
foreach ($find as $value) {
|
$redisKey .= ":" . $value;
|
}
|
return $redisKey;
|
}
|
|
/**
|
* 获取GM工具功能数据对应rediskey,传入不定数量的参数,自定义
|
*/
|
function GetFCRedisKey()
|
{
|
if (!func_num_args()) {
|
return "";
|
}
|
$redisKey = "FC";
|
foreach (func_get_args() as $value) {
|
$redisKey .= ":" . $value;
|
}
|
return $redisKey;
|
}
|
|
function Exists($redisKey)
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return;
|
}
|
$ret = $redis->exists($redisKey);
|
RedisPool::Close($redis);
|
\Logging\LogInfo("Redis Exists redisKey=" . $redisKey . " ret:" . $ret);
|
return $ret;
|
}
|
|
function DelKey($redisKey)
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return;
|
}
|
$ret = $redis->delete($redisKey);
|
RedisPool::Close($redis);
|
\Logging\LogInfo("Redis DelKey redisKey=" . $redisKey . " ret:" . $ret);
|
return true;
|
}
|
|
function GetHashObj($redisKey, &$retArray)
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return;
|
}
|
$retArray = $redis->hGetAll($redisKey);
|
foreach ($retArray as $key => $value) {
|
$jd = json_decode($value, true);
|
if (is_array($jd)) {
|
$retArray[$key] = $jd;
|
}
|
}
|
RedisPool::Close($redis);
|
if (!$retArray) {
|
\Logging\LogInfo("Redis GetHashObj not exist! redisKey=" . $redisKey);
|
return;
|
}
|
return true;
|
}
|
|
function SetHashObj($redisKey, $objArray, $expire = 0)
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return;
|
}
|
foreach ($objArray as $key => $value) {
|
if (is_array($value)) {
|
$objArray[$key] = \CommFunc\MyJson_encode($value);
|
}
|
}
|
$ret = $redis->hMSet($redisKey, $objArray);
|
if ($expire > 0) {
|
$redis->expireAt($redisKey, time() + $expire);
|
}
|
RedisPool::Close($redis);
|
if (!$ret) {
|
// 设置失败
|
return;
|
}
|
return true;
|
}
|
|
function GetHashValues($redisKey, $keys, &$retArray)
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return;
|
}
|
$retArray = $redis->hMget($redisKey, $keys);
|
RedisPool::Close($redis);
|
if (!$retArray) {
|
\Logging\LogInfo("Redis GetHashValues not exist! redisKey=" . $redisKey);
|
return;
|
}
|
return true;
|
}
|
|
function SetHashValues($redisKey, $setArray, $expire = 0)
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return;
|
}
|
foreach ($setArray as $key => $value) {
|
if (is_array($value)) {
|
$setArray[$key] = \CommFunc\MyJson_encode($value);
|
}
|
}
|
$ret = $redis->hMSet($redisKey, $setArray);
|
if ($expire > 0) {
|
$redis->expireAt($redisKey, time() + $expire);
|
}
|
RedisPool::Close($redis);
|
if (!$ret) {
|
// 设置失败
|
return;
|
}
|
return true;
|
}
|
|
function ListPush($key, $LR, $value)
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return 0;
|
}
|
if (is_array($value)) {
|
$value = \CommFunc\MyJson_encode($value);
|
}
|
if ($LR == "R") {
|
$ret = $redis->rPush($key, $value);
|
} else {
|
$ret = $redis->lPush($key, $value);
|
}
|
RedisPool::Close($redis);
|
if (!$ret) {
|
return 0;
|
}
|
return $ret;
|
}
|
|
function ListPop($key, &$ret, $LR = "R")
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return;
|
}
|
if ($LR == "R") {
|
$ret = $redis->rPop($key);
|
} else {
|
$ret = $redis->lPop($key);
|
}
|
$jd = json_decode($ret, true);
|
if (is_array($jd)) {
|
$ret = $jd;
|
}
|
RedisPool::Close($redis);
|
if (!$ret) {
|
return;
|
}
|
return true;
|
}
|
|
function ListRange($key, &$retArray, $start = 0, $stop = -1, $innerToArray = true)
|
{
|
$redis = RedisPool::Get();
|
if (!$redis) {
|
return;
|
}
|
$retArray = $redis->lrange($key, $start, $stop);
|
if ($innerToArray) {
|
foreach ($retArray as $key => $value) {
|
$jd = json_decode($value, true);
|
if (is_array($jd)) {
|
$retArray[$key] = $jd;
|
}
|
}
|
}
|
RedisPool::Close($redis);
|
return true;
|
}
|
|
// function GetKeysByPattern($pattern, $count = 1000)
|
// {
|
// $redis = RedisPool::Get();
|
// if (!$redis) {
|
// return;
|
// }
|
|
// $keysList = [];
|
// $it = 0; // 第一次迭代使用 0 作为游标
|
// while (true) {
|
// $keys = $redis->scan($it, $pattern, $count);
|
// if (isset($keys)) {
|
// // 迭代中可能并发更新数据,所有需要合并覆盖
|
// $keysList = array_merge($keysList, $keys);
|
// }
|
// if ($it === 0) { //返回了游标 0 , 这表示迭代已经结束
|
// break;
|
// }
|
// }
|
// // 以 0 作为游标开始一次新的迭代, 一直调用 SCAN 命令, 直到命令返回游标 0 , 我们称这个过程为一次完整遍历(full iteration)。
|
// RedisPool::Close($redis);
|
// // scan 的 key 可能重复,去重
|
// $keysList = array_unique($keysList);
|
// return $keysList;
|
// }
|