Redis放在控制器还是模型层?

php中文网
发布: 2016-06-06 20:13:04
原创
1293人浏览过

在实际项目中,redis大部分情况下应该放在控制器还是模型?

目前只做过两种方案:

控制器中:

大致的逻辑如下(不要纠结于方法名称):

<code class="php">class UserController extends Controller {

    public function index()
    {
        $userRedis = new UserRedis();
        
        if (!$userInfo = $userRedis->find(['id' => 1000])) {
            $user = new User();
            $userInfo = $user->find(['id' => 1000]);
            
            $userRedis->save($userInfo);
        }
        
        return $userInfo;
    }

}</code>
登录后复制

在这种情况下,模型还是独立存在的,数据库模型依然直接读取数据库,Redis模型读取Redis,两者互不影响,控制器从中协调。

模型:

<code class="php">class UserModel extends Model
{
    public function find($conditions)
    {
         $userRedis = new UserRedis();
          
         if (!$userInfo = $userRedis->find($conditions)) {
            $userInfo = $this->find($conditions);            
            $userRedis->save($userInfo);
        }
        
        return $userInfo;
    }
}</code>
登录后复制

在这种情况下,控制器只需要调用一次接口方案,而无需关心内部实现,整个数据逻辑交给模型来处理。

在项目中实际用过Redis的朋友路过顺便分享一下自己的经验,大家集思广益一下。^_^

回复内容:

在实际项目中,redis大部分情况下应该放在控制器还是模型?

目前只做过两种方案:

控制器中:

大致的逻辑如下(不要纠结于方法名称):

<code class="php">class UserController extends Controller {

    public function index()
    {
        $userRedis = new UserRedis();
        
        if (!$userInfo = $userRedis->find(['id' => 1000])) {
            $user = new User();
            $userInfo = $user->find(['id' => 1000]);
            
            $userRedis->save($userInfo);
        }
        
        return $userInfo;
    }

}</code>
登录后复制

在这种情况下,模型还是独立存在的,数据库模型依然直接读取数据库,Redis模型读取Redis,两者互不影响,控制器从中协调。

模型:

<code class="php">class UserModel extends Model
{
    public function find($conditions)
    {
         $userRedis = new UserRedis();
          
         if (!$userInfo = $userRedis->find($conditions)) {
            $userInfo = $this->find($conditions);            
            $userRedis->save($userInfo);
        }
        
        return $userInfo;
    }
}</code>
登录后复制

在这种情况下,控制器只需要调用一次接口方案,而无需关心内部实现,整个数据逻辑交给模型来处理。

在项目中实际用过Redis的朋友路过顺便分享一下自己的经验,大家集思广益一下。^_^

优先模型层个人觉得似乎是比较好一点的方法,不论是维护还是逻辑

一般都放数据模型层吧

一般还是说放到模型层,然后封装一个方法,业务层在调用的时候,直接去调取方法就好了,而不用想着再去做缓存的事情。因为缓存在模型层都帮忙给做了。

MyBB 国外最好的免费论坛
MyBB 国外最好的免费论坛

MyBB的全称是mybboard,是一个基于PHP+MySQL搭建,功能强大,高效的开源论坛系统。 MyBB 使用了标准的论坛结构和模式,所以您的用户可以在您的论坛获得良好的用户体验。用户可以通过用户控制面板来自定义他们访问论坛的方式或者自定义他们想看到的论坛的内容,他们还可以方便地发表和答复一个主题并且标记与他们有关的主题。论坛管理员和版主可以使用MyBB的内置编辑器和版主工具等功能,控制并维

MyBB 国外最好的免费论坛 95
查看详情 MyBB 国外最好的免费论坛

只要跟数据读写有关的,还是放模型层比较合适

是我我就放模型层了,控制层控制逻辑流程和返回响应,逻辑复杂了看上去不会乱

放 Model 层。

原则:尽量屏蔽具体存储介质的差异。

Mysql、redis 对于项目都只是存储数据的,在代码里面应该不要钱解决存哪,提供统一的调用方式, UserMysql.find()UserRedis.find();

或者
User.find(),
User.findFromRedis() 默认调用从 mysql 读取,redis 操作折提供其他的函数

这个也是 ORM 的思想。

这取决于你的Model是否就等于数据库。
因为从你的$this->find来看,似乎是直接把Model的$this当做了数据库?
有两种选择:

  1. 不要把Model本身直接定义为数据库,而在Model里用redis和db类分别操作。如果redis和db里的操作都很少很简单,可以选择这样。

  2. 把Model定位为数据操作层,叫UserDbModel(对应你现在的UserModel),再定义另一个Model叫UserRedisModel(对应你现在的$userRedis),让两者地位平等,同时在Model层上加一层Logic层,处理缓存与数据库的关系,Controller变为只能调用Logic层。这种方式是我现在在用的,对复杂的逻辑而言可以显得更清晰。

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号