公司的客服系统是用 Yii 开发的,权限系统是基于 Yii CDbAuthManager 开发的,随着权限项目的增加和权限组以及人员的增多,导致加入页面的时候打开很慢,因为没进入一个页面会去检查一下该用户对于该操作的权限。下面是用XHProf查看的结果部分截图,会发现CDbAuthManager::checkAccess 和CDbAuthManager::checkAccessRecursive 等CDbAuthManager 方法会调用很多次,而 CDbAuthManage 是基于数据库,所以每次调用还要去进行数据库的查询,这样难免会给性能带来瓶颈。(该图只要关注第一和第二列就可以了,其他列是优化过的结果且本机的测试数据库)。 利用 Redis 加速 Yii CDbAuthManager 再来看下CDbAuthManager::checkAccessRecursive这个方法的实现,这个方法会去递归的查询数据库来验证用户的授权项目。 protected function checkAccessRecursive($itemName, $userId, $params, $assignments) { if (($item = $this->getAuthItem($itemName)) === null) return false; Yii::trace('Checking permission "' . $item->getName() . '"', 'system.web.auth.CDbAuthManager'); if ($this->executeBizRule($item->getBizRule(), $params, $item->getData())) { if (in_array($itemName, $this->defaultRoles)) return true; if (isset($assignments[$itemName])) { $assignment = $assignments[$itemName]; if ($this->executeBizRule($assignment->getBizRule(), $params, $assignment->getData())) return true; } $parents = $this->db->createCommand() ->select('parent') ->from($this->itemChildTable) ->where('child=:name', array(':name' => $itemName)) ->queryColumn(); foreach ($parents as $parent) { if ($this->checkAccessRecursive($parent, $userId, $params, $assignments)) return true; } } return false; } CDbAuthManager的其他对授权项目的操作都是基于数据库的读写,具体源码实现:http://code.

阅读全文

redis 批量删除 KEY

$redis-cli KEYS 'message_new:*' | xargs redis-cli DEL 搞定! 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: redis 批量删除 KEY 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

阅读全文

redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了 memcached 这类 keyvalue 存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。目前国内新浪微博等一些都在用。 记录一下我的 redis 安装和配置过程,主要是 redis 在 linux 下的安装配置,phpredis 的安装,以及 Netbeans 中配置 phpredis 的代码自动完成。 下载最新的稳定版本 redis,解压编译安装: wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz tar zxvf redis-2.4.17.tar.gz cd redis-2.4.17/ make sudo make install 编译好的文件将被复制到了/usr/local/bin 下 mkdir -p /usr/local/bin cp -pf redis-server /usr/local/bin cp -pf redis-benchmark /usr/local/bin cp -pf redis-cli /usr/local/bin cp -pf redis-check-dump /usr/local/bin cp -pf redis-check-aof /usr/local/bin 将配置文件复制到 /etc 下面 sudo cp /usr/local/redis/redis.

阅读全文

作者的图片

Ryan是菜鸟 | LNMP技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京