【Git 项目推荐】灵活高效的 PHP 缓存工具库

来源:转载

LinkCache - 一个灵活高效的PHP缓存工具库

LinkCache 是一个PHP编写的灵活高效的缓存工具库,提供多种缓存驱动支持,包括Memcache、Memcached、Redis、SSDB、文件缓存、APC、YAC等。通过LinkCache可以使不同缓存驱动实现操作统一,同时又可发挥不同缓存驱动各自的优势。LinkCache支持缓存 object和 array,同时为防止产生惊群现象做了优化。

环境要求 PHP >= 5.4 使用 Memcache 缓存需要安装 Memcache扩展 使用 Memcached 缓存需要安装 Memcached扩展 使用 Redis 缓存需要安装 Redis扩展 使用 APC 缓存需要安装 APC扩展 使用 YAC 缓存需要安装 YAC扩展 安装 composer 安装

LinkCache 可以通过 composer安装,使用以下命令从 composer下载安装 LinkCache

$ composer require dongnan/linkcache 手动下载安装 下载地址 在 [email protected]下载 http://git.oschina.net/dongnan/LinkCache/tags 在 GitHub下载 https://github.com/dongnan/LinkCache/releases 安装方法

在你的入口文件中引入

<?php //引入 LinkCache 的自动加载文件 include("path_to_linkcache/autoload.php"); 如何使用 config- 配置信息 instance- 缓存实例化 getDriver- 获取缓存驱动实例 set- 将参数中的 value设置为 key的值 setnx- 当缓存中不存在 key时,将参数中的 value设置为 key的值 get- 获取 key对应的值 del- 删除 key has- 判断 key是否存在 ttl- 获取 key的生存时间(单位:s) expire- 设置一个 key的生存时间(单位:s) expireAt- 用UNIX时间戳设置一个 key的过期时间 persist- 删除一个 key的生存时间,使其永不过期 lock- 对 key设置锁标记(此锁并不对 key做修改限制,仅为 key的锁标记) isLock- 对 key解除锁标记 incr- 设置 key的值按整数递增 incrByFloat- 设置 key的值按浮点数递增 decr- 设置 key的值按整数递减 mSet- 批量设置多个 key对应的值 mSetNX- 当缓存中不存在 key时,批量设置多个 key对应的值 mGet- 获取所有给定 key的值 config

配置信息

<?php //设置缓存, 使用 array_merge 的方式合并到默认配置中/linkcache/Cache::setConfig($config);//获取配置信息$congig = /linkcache/Cache::getConfig();//获取指定缓存驱动的配置信息$congig = /linkcache/Cache::getConfig('redis');//默认配置信息[//默认使用的缓存驱动'default' => 'files',//当前缓存驱动失效时,使用的备份驱动'fallback' => 'files','memcache' => ['servers' => [['host' => '127.0.0.1', 'port' => 11211, 'weight' => 1, 'persistent' => true, 'timeout' => 1, 'retry_interval' => 15, 'status' => true],],'compress' => ['threshold' => 2000, 'min_saving' => 0.2],],'memcached' => ['servers' => [['host' => '127.0.0.1', 'port' => 11211, 'weight' => 1],],//参考 Memcached::setOptions'options' => [],],'redis' => ['host' => '127.0.0.1','port' => 6379,'password' => '','database' => '','timeout' => ''],'ssdb' => ['host' => '127.0.0.1','port' => 8888,'password' => '','timeoutms' => ''],] instance

实例化缓存对象

<?php //直接new一个 $cache = new /linkcache/Cache(); //通过getInstance获取 $cache = /linkcache/Cache::getInstance(); //根据驱动类型实例化,支持的驱动:redis,memcache,memcached,ssdb,files,apc,yac $cache = new /linkcache/Cache('files'); //或者 $cache = /linkcache/Cache::getInstance('files'); //传入配置参数实例化 $cache = new /linkcache/Cache('redis', ['host' => '127.0.0.1', 'port' => 6379]); getDriver

获取缓存驱动实例

所有缓存驱动都必须实现 linkcache/interfaces/driver/Base接口的方法,获取到缓存驱动实例后,可直接使用缓存驱动的方法,包括缓存驱动中没有定义但缓存驱动扩展对象中已定义的方法。

set

将参数中的 value设置为 key的值

参数 key - 字符串 value - 除了 resource 类型的所有的值 time - (可选参数) key的生存时间,单位是秒(s) 返回值

Boolean 如果设置成功,返回 true; 如果设置失败,返回 false

例子 <?php //设置不过期的缓存 $status = $cache->set($key, $value); //设置有过期时间的缓存 $status = $cache->set($key, $value, $time); setnx

当缓存中不存在 key时,将参数中的 value设置为 key的值

参数 key - 字符串 value - 除了 resource 类型的所有的值 time - (可选参数) key的生存时间,单位是秒(s) 返回值

Boolean - 如果设置成功,返回 true; 如果设置失败,返回 false

例子 <?php //设置不过期的缓存 $status = $cache->setnx($key, $value); //设置有过期时间的缓存 $status = $cache->setnx($key, $value, $time); get

获取 key对应的值

参数 key - 字符串 返回值

Mixed - key对应的值; 如果获取失败或 key不存在,返回 false

例子 <?php //获取key对应的值 $value = $cache->get($key); del

删除 key

参数 key - 字符串 返回值

Boolean - 如果删除成功,返回 true; 如果删除失败,返回 false。**注意:** 当 key不存在时,也会返回 true

例子 <?php //删除key $status = $cache->del($key); has

判断 key是否存在

参数 key - 字符串 返回值

Boolean - 如果 key存在,返回 true;如果 key不存在,返回 false

例子 <?php //判断key是否存在 $status = $cache->has($key); ttl

获取 key的生存时间(单位:s)

参数 key - 字符串 返回值

Mixed - 生存剩余时间(单位:秒) -1表示永不过期, -2表示 key不存在,失败返回 false

例子 <?php //获取key的生存时间 $ttl = $cache->ttl($key); expire

设置一个 key的生存时间(单位:s)

参数 key - 字符串 time - 整数,key的生存时间(单位:s) 返回值

Boolean - 如果设置成功,返回 true; 如果设置失败或 key不存在,返回 false

例子 <?php //设置一个key的生存时间 $status = $cache->expire($key, $time); expireAt

用UNIX时间戳设置一个 key的过期时间

参数 key - 字符串 time - UNIX时间戳(单位:s) 返回值

Boolean - 如果设置成功,返回 true; 如果设置失败或 key不存在,返回 false

例子 <?php //用UNIX时间戳设置一个key的过期时间 $status = $cache->expireAt($key, $time); persist

删除一个 key的生存时间,使其永不过期

参数 key - 字符串 返回值

Boolean - 如果设置成功,返回 true; 如果设置失败或 key不存在,返回 false

例子 <?php //删除一个key的生存时间,使其永不过期 $status = $cache->persist($key); lock

对 key设置锁标记(此锁并不对 key做修改限制,仅为 key的锁标记)

参数 key - 字符串 time - 整数, key锁标记的生存时间(单位:s) 返回值

Boolean - 如果设置成功,返回 true; 如果设置失败,返回 false

例子 <?php //对key设置锁标记 $status = $cache->lock($key, $time); isLock

对 key解除锁标记

参数 key - 字符串 返回值

Boolean - 如果解除锁标记成功,返回 true; 如果设置失败,返回 false

例子 <?php //对key解除锁标记 $status = $cache->isLock($key); incr

设置 key的值按整数递增

参数 key - 字符串 step - (可选参数) 整数,递增步长,默认值为 1,可以为负值 返回值

Mixed - 递增后的值,失败返回 false,如果 key不存在,则按 step设置新值

例子 <?php //设置key的值按整数递增 $value = $cache->incr($key, $step); incrByFloat

设置 key的值按浮点数递增

参数 key - 字符串 float - 浮点数,递增步长,可以为负值 返回值

Mixed - 递增后的值,失败返回 false,如果 key不存在,则按 float设置新值

例子 <?php //设置key的值按浮点数递增 $value = $cache->incrByFloat($key, $float); decr

设置 key的值按整数递减

参数 key - 字符串 step - (可选参数) 整数,递减步长,默认值为 1,可以为负值 返回值

Mixed - 递减后的值,失败返回 false,如果 key不存在,则按 -step设置新值

例子 <?php //设置key的值按整数递减 $value = $cache->decr($key, $step); mSet

批量设置多个 key对应的值

参数 sets - key和 value组成的键值对数组 返回值

Boolean - 如果设置成功,返回 true; 如果设置失败,返回 false

例子 <?php$sets = ['key1' => 'value1','key2' => 'value2','key3' => 'value3',];//批量设置多个key对应的值$status = $cache->mSet($sets); mSetNX

当缓存中不存在 key时,批量设置多个 key对应的值

参数 sets - key和 value组成的键值对数组 返回值

Boolean - 如果设置成功,返回 true; 如果设置失败,返回 false

例子 <?php$sets = ['key1' => 'value1','key2' => 'value2','key3' => 'value3',];//当缓存中不存在key时,批量设置多个key对应的值$status = $cache->mSetNX($sets); mGet

获取所有给定key的值

参数 keys - 多个 key组成的数组 返回值

array - 参数 keys中的所有 key与对应的 value组成的数组,如果 key不存在或是获取失败,对应的 value值为 false

例子 <?php $keys = ['key1', 'key2', 'key3']; //获取所有给定key的值 $status = $cache->mGet($keys); 开发

如果你觉得LinkCache还不错,但又不支持你想用的缓存驱动,不妨尝试在LinkCache新增该缓存驱动的支持。

1.增加新的缓存驱动

目前有两种方式可以方便的开发新的缓存驱动支持

继承 linkcache/abstracts/DriverSimple抽象类

在 src/linkcache/drivers目录下创建新的缓存驱动类 Example.php

<?php/** * linkcache - 一个灵活高效的PHP缓存工具库 * * @author Dong Nan <[email protected]> * @copyright (c) Dong Nan http://idongnan.cn All rights reserved. * @link http://git.oschina.net/dongnan/LinkCache * @license BSD (http://opensource.org/licenses/BSD-3-Clause) */namespace linkcache/drivers;use linkcache/abstracts/DriverSimple;class Example extends DriverSimple { /** * 构造函数 * @param array $config 配置 */ public function __construct($config = []) { $this->init($config); //TODO 完善这个方法 } /** * 检查驱动是否可用 * @return boolean 是否可用 */ public function checkDriver() { //TODO 实现这个方法 } /** * 设置键值 * @param string $key * @param string $value * @return boolean */ protected function setOne($key, $value) { //TODO 实现这个方法 } /** * 获取键值 * @param string $key * @return mixed */ protected function getOne($key) { //TODO 实现这个方法 } /** * 删除键值 * @param string $key * @return boolean */ protected function delOne($key) { //TODO 实现这个方法 }}

实现 linkcache/abstracts/DriverSimple抽象类中的抽象方法

实现接口 linkcache/interfaces/driver/Base(Base接口是必须的,你也可以实现更多的接口:Incr,Lock,Multi)

在 src/linkcache/drivers目录下创建新的缓存驱动类 Example.php

<?php/** * linkcache - 一个灵活高效的PHP缓存工具库 * * @author Dong Nan <[email protected]> * @copyright (c) Dong Nan http://idongnan.cn All rights reserved. * @link http://git.oschina.net/dongnan/LinkCache * @license BSD (http://opensource.org/licenses/BSD-3-Clause) */namespace linkcache/drivers;use linkcache/interfaces/driver/Base;class Example implements Base { use /linkcache/traits/CacheDriver; /** * 构造函数 * @param array $config 配置 */ public function __construct($config = []) { $this->init($config); //TODO 完善这个方法 } /** * 检查驱动是否可用 * @return boolean 是否可用 */ public function checkDriver() { //TODO 实现这个方法 } /** * 设置键值 * @param string $key 键名 * @param mixed $value 键值 * @param int $time 过期时间,默认为-1,不设置过期时间;为0则设置为永不过期 * @return boolean 是否成功 */ public function set($key, $value, $time = -1) { //TODO 实现这个方法 } /** * 当键名不存在时设置键值 * @param string $key 键名 * @param mixed $value 键值 * @param int $time 过期时间,默认为-1,不设置过期时间;为0则设置为永不过期 * @return boolean 是否成功 */ public function setnx($key, $value, $time = -1) { //TODO 实现这个方法 } /** * 获取键值 * @param string $key 键名 * @return mixed|false 键值,失败返回false */ public function get($key) { //TODO 实现这个方法 } /** * 删除键值 * @param string $key 键名 * @return boolean 是否成功 */ public function del($key) { //TODO 实现这个方法 } /** * 是否存在键值 * @param string $key 键名 * @return boolean 是否存在 */ public function has($key) { //TODO 实现这个方法 } /** * 获取生存剩余时间 * @param string $key 键名 * @return int|false 生存剩余时间(单位:秒) -1表示永不过期,-2表示键值不存在,失败返回false */ public function ttl($key) { //TODO 实现这个方法 } /** * 设置过期时间 * @param string $key 键名 * @param int $time 过期时间(单位:秒)。不大于0,则设为永不过期 * @return boolean 是否成功 */ public function expire($key, $time) { //TODO 实现这个方法 } /** * 移除指定键值的过期时间 * @param string $key 键名 * @return boolean 是否成功 */ public function persist($key) { //TODO 实现这个方法 }}

实现 linkcache/interfaces/driver/Base接口中的方法

2.测试新增的驱动

为了保证代码的可靠性,不妨对新增的驱动做个测试吧。 我使用的是PHPUnit做的测试,版本:4.8.15

测试步骤

在 tests目录新增测试类 TestDriverExample.php

<?php/** * linkcache - 一个灵活高效的PHP缓存工具库 * * @author Dong Nan <[email protected]> * @copyright (c) Dong Nan http://idongnan.cn All rights reserved. * @link http://git.oschina.net/dongnan/LinkCache * @license BSD (http://opensource.org/licenses/BSD-3-Clause) */namespace linkcacheTests;/** * TestDriverExample */class TestDriverExample extends TestDriverFiles{ protected $cacheDriver = 'example';}

进入LinkCache项目目录,执行测试命令

phpunit --bootstrap autoload_dev.php tests/TestDriverExample

显示以下信息测试就通过啦~

PHPUnit 4.8.15 by Sebastian Bergmann and contributors..................Time: 3.26 seconds, Memory: 8.50MbOK (17 tests, 68 assertions) LICENSE

使用非常灵活宽松的 New BSD License协议



分享给朋友:
您可能感兴趣的文章:
随机阅读:
栏目列表
推荐内容