Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat:多站点策略缓存问题:使用数据库连接和表名作为缓存KEY #46

Closed
wants to merge 2 commits into from

Conversation

Tinywan
Copy link
Member

@Tinywan Tinywan commented May 21, 2024

No description provided.

@hsluoyz
Copy link
Member

hsluoyz commented May 21, 2024

@leeqvip

Copy link
Member

@leeqvip leeqvip left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

除了使用链式调用cache外,
建议另外一种实现,采用 模型事件 ,来触发缓存,参考 Laravel-authz 的模型观察者。
然后使用 缓存 ,可以配置缓存的store

public $cacheKey;

/** 设置缓存key过期时间 @var int */
public $cacheExpire;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这些属性建议改成:protected

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已修改

src/model/Rule.php Outdated Show resolved Hide resolved
$rows = $this->model->cache('tauthz')->field(['ptype', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5'])->select()->toArray();
if($this->model->cacheEnabled){
$_cacheKey = $this->model->getConnection().':'.$this->model->cacheKey;
$this->model = $this->model->cache($_cacheKey,$this->model->cacheExpire);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

关于缓存的key还是建议直接读取配置,不需要拼接connection,默认这个属性也是空的
多站点配置不同缓存key就行了,更灵活。不必和connection绑死

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

默认的connection 不是空的呀!就是当前数据库连接名称。我这边有200多个站点配置不同key也不现实呀

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

实际业务场景就是需要要拼接connection 。应为是Saas部署,每个Saas都有不同数据库

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getConnection() 取的是配置文件中的连接标识,并不是数据库连接地址、库名称之类的,你可以试下,默认空,执行的才会取default的配置。
不会配200个连接标识,配置的是env的连接地址等。
之所以推荐走模型事件,就是解耦,缓存也更灵活。

$rows = $this->model->cache('tauthz')->field(['ptype', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5'])->select()->toArray();
if($this->model->cacheEnabled){
$_cacheKey = $this->model->getConnection().':'.$this->model->cacheKey;
$this->model = $this->model->cache($_cacheKey,$this->model->cacheExpire);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getConnection() 取的是配置文件中的连接标识,并不是数据库连接地址、库名称之类的,你可以试下,默认空,执行的才会取default的配置。
不会配200个连接标识,配置的是env的连接地址等。
之所以推荐走模型事件,就是解耦,缓存也更灵活。

@Dobmod
Copy link
Member

Dobmod commented Aug 23, 2024

@Tinywan 这次的更新PR #47 ,应该满足了业务需求。
通过继承 tauthz\cache\CacheHandler 可以实现自定义缓存策略, 来达到多站点配置不同缓存key的目的。
另外,数据库的缓存类型可以通过配置config/database.php中的cache_store来制定,使得缓存可以用redis或文件的方式被存储。就像Cache::store()函数一样。也许你可以更新think-authz尝试一下。

@Tinywan
Copy link
Member Author

Tinywan commented Aug 24, 2024

@Dobmod 谢谢

@Tinywan Tinywan closed this Aug 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants