(代码结构3)项目redis key 管理

embedded/2024/9/23 5:15:27/

场景:项目中到处可见的key,没有统一管理,极其难维护。大佬同事实现了一个。

代码

在这里插入图片描述
如图,Redis.php 是对redis的二次封装,对redis key模块的强制校验,FillerKeyTrait.php 是对filler模块的key获取。主要原理是:对redis二次封装,统一调用入口,对key的获取通过 方法获取,对key根据配置的MODULES进行校验。
一.对redis二次封装
Redis.php代码

php"><?phpnamespace common\cache;use common\cache\keys\FillerKeyTrait;
use common\tools\Dingtalk;
use yii\helpers\Inflector;
use yii\redis\Connection;class Redis extends Connection
{const YEAR = 60*60*24*365;const DAY = 60*60*24;const MONTH = 60*60*24*31;use FillerKeyTrait;const checkCommands = ['set','setex','setnx','getset','hmset','hset','hsetnx','lset','psetex','setbit','incr','incrby','zincrby','incrbyfloat','hincrby','hincrbyfloat','decr','decrby','lpush','lpushx','rpush','rpushx','lset','linsert','sadd','zadd',];//均已空数组结尾const MODULES = ['filler' => [],];public function __call($name, $params){$redisCommand = strtoupper(Inflector::camel2words($name, false));if (in_array($redisCommand, self::checkCommands)) {if (!$this->checkKey($params[0])) {return;}}return parent::__call($name, $params);}public function get($key){$value = parent::get($key);$result = unserialize($value);
//        if (!empty($value) && empty($result)) {
//            $result = $value;
//        }return $result;}public function set($key, $value, ...$options){if (!$this->checkKey($key)) {return;}$value = serialize($value);return parent::set($key, $value, $options);}public function setex($key, $seconds, $value){$value = serialize($value);return parent::setex($key, $seconds, $value);}public function setnx($key, $value){$value = serialize($value);return parent::setnx($key, $value);}public function hset($key, $field, $value){$value = serialize($value);return parent::hset($key, $field, $value);}public function hget($key, $field){$value = parent::hget($key, $field);$result = unserialize($value);return $result;}private function checkKey($key){try {//格式校验, 字母$arr = explode(':', $key);$count = count($arr);if ($count <= 2) {throw_info('缓存键名不合法');}if (strlen($key) > 64) {throw_info('缓存键名长度不能大于64位');}$modules = self::MODULES;foreach ($arr as $k => $v) {if (($k+1) == $count) {continue;}if (!isset($modules[$v])) {throw_info('缓存键名未配置');}$modules = $modules[$v];}return true;} catch (\Throwable $e) {if (YII_ENV != 'prod') {Dingtalk::sendMessageToRobot(SYSTEM_EXCEPTIONS, "{$key}缓存键名异常".$e->getMessage(), [GUOJUENENG_MOBILE]);}
//            throw_info('系统繁忙,缓存异常');return false;}}
}
二、通过train 解耦和通过方法动态组建key

FillerKey.php

php"><?phpnamespace common\cache\keys;trait FillerKeyTrait
{public static function getFiller($platformType, $platformId, $day = ''){if (empty($day)) {$day = date('ymd');}return 'filler:' . $day . $platformId . ':' . $platformType;}
}

$key = Redis::getFiller(19,20,‘2023-12-12 09:12:23’);
三、yii2 redis初始化类直接调用 common\framework\Redis 或者读取后重启一个redis引用

php">return [//common\framework\Redis 'class' => 'yii\redis\Connection','hostname'=>'xxxxxxxx','port' => 6379,'database' => 1,'password' => 'xxxxxx',
//    'password' => '',
];
php">$goodsRedis = $redis;
$goodsRedis['database'] = 4;
$goodsRedis['class'] = 'common\framework\Redis';

四、全局入口

php">if (!function_exists('get_cache')) {/*** 获取商品专用redis对象* @return \common\framework\Redis*/function get_cache(){return \Yii::$app->goodsRedis;}
}

http://www.ppmy.cn/embedded/30308.html

相关文章

SVM单类异常值检测

SVM是一种广泛使用的分类器&#xff0c;通常用于二分类或多分类问题。然而&#xff0c;在异常点检测的场景中&#xff0c;我们通常会将数据视为一个类别&#xff08;即正常数据点&#xff09;&#xff0c;并尝试找到那些与正常数据点显著不同的点&#xff08;即异常点&#xff…

python-pytorch官方示例Generating Names with a Character-Level RNN的部分理解0.5.03

pytorch官方示例Generating Names with a Character-Level RNN的部分理解 模型结构功能关键技术模型输入模型输出预测实现 模型结构 功能 输入一个类别名和一个英文字符&#xff0c;就可以自动生成这个类别&#xff0c;且以英文字符开始的姓名 关键技术 将字符进行one-hot编…

Spring Boot集成sitemapgen4j实现网站地图生成

1.什么是sitemapgen4j 是一个用于在Java中生成XML网站地图的库&#xff0c;比如生成网站的sitemap&#xff0c;如果超出了 5 万条需要写入另外一个 sitemap 当中&#xff0c;这个功能 sitemapgen4j 已经替我们实现了&#xff0c;无需担心。 sitemap 站点地图是网站管理员向搜索…

为何软件IT行业重视创新而不是稳定?

为何软件IT行业重视创新而不是稳定&#xff1f;用户为此受苦&#xff1a;用户体验差&#xff01; 彼得-蒂尔有一句名言&#xff1a;"竞争是失败者的事"。 如果没有必要&#xff0c;就不要把自己置于被迫竞争的境地。 我给年轻程序员的建议是&#xff0c;如果你想创…

【工作实践-11】关于uniapp切换账号登录失败问题

遇到问题&#xff1a;在使用uniapp写的程序中&#xff0c;第一次打开程序登录(账号密码正确)&#xff0c;调用登录接口&#xff0c;没有任何问题&#xff0c;正常登录&#xff1b;退出登陆后&#xff0c;输入不同的账号密码(账号密码均正确)&#xff0c;调用登录接口提示登陆失…

关于YOLO8学习(一)环境搭建,官方检测模型部署到手机

一&#xff0c;环境的搭建 环境 win10 python 3.11 cmake pytorch pycharm 过程 首先安装好一个pycharm&#xff0c;这里就不一一叙述了。 其次&#xff0c;选择好一个python版本&#xff0c;是关键所在。有些YOLO的版本&#xff0c;并不支持很高的python版本&#xff0c;博…

Apache Kafka知识点表格总结

之前的项目中用到RabbitMQ比较多&#xff0c;也有用到RocketMQ,&#xff0c;虽然项目中没有用到过Kafka&#xff0c;不过自己在空闲时间学习过,而且在面试中也会问到&#xff0c;因为还是有不少公司用到Kafka&#xff0c;所以做个总结&#xff0c;一方面是做为面试参考&#xf…

关于下载上传的sheetjs

一、背景 需要讲后端返回来的表格数据通过前端设置导出其中某些字段&#xff0c;而且得是xlsx格式的。 那就考虑使用控件SheetJS。如果是几年前&#xff0c;一般来说&#xff0c;保存excel的文件都是后端去处理&#xff0c;处理完成给前端一个接口&#xff0c;前端调用了打开…