tschoffelen / memory
内存中的键值存储。可作为存储使用:APC、Redis、Memcache、共享内存。所有存储对象有一个接口,因此您可以在不更改工作代码的情况下切换它们。包含PHP Redis客户端。
Requires
- php: >=5.3.0
Suggests
- jamm/tester: allows to run unit-tests
This package is auto-updated.
Last update: 2020-08-29 05:47:01 UTC
README
所有存储对象有一个接口,因此您可以在不更改工作代码的情况下切换它们。
##特性
- 键标签
- “狗群”(缓存缺失风暴)和“竞态条件”效应已被排除
- 通过一个命令锁定、解锁或获取键
- 自动解锁器 - 任何已锁定的键将自动解锁(在退出函数或脚本时,RAII)
- 您可以通过回调函数(Map)选择键
- 所有存储的一个接口 - 您可以更改存储而无需更改代码
- Increment()方法可以与数组、字符串和数值一起工作
- MultiAccess类可用于任何资源,以创建一个访问模型 单写多读
##使用方法:请参阅demo.php以获取代码示例。
您可以使用MemoryObjects(RedisObject、CouchbaseObject、APCObject、MemcacheObject、SHMObject)作为常规的键值存储:获取/设置/删除。
这个库的设计是为了提供额外的特性,例如标签或避免“狗群”效应。
在所有存储中,竞态条件已被排除,但您也可以锁定键以避免算法中的竞态条件
例如,请参阅以下代码
$value = $mem->read('key');
if (some_condition()) $mem->save('key', $value . 'append');
如果此代码同时由两个脚本执行,则一个脚本的“append”将丢失。
为了避免这种情况,您可以锁定键
if ($mem->lock_key('key', $au))
{
if (some_condition()) $mem->save('key', $value . 'append');
}
或获取
if ($mem->acquire_key('key', $au))
{
if (some_condition()) $mem->save('key', $value . 'append');
}
这些方法之间的区别在于当另一个进程锁定键时它们将做什么:lock_key()将只返回'false',acquire_key()将等待直到键解锁(在代码中声明了最大等待时间)。
这里的所有'locks'都是软的。这意味着键不会被锁定以写入或读取,但您可以检查键是否被'锁定',以及如何处理它 - 是您的脚本的决策。
它被设计用来避免死锁和客户等待访问键的无需要队列。
代码示例
if ($mem->lock_key('key', $au))
{
if (some_condition()) $mem->save('key', $value . 'append');
}
else
{
// key is not hard-locked actually
$mem->del('key'); // we can do this
// but we can use 'locks' to manage multi-process interactions properly and easy (see previous code examples)
}
为了避免“狗群”效应(“缓存缺失风暴”、“缓存冲击波”),我们可以使用read()方法的第二个参数 - 当过期时间接近时,我们可以尝试锁定键,如果键被锁定,则更新值。
请参阅demo.php中的示例。
##要求:您可以使用每个存储单独,要求因存储而异
###PHP版本:5.3+
##对于Redis:Redis服务器应已安装(在debian/ubuntu中:“apt-get install redis-server”)。
支持的版本是2.6.9及以下。此外,如果已安装phpredis(如果已安装),则可以使用客户端库 - 只需使用PhpRedisObject
代替默认的RedisObject
。
##对于Couchbase:安装Couchbase PHP SDK
Couchbase Server 2.0
需要容错性时,请使用少量节点。
##对于Memcache:应安装Memcache或Memcached PHP扩展。
##对于APCObject:应安装APC,并在php.ini(或使用apc.ini时)中添加此设置
- apc.slam_defense = Off
- 推荐: apc.user_ttl = 0
##对于SHMObject和MultiAccess:PHP应支持shm-functions和msg-functions (--enable-shmop --enable-sysvsem --enable-sysvshm --enable-sysvmsg)
仅应在不特定情况下(例如互斥锁)使用,或者当无法安装其他扩展时。
#存储比较:Redis是最佳的缓存键值存储。
如果需要容错性强且易于扩展的集群,并且能够承担成本(最小硬件要求),请使用Couchbase。
Redis、Couchbase和Memcache(d)可用于跨进程通信。此外,Redis和Couchbase存储中的数据在服务器重启后也将恢复。
APC是一种非常快速且易于使用的存储,但在PHP 5.5版本发布内置的opcode缓存后已被弃用,因此它将仍然存在于这个库中,但请考虑使用Redis。
如果您不能安装任何第三方包,可以使用共享内存 - 但您的PHP应该编译支持shmop-functions。
测试
<?php
namespace Jamm\Memory\Tests;
header('Content-type: text/plain; charset=utf-8');
$testRedisObject = new TestMemoryObject(new \Jamm\Memory\RedisObject('test'));
$testRedisObject->RunTests();
$testRedisServer = new TestRedisServer();
$testRedisServer->RunTests();
$printer = new \Jamm\Tester\ResultsPrinter();
$printer->addTests($testRedisObject->getTests());
$printer->addTests($testRedisServer->getTests());
$printer->printResultsLine();
$printer->printFailedTests();
查看demo.php中的注释以获取更多信息。询问您想看到哪些注释。
许可协议:MIT