当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

数据缓存(Data Caching)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:29:27

由  创建, 最后一次修改 2016-02-24 数据缓存数据缓存是指将一些 PHP 变量存储到缓存中,使用时再从缓存中取回。它也是更高级缓存特性的基础,例如查询缓存和内容缓存。如下代码是一个典型的数据缓存使用模式。其中?$cache?指向缓存组件:// 尝试从缓存中取回 $data $data = $cache->get($key);if ($data === false) { // $data 在缓存中没有找到,则重新计算它的值 // 将 $data 存放到缓存供下次使用 $cache->set($key, $data);}// 这儿 $data 可以使用了。缓存组件数据缓存需要缓存组件提供支持,它代表各种缓存存储器,例如内存,文件,数据库。缓存组件通常注册为应用程序组件,这样它们就可以在全局进行配置与访问。如下代码演示了如何配置应用程序组件?cache?使用两个memcached?服务器:'components' => [ 'cache' => [ 'class' => 'yii\caching\MemCache', 'servers' => [ [ 'host' => 'server1', 'port' => 11211, 'weight' => 100, ], [ 'host' => 'server2', 'port' => 11211, 'weight' => 50, ], ], ],],然后就可以通过?Yii::$app->cache?访问上面的缓存组件了。由于所有缓存组件都支持同样的一系列 API ,并不需要修改使用缓存的业务代码就能直接替换为其他底层缓存组件,只需在应用配置中重新配置一下就可以。例如,你可以将上述配置修改为使用 yii\caching\ApcCache:'components' => [ 'cache' => [ 'class' => 'yii\caching\ApcCache', ],],Tip: 你可以注册多个缓存组件,很多依赖缓存的类默认调用名为?cache?的组件(例如 yii\web\UrlManager)。支持的缓存存储器Yii 支持一系列缓存存储器,概况如下:yii\caching\ApcCache:使用 PHP?APC?扩展。这个选项可以认为是集中式应用程序环境中(例如:单一服务器,没有独立的负载均衡器等)最快的缓存方案。yii\caching\DbCache:使用一个数据库的表存储缓存数据。要使用这个缓存,你必须创建一个与 yii\caching\DbCache::cacheTable 对应的表。yii\caching\DummyCache: 仅作为一个缓存占位符,不实现任何真正的缓存功能。这个组件的目的是为了简化那些需要查询缓存有效性的代码。例如,在开发中如果服务器没有实际的缓存支持,用它配置一个缓存组件。一个真正的缓存服务启用后,可以再切换为使用相应的缓存组件。两种条件下你都可以使用同样的代码?Yii::$app->cache->get($key)?尝试从缓存中取回数据而不用担心Yii::$app->cache?可能是?null。yii\caching\FileCache:使用标准文件存储缓存数据。这个特别适用于缓存大块数据,例如一个整页的内容。yii\caching\MemCache:使用 PHP?memcache?和?memcached?扩展。这个选项被看作分布式应用环境中(例如:多台服务器,有负载均衡等)最快的缓存方案。yii\redis\Cache:实现了一个基于?Redis?键值对存储器的缓存组件(需要 redis 2.6.12 及以上版本的支持 )。yii\caching\WinCache:使用 PHP?WinCache(另可参考)扩展.yii\caching\XCache:使用 PHP?XCache扩展。yii\caching\ZendDataCache:使用?Zend Data Cache?作为底层缓存媒介。Tip: 你可以在同一个应用程序中使用不同的缓存存储器。一个常见的策略是使用基于内存的缓存存储器存储小而常用的数据(例如:统计数据),使用基于文件或数据库的缓存存储器存储大而不太常用的数据(例如:网页内容)。缓存 API所有缓存组件都有同样的基类 yii\caching\Cache ,因此都支持如下 API:yii\caching\Cache::get():通过一个指定的键(key)从缓存中取回一项数据。如果该项数据不存在于缓存中或者已经过期/失效,则返回值 false。yii\caching\Cache::set():将一项数据指定一个键,存放到缓存中。yii\caching\Cache::add():如果缓存中未找到该键,则将指定数据存放到缓存中。yii\caching\Cache::mget():通过指定的多个键从缓存中取回多项数据。yii\caching\Cache::mset():将多项数据存储到缓存中,每项数据对应一个键。yii\caching\Cache::madd():将多项数据存储到缓存中,每项数据对应一个键。如果某个键已经存在于缓存中,则该项数据会被跳过。yii\caching\Cache::exists():返回一个值,指明某个键是否存在于缓存中。yii\caching\Cache::delete():通过一个键,删除缓存中对应的值。yii\caching\Cache::flush():删除缓存中的所有数据。有些缓存存储器如 MemCache,APC 支持以批量模式取回缓存值,这样可以节省取回缓存数据的开支。 yii\caching\Cache::mget() 和 yii\caching\Cache::madd() API提供对该特性的支持。如果底层缓存存储器不支持该特性,Yii 也会模拟实现。由于 yii\caching\Cache 实现了 PHP?ArrayAccess?接口,缓存组件也可以像数组那样使用,下面是几个例子:$cache['var1'] = $value1; // 等价于: $cache->set('var1', $value1);$value2 = $cache['var2']; // 等价于: $value2 = $cache->get('var2');缓存键存储在缓存中的每项数据都通过键作唯一识别。当你在缓存中存储一项数据时,必须为它指定一个键,稍后从缓存中取回数据时,也需要提供相应的键。你可以使用一个字符串或者任意值作为一个缓存键。当键不是一个字符串时,它将会自动被序列化为一个字符串。定义一个缓存键常见的一个策略就是在一个数组中包含所有的决定性因素。例如,yii\db\Schema 使用如下键存储一个数据表的结构信息。[ __CLASS__, // 结构类名 $this->db->dsn, // 数据源名称 $this->db->username, // 数据库登录用户名 $name, // 表名];如你所见,该键包含了可唯一指定一个数据库表所需的所有必要信息。当同一个缓存存储器被用于多个不同的应用时,应该为每个应用指定一个唯一的缓存键前缀以避免缓存键冲突。可以通过配置 yii\caching\Cache::keyPrefix 属性实现。例如,在应用配置中可以编写如下代码:'components' => [ 'cache' => [ 'class' => 'yii\caching\ApcCache', 'keyPrefix' => 'myapp', // 唯一键前缀 ]

[1] [2]  下一页


数据缓存(Data Caching)