swayok/alternative-laravel-cache
Composer 安装命令:
composer require swayok/alternative-laravel-cache
包简介
Replacements for Laravel's redis and file cache stores that properly implement tagging idea. Powered by cache pool implementations provided by http://www.php-cache.com/
README 文档
README
This is full-featured replacement for Laravel's Redis and file cache storages. All storages support proper tagging.
Cache pools provided by http://www.php-cache.com/ + I've added HierarchicalFilesystemCachePool based on code of
FilesystemCachePool provided by http://www.php-cache.com/. All classes in this lib are proxies between Laravel's
cache system and cache pools from http://www.php-cache.com/. I do not have any relation to php-cache.com and any cache pools there.
And in result I cannot fix or change anything to the way cache pools are working.
What is proper tagging?
For example, you have:
Cache::tags(['tag1', 'tag2'])->put('tag-test1', 'ok', 20);
How Laravel's native cache works with tags and Redis (Laravel 5.2):
Cache::tags(['tag1', 'tag2'])->get('tag-test1'); //< 'ok'
Cache::tags(['tag2', 'tag1'])->get('tag-test1'); //< null
Cache::tags(['tag1'])->get('tag-test1'); //< null
Cache::tags(['tag2'])->get('tag-test1'); //< null
Cache::get('tag-test1'); //< null
Cache::forget('tag-test1'); //< won't delete anything
Cache::tags(['tag1', 'tag2'])->forget('tag-test1'); //< deleted
Cache::tags(['tag2', 'tag1'])->forget('tag-test1'); //< won't delete anything
Cache::tags(['tag1'])->forget('tag-test1'); //< won't delete anything
Cache::tags(['tag2'])->forget('tag-test1'); //< won't delete anything
Cache::tags(['tag1'])->flush(); //< won't delete anything
Cache::tags(['tag2'])->flush(); //< won't delete anything
Cache::tags(['tag1', 'tag2'])->flush(); //< flushed
Cache::tags(['tag2', 'tag1'])->flush(); //< won't delete anything
If you think that this is correct behavior - go away, you don't need this lib.
I was quite confused when attempted to use Laravel's version of tagging. Laravel's version works like folders (hierarchical cache), but not like tags. I tried to understand for what purpose Laravel's tagging can be used and haven't found any. It's totally useless in almost any situation. Hopefully there are compatible drivers provided by http://www.php-cache.com/.
How it works with this lib:
Cache::tags(['tag1', 'tag2'])->get('tag-test1'); //< 'ok' - use Cache::get('tag-test1') instead
Cache::tags(['tag2', 'tag1'])->get('tag-test1'); //< 'ok' - use Cache::get('tag-test1') instead
Cache::tags(['tag1'])->get('tag-test1'); //< 'ok' - use Cache::get('tag-test1') instead
Cache::tags(['tag2'])->get('tag-test1'); //< 'ok' - use Cache::get('tag-test1') instead
Cache::get('tag-test1'); //< 'ok'
Cache::forget('tag-test1'); //< deleted
Cache::tags(['tag1', 'tag2'])->forget('tag-test1'); //< deleted - use Cache::forget('tag-test1') instead
Cache::tags(['tag2', 'tag1'])->forget('tag-test1'); //< deleted - use Cache::forget('tag-test1') instead
Cache::tags(['tag1'])->forget('tag-test1'); //< deleted - use Cache::forget('tag-test1') instead
Cache::tags(['tag2'])->forget('tag-test1'); //< deleted - use Cache::forget('tag-test1') instead
Cache::tags(['tag1'])->flush(); //< deleted all cache entries with tag 'tag1'
Cache::tags(['tag2'])->flush(); //< deleted all cache entries with tag 'tag2'
Cache::tags(['tag1', 'tag2'])->flush(); //< deleted all cache entries with tag 'tag1' or 'tag2'
Cache::tags(['tag2', 'tag1'])->flush(); //< deleted all cache entries with tag 'tag2' or 'tag1'
Note that tags here is like soft grouping for cache entries. This means that you do not need to specify tags to access/set/delete certain cache key. Cache key is the only thing you need to know to do this. Tags purpose is to give you a possibility to delete lots of cache entries with one line of code. Tags are very useful when you need to store lots of entries related to same group and delete all cache entries at once when something changes.
For example:
- You cache database records from
userstable in many places around you project tagging them withuserstag. - You cache database records from
orderstable tagging them with bothusersandorderstags. - Some user updates his data and this action invalidates all cache entries related to this user and
userstable. - You need to remove all cache entries related to
users(1 and 2) and you can do this just like this:Cache::tags(['users'])->flush();.
This way all cache entries created in 1 and 2 will be removed. And you won't need to know tags to access any cache entry by its key.
How to use it:
For Laravel 10+
Add to composer.json:
"require": {
"swayok/alternative-laravel-cache": "6.1.*"
}
For Laravel 5.4+
Add to composer.json:
"require": {
"swayok/alternative-laravel-cache": "5.4.*"
}
For Laravel 5.3
Add to composer.json:
"require": {
"swayok/alternative-laravel-cache": "5.3.*"
}
Declare ServiceProvider
For Laravel 5.6+
Package auto-discovery will work.
For Laravel < 5.6
Add to config/app.php:
$providers = [
\AlternativeLaravelCache\Provider\AlternativeCacheStoresServiceProvider::class,
]
Supported cache drivers
array- array cache with proper tagging, also supports hierarchical cache keys and locks;redis- redis cache with proper tagging, also supports hierarchical cache keys and locks;memcached- memcached cache with proper tagging, also supports hierarchical cache keys and locks;file- simple file-based cache with proper tagging and locks;hierarchical_file- hierarchical file-based cache with proper tagging and locks.
hierarchical_file and array drivers also support / instead of | so you can use /users/:uid/followers/:fid/likes
instead of |users|:uid|followers|:fid|likes as it better represents path in file system.
Pipe character | in cache key (hierarchical cache keys)
Pipe character | for array, redis, memcached and hierarchical_file drivers works as hierarchy separator. This means that
cache keys that contain | will work as hierarchy.
Details here: http://www.php-cache.com/en/latest/hierarchy/
// Put key with colons (treated as usual cache key)
Cache::put('cache-key:something:something-else', 'value', now()->addHours(6));
// Put key with pipes (treated as hierarchical cache key)
Cache::put('cache-key|something|something-else', 'value', now()->addHours(6));
// Get key with colons
Cache::get('cache-key:something:something-else');
"value"
// Get key with pipes
Cache::get('cache-key|something|something-else');
"value"
// Forget call (it will both remove the cache key called 'cache-key' and whole hierarchy)
Cache::forget('cache-key');
// Get key with colons
Cache::get('cache-key:something:something-else');
"value"
// Get key with pipes
Cache::get('cache-key|something|something-else');
null
Slash character / in cache key
Slash character / for hierarchical_file and array driver works as hierarchy separator like pipe character |.
This was added to mimic folder structure.
Under the hood / is automatically converted to |, so /users/12 key is equal to |users|12.
permissions configuration parameter for file-based cache drivers (config/cache.php)
'stores' => [
'file' => [
'driver' => 'file',
'path' => storage_path('framework/cache/data'),
'permissions' => [
'file' => [
'public' => 0644,
],
'dir' => [
'public' => 0755,
],
]
],
],
These permissions passed to vendor/league/flysystem/src/Adapter/Local.php
and merged with default permissions. There are 2 types: public and private
but only public permissions will be used in AlternativeLaravelCache.
Notes
By default, service provider will replace Laravel's array, redis and file cache stores.
You can alter this behavior like this:
class MyAlternativeCacheStoresServiceProvider extends AlternativeCacheStoresServiceProvider {
static protected $arrayDriverName = 'altarray';
static protected $redisDriverName = 'altredis';
static protected $memcacheDriverName = 'altmemcached';
static protected $fileDriverName = 'altfile';
}
File cache storage currently supports only 'driver' => 'file'. You can extend list of file cache drivers by
overwriting AlternativeCacheStoresServiceProvider->makeFileCacheAdapter().
swayok/alternative-laravel-cache 适用场景与选型建议
swayok/alternative-laravel-cache 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 581.41k 次下载、GitHub Stars 达 202, 最近一次更新时间为 2016 年 06 月 20 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「cache」 「laravel」 「redis cache」 「tagged cache」 「redis tagged cache」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 swayok/alternative-laravel-cache 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 swayok/alternative-laravel-cache 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 swayok/alternative-laravel-cache 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
repository php library
Laravel 5 - Repositories to the database layer
Rinvex Repository is a simple, intuitive, and smart implementation of Active Repository with extremely flexible & granular caching system for Laravel, used to abstract the data layer, making applications more flexible to maintain.
Laravel 5 - Repositories to the database layer
Alfabank REST API integration
Rinvex Cacheable is a granular, intuitive, and fluent caching system for eloquent models. Simple, but yet powerful, plug-n-play with no hassle.
统计信息
- 总下载量: 581.41k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 203
- 点击次数: 45
- 依赖项目数: 6
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2016-06-20