Symfony之components--第二章--第三讲:cache组件的使用

news/2024/5/20 2:34:32 标签: Symfony
cache组件为添加cache到应用中提供了一个严格的psr-6实现.低开销以及即将为最流行的后台缓存使用适配器.


key concepts(概念)
Before starting to use the cache component, it's important that you learn the meaning of
some key concepts:
item
    一个信息存储的独立单元,作为一个key/value对,key是唯一定义的,value是key的内容
pool
    缓存的一个逻辑仓库.所有的cache操作,(保存,查看等)都是通过pool展示.应用可以定义足够多的你需要的
    pool.
adapter
    它实现了真正的cache机制,用于在文件系统,数据库等等中存储信息.这个component为常用的cache后台提供了准备
    使用的adapter.


Basic Usage
该组建严格实现psr-6,意味着它的api一同样的标准定义.before starting to cache information, create the
cache pool using any of the built-in adapters. for example, to create a filesystem-based cache, instantiate(实例化) FilesystemAdapter:


use Symfony\Component\Cache\Adapter\FilesystemAdapter;


$cache = new FilesystemAdapter();
现在,你可以使用cache pool创建,检索,更新以及删除元素:
// create a new item by trying to get it from the cache
$numProducts = $cache->getItem('stats.num_products');


// assign a value to the item and save it
$numProducts->set(4711);
$cache->save($numProducts);


// retrieve the cache item
$numProducts = $cache->getItem('stats.num_products');
if (!$numProducts->isHit()) {
    // ... item does not exists in the cache
}
// retrieve the value stored by the item
$total = $numProducts->get();


// remove the cache item
$cache->deleteItem('stats.num_products');


Cache Items
缓存项目是以键值对的方式被存储在告诉缓存中的信息单元.在Cache模块,他们通过CacheItem类来代表,


Cache item keys and values
cache item的key是utf-8编码的字符串,因此它对每一个cache pool都必须是唯一的.你可以自由的选择keys,
但是他们只能包含(A-Z,a-z),数字0到9和_和.symbols(符号).
cache item的value可以是任意被php序列化的类型代表,列入基本类型,和arrays和objects


creating cache items
通过cache pool的getItem($key)方法创建.参数是item的key.
// $cache pool object was created before
$numProducts = $cache->getItem('stats.num_products');
然后通过set()方法在cache item中储存数据:
// storing a simple integer
$numProducts->set(4711);
$cache->save($numProducts);


// storing an array
$numProducts->set(array(
    'category1' => 4711,
    'category2' => 2387,
));
$cache->save($numProducts);
cache item给出的任意key和value可以通过对应的getter方法被获取:
$cacheItem = $cache->getItem('exchange_rate');
// ...
$key = $cacheItem->getKey();
$value = $cacheItem->get();


cache item到期
默认的cache item是被永久存储的,在实践中,这个永久存储根据缓存类型的使用而产生很大的改变,
如在告诉缓存池解释的.
然而,在一些应用中,使用短生命周期的cache是非常普遍的.考虑一种情况,一个缓存最新的新闻只保留一
分钟的引用.在这些情况中,使用expiresAfter()方法去给cache设置seconds值
$latestNews = $cache->getItem('latest_news');
$latestNews->expiresAfter(60); // 60 seconds = 1 minute
// 这个方法还可以接受\DateInterval实例
$latestNews->expiresAfter(DateInterval::createFromDateString('1 hour'));
cache items定义了另一个相关的方法:expiresAt(),用来设置item即将过期的准确的日期和时间
$mostPopularNews = $cache->getItem('popular_news');
$mostPopularNews->expiresAt(new \DateTime('tomorrow'));


cache item hits and misses
使用缓存机制对提高应用的性能非常的重要,但是它不应该被应用与应用的工作.事实上,psr-6标准规定caching errors
不会导致程序故障.
实践中,这意味着getItem()方法总是返回一个实现了Psr\Cache\CacheItemInterface接口的对象,甚至cache item不存在的时候也是如此.therefor,你不需要处理空的返回结果并且你可以很安全的存储类似false和null之类
的值.
为了判断返回的对象是否正确,caches使用了hits和misses观点:
cache hits当在缓存中找到请求项的时候出现,它的值没有被破坏或者失效并且还没有过期.
cache misses是和hits相反的,所以他们是当在缓存中未找到item的时候出现,它的值是被破坏的或者
因为任何一个理由失效的或者item已经过期的.
cache item对象定义了一个为hits返回布尔类型的方法isHit():
$latestNews = $cache->getItem('latest_news');


if (!$latestNews->isHit()) {
    // do some heavy computation
    $news = ...;
    $cache->save($latestNews->set($news));
} else {
    $news = $latestNews->get();
}


Cache Pools
cache pools是cache items的逻辑仓库.他们执行所有的在items上通用的操作,例如保存item或者查找
item.cache pools are independent from 显示的缓存实现.因此,应用可以不断使用cache pool,
即使潜在的缓存机制从一个基础的缓存文件系统改变为redis或者数据库基础缓存.


creating cache pools
cache pools通过cache适配器创建,实现了AdapterInterface接口的类.这个组件提供了几个给程序使用的
适配器.
Array Cache Adapter
这个适配器仅仅有用于测试目的,因为内容被存储在内存中并且不已任何方式支持.除此之外,一些解释之后的特性是
不能使用的,例如:延迟保存:
Filesystem Cache Adapter
这个适配器当你想提高应用的性能的时候是游泳的,但是不能安装像APC或者redis的工具在你的服务器中,此
适配器将内容存储在本地文件系统上的一组目录中的常规文件中.
.....



http://www.niftyadmin.cn/n/861203.html

相关文章

浏览器组成和内核引擎(渲染引擎和js 引擎)

浏览器: 可见:shell 可操作页面 不可见:内核:渲染引擎 后来分出来的js 引擎 浏览器内核: 浏览器渲染引擎js 引擎chrome (谷歌)webkit --> blinkv8(这个引擎厉害,记住这个即可)firefox(火…

一个laravel文件中创建多个应用

服务器采用nginx在nginx下配置路径首先会找到laravel文件中的public下的index.php这里重新创建一个admin(和public在同一个目录)文件,nginx配置路径到admin下的index.php文件,开始模拟在laravel中的另一个应用将public下的所有文件…

csrf学习笔记

cross-site request forgery跨站点请求伪造它是一个攻击,让受害者提交恶意的请求.对于大多数网站来说,浏览器自动请求都包含了一些证书,例如用户的session cookie, ip地址,Windows域凭据等,因此&#xff0c…

提高网站运行速度的一些策略

学习网址:https://developer.yahoo.com/performance/rules.html#page-nav大多用户的等待时间花费在前台,图片,样式,脚本,动画等的加载话费了大量的时间,那么如何让网站即拥有丰富的页面内容,有可…

js 代码可放的位置

1.script 标签内写js 代码 2.script src 引入js 代码 <script src"./test.js"></script> 但是这里假如又同时在script 标签内写js 代码&#xff0c;会忽略掉这个里面的代码&#xff0c;只有src 引入的js 代码会起作用 3.事件属性 <button onclic…

jdk,jre,jvm解释

JVM -- java virtual machine JVM就是我们常说的java虚拟机&#xff0c;它是整个java实现跨平台的 最核心的部分&#xff0c;所有的java程序会首先被编译为.class的类文件&#xff0c;这种类文件可 以在虚拟机上执行&#xff0c;也就是说class并不直接与机器的操作系统相…

script 标签

type src 并行加载js 代码: defer 必须要html 执行完之后&#xff0c;再执行js adync 只要js 执行完就执行

php解释型语言,那么何为解释?

计算机不能直接理解高级语言&#xff0c;只能直接理解机器语言&#xff0c;所以必须要把高级语言翻译成机器语言&#xff0c;计算机才能执行高级语言编写的程序。 翻译的方式有两种&#xff0c;一个是编译&#xff0c;一个是解释。两种方式只是翻译的时间不同。编译型语言写的程…