tschoffelen/memory

该包已被弃用,不再维护。没有建议的替代包。

内存中的键值存储。可作为存储使用:APC、Redis、Memcache、共享内存。所有存储对象有一个接口,因此您可以在不更改工作代码的情况下切换它们。包含PHP Redis客户端。

维护者

详细信息

github.com/tschoffelen/Memory

来源

安装 3,318

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 42

1.0.2 2017-06-25 20:33 UTC

This package is auto-updated.

Last update: 2020-08-29 05:47:01 UTC


README

##内存中的键值存储
Build Status
可作为存储使用:

所有存储对象有一个接口,因此您可以在不更改工作代码的情况下切换它们。

##特性

  • 键标签
  • “狗群”(缓存缺失风暴)和“竞态条件”效应已被排除
  • 通过一个命令锁定、解锁或获取键
  • 自动解锁器 - 任何已锁定的键将自动解锁(在退出函数或脚本时,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:应安装MemcacheMemcached 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