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

devtools/2024/9/23 7:32:49/

场景:项目中到处可见的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/devtools/31596.html

相关文章

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…

Q1季度家用雾化器行业线上市场销售数据分析

随着人们健康意识的提高&#xff0c;越来越多的家庭开始关注全家人呼吸系统的健康&#xff0c;尤其是中老年人和儿童群体。因此&#xff0c;家用雾化器作为一种方便、有效的家庭保健设备&#xff0c;其市场需求也在不断增长。 根据鲸参谋数据显示&#xff0c;今年Q1季度雾化器…

模版进阶篇章

非类型模版参数 回顾&#xff1a;函数模版 &#xff1a;不用传类型&#xff0c;编译器会自动推导&#xff0c;和普通的函数调用一样 #include<iostream> using namespace std; template<typename T>// T是类型 bool Less(T a, T b)// a,b是T实例化的的对象 {retu…

ResponseHttp

文章目录 HTTP响应详解使用抓包查看响应报文协议内容 Response对象Response继承体系Response设置响应数据功能介绍Response请求重定向概述实现方式重定向特点 请求重定向和请求转发比较路径问题Response响应字符数据步骤实现 Response响应字节数据步骤实现 HTTP响应详解 使用抓…

node.js中path模块-路径处理,语法讲解

node中的path 模块是node.js的基础语法&#xff0c;实际开发中&#xff0c;我们通过使用 path 模块来得到绝对路径&#xff0c;避免因为相对路径带来的找不到资源的问题。 具体来说&#xff1a;Node.js 执行 JS 代码时&#xff0c;代码中的路径都是以终端所在文件夹出发查找相…

C语言 | Leetcode C语言题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; int uniquePaths(int m, int n) {long long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return ans; }

生成对抗网络(GAN)入门

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、理论基础 1.什么是GAN GAN&#xff08…

发卡授权盗u系统源码ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c; 搭建系统TGaqxm01&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.s…