• 入门6数据缓存


    数据缓存

    数据缓存是指将一些 PHP 变量存储到缓存中,使用时再从缓存中取回。 它也是更高级缓存特性的基础,例如查询缓存 和内容缓存

    如下代码是一个典型的数据缓存使用模式。 其中 $cache 指向缓存组件

    从 2.0.11 版本开始, 缓存组件 提供了 getOrSet() 方法来简化数据的取回、计算和存储。 下面的代码逻辑和上一个例子是完全一样的:

    当缓存中有关联 $key 的数据时,将返回这个缓存的值。 否则就执行匿名函数来计算出将要缓存的数据并返回它。

    如果匿名函数需要作用域外的数据时,可以使用 use 语句把这些数据传递到匿名函数中。 例如:

    缓存组件

    数据缓存需要缓存组件提供支持,它代表各种缓存存储器, 例如内存,文件,数据库。

    缓存组件通常注册为应用程序组件,这样它们就可以 在全局进行配置与访问。如下代码演示了如何配置应用程序组件 cache 使用两个 memcached 服务器:

    然后就可以通过 Yii::$app->cache 访问上面的缓存组件了。

    如:以下项目中使用了memcache和redis

    支持的缓存存储器

    Yii 支持一系列缓存存储器,概况如下:

    • yiicachingApcCache:使用 PHP APC 扩展。 这个选项可以认为是集中式应用程序环境中 (例如:单一服务器,没有独立的负载均衡器等)最快的缓存方案。
    • yiicachingDbCache:使用一个数据库的表存储缓存数据。要使用这个缓存, 你必须创建一个与 yiicachingDbCache::$cacheTable 对应的表。
    • yiicachingDummyCache:仅作为一个缓存占位符,不实现任何真正的缓存功能。 这个组件的目的是为了简化那些需要查询缓存有效性的代码。例如, 在开发中如果服务器没有实际的缓存支持,用它配置一个缓存组件。 一个真正的缓存服务启用后,可以再切换为使用相应的缓存组件。 两种条件下你都可以使用同样的代码 Yii::$app->cache->get($key) 尝试从缓存中取回数据而不用担心 Yii::$app->cache 可能是 null
    • yiicachingFileCache:使用标准文件存储缓存数据。 这个特别适用于缓存大块数据,例如一个整页的内容。
    • yiicachingMemCache:使用 PHP memcache 和 memcached 扩展。 这个选项被看作分布式应用环境中(例如:多台服务器,有负载均衡等) 最快的缓存方案。
    • yii edisCache:实现了一个基于 Redis 键值对存储器的缓存组件 (需要 redis 2.6.12 及以上版本的支持 )。
    • yiicachingWinCache:使用 PHP WinCache (另可参考)扩展.
    • yiicachingXCache:使用 PHP XCache扩展。
    • yiicachingendDataCache:使用 [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend- server.htm#data_cache_component.htm) 作为底层缓存媒介。

    缓存 API

    所有缓存组件都有同样的基类 yiicachingCache ,因此都支持如下 API:

    • get():通过一个指定的键(key)从缓存中取回一项数据。 如果该项数据不存在于缓存中或者已经过期/失效,则返回值 false。
    • set():将一个由键指定的数据项存放到缓存中。
    • add():如果缓存中未找到该键,则将指定数据存放到缓存中。
    • getOrSet():返回由键指定的缓存项,或者执行回调函数,把函数的返回值用键来关联存储到缓存中, 最后返回这个函数的返回值。
    • multiGet():由指定的键获取多个缓存数据项。
    • multiSet():一次存储多个数据项到缓存中,每个数据都由一个键来指明。
    • multiAdd():一次存储多个数据项到缓存中,每个数据都由一个键来指明。 如果某个键已经存在,则略过该数据项不缓存。
    • exists():返回一个值,指明某个键是否存在于缓存中。
    • delete():通过一个键,删除缓存中对应的值。
    • flush():删除缓存中的所有数据。

    缓存键

    存储在缓存中的每项数据都通过键作唯一识别。 当你在缓存中存储一项数据时,必须为它指定一个键, 稍后从缓存中取回数据时,也需要提供相应的键。

    一般使用CommonUtil::generalKey()来生成key

    缓存过期

    默认情况下,缓存中的数据会永久存留,除非它被某些缓存策略强制移除(例如:缓存空间已满,最老的数据会被移除)。 要改变此特性,你可以在调用 set() 存储一项数据时提供一个过期时间参数。 该参数代表这项数据在缓存中可保持有效多少秒。 当你调用 get() 取回数据时, 如果它已经过了超时时间,该方法将返回 false,表明在缓存中找不到这项数据。 例如:

    从 2.0.11 开始,如果想自定义缓存的持续时间,你可以在缓存组件配置中设置 defaultDuration 成员属性的值。 这样设置会覆盖默认的缓存持续时间,且在使用 set() 方法时不必每次都传递 $duration 参数。

    缓存依赖

    除了超时设置,缓存数据还可能受到缓存依赖的影响而失效。 例如,yiicachingFileDependency 代表对一个文件修改时间的依赖。 这个依赖条件发生变化也就意味着相应的文件已经被修改。 因此,缓存中任何过期的文件内容都应该被置为失效状态, 对 get() 的调用都应该返回 false。

    缓存依赖用 yiicachingDependency 的派生类所表示。 当调用 set() 在缓存中存储一项数据时, 可以同时传递一个关联的缓存依赖对象。例如:

    下面是可用的缓存依赖的概况:

    缓存冲刷

    当你想让所有的缓存数据失效时,可以调用 yiicachingCache::flush()

    冲刷缓存数据,你还可以从控制台调用 yii cache/flush

    • yii cache:列出应用中可用的缓存组件
    • yii cache/flush cache1 cache2:刷新缓存组件cache1cache2 (可以传递多个用空格分开的缓存组件)
    • yii cache/flush-all:刷新应用中所有的缓存组件
    • yii cache/flush-schema db:清除给定连接组件的数据库表结构缓存
    Linux等环境软件安装
  • 相关阅读:
    Appium-Java滑动操作
    使用uiautomatorviewer获取元素
    在eclipse中,Python项目遇到:…… from appium import webdriver ImportError: No module named appium
    Python遇到SyntaxError: Non-ASCII character 'xe5' in file D:eclipseworkspace est est_urllib2.py on line2
    在eclipse添加第一次添加Python项目时,提示: Project interpreter not specified
    安装pip环境以及pip常用命令使用
    虚拟机——安装虚拟机时,提示intel VT-x处于禁用状态
    【luogu 3370】【模板】字符串哈希
    【luogu 3378】【模板】堆
    【luogu 3383】【模板】线性筛素数
  • 原文地址:https://www.cnblogs.com/Adam-Ye/p/15134425.html
Copyright © 2020-2023  润新知