jamm/memory

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

维护者

详细信息

github.com/jamm/Memory

源代码

问题

安装量: 22 135

依赖项: 1

建议者: 4

安全性: 0

星标: 134

关注者: 10

分支: 40

1.0.0 2013-11-11 20:02 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:42:15 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()将等待直到键不再锁定(最大等待时间在代码中声明)。

这里的所有'锁'都是软锁。这意味着键不会为了写入或读取而锁定,但您可以检查键是否'锁定',以及如何处理它——这是您的脚本的决策。
它被设计用来避免死锁和客户等待访问键的无效队列。

代码示例

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及以下。另外,如果已安装,可以使用Redis(作为客户端库) - 只需使用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