invincible-tech-systems / easeampredis
一个非常简单且安全的PHP库,提供在PHP应用程序中访问Redis缓存的函数。此库将AmPHP相关的Redis包封装起来,以异步和非阻塞的方式与Redis内存缓存交互。
Requires
- amphp/redis: ^1.0
Requires (Dev)
- amphp/redis: ^1.0
README
一个非常简单且安全的PHP库,提供在PHP应用程序中访问Redis缓存和Redis Pubsub(即Redis用作消息队列)的函数。此库将AmPHP相关的Redis包封装起来,以异步和非阻塞的方式与Redis内存缓存交互。
优势
- 以异步和非阻塞的方式查询Redis缓存
- 在交互Redis Pubsub时,处理单个频道以及频道模式的消息订阅、取消订阅操作,以及频道发布操作。
入门指南
使用Composer,运行
composer require invincible-tech-systems/easeampredis:^1.0.3
注意,vendor
文件夹和 vendor/autoload.php
脚本是由Composer生成的;它们不是EaseAmpRedis的一部分。
要包含库,
<?php require 'vendor/autoload.php'; use InvincibleTechSystems\EaseAmpRedis\EaseAmpRedis;
由于Amphp/dns是此库的依赖之一,为了防止由于open_basedir限制、没有访问linux服务器上的/etc/resolv.conf文件等原因可能发生的递归DNS服务器解析错误,请将以下行包含在您的代码中,
use \InvincibleTechSystems\EaseAmpRedis\CustomAmphpDnsConfigLoader; $customAmphpDnsConfigValues = ["208.67.222.222:53", "208.67.220.220:53","8.8.8.8:53","[2001:4860:4860::8888]:53"]; $CustomAmphpDnsConfigLoader = new CustomAmphpDnsConfigLoader($customAmphpDnsConfigValues, 5000, 3); \Amp\Dns\resolver(new \Amp\Dns\Rfc1035StubResolver(null, $CustomAmphpDnsConfigLoader));
注意:如果应用程序中已加载类似的自定义DNS配置加载器,则无需包含上述内容,例如从EaseAmyMysql (https://github.com/invincible-tech-systems/easeamp-mysql) 或 EaseAmpMysqlRedis (https://github.com/invincible-tech-systems/easeamp-mysql-redis) 或 EaseAmpMysqlHalite (https://github.com/invincible-tech-systems/easeampmysql-halite) 等其他Amphp/dns依赖库加载,请忽略包含上述内容。
连接到Redis服务器,不使用密码
$redisHost = "tcp://10.124.0.3:6379"; $redisConnection = new EaseAmpRedis($redisHost);
连接到带密码的Redis服务器,其中下面将使用的密码是在redis.conf文件中通过requirepass指令定义的密码。
$redisHost = "tcp://:6379?password=mypassword"; $redisConnection = new EaseAmpRedis($redisHost);
注意:在带密码和不带密码的示例中,假设使用端口6379,因为这是Redis软件定义的默认端口。如果Redis托管在不同的端口上,则必须更改端口号。
定义命名空间前缀
$namespacePrefix = "My-First-App";
注意:请按需定义命名空间,以便唯一标识特定应用程序并适当分隔键。
检查Redis缓存中是否存在键
$existsCheckResult = $redisConnection->exists($namespacePrefix, 'foo');
exists方法期望两个参数,即redis键命名空间前缀和键后缀。'foo'是键后缀,如本例所示。在这种情况下,如果Redis键存在,则结果将作为布尔值(true)返回,否则,结果将作为布尔值(false)返回。
检查Redis缓存中键的类型
$typeCheckResult = $redisConnection->type($namespacePrefix, 'foo');
type方法期望两个参数,即redis键命名空间前缀和键后缀。'foo'是键后缀,如本例所示。在这种情况下,结果将是特定Redis键的值的数据类型。如果结果是有效的,它可以是在string、list、set、zset、hash等类型中,否则将返回'None'。
设置Redis缓存中键的过期时间
$result = $redisConnection->expire($namespacePrefix, 'foo',3000);
expire方法期望输入三个参数,分别构成Redis键命名空间前缀、Redis键后缀和键过期所需秒数(定义为毫秒)。例如,'foo'是键后缀,3000是毫秒定义。在此上下文中,操作成功的结果将是布尔值(true),否则结果将是布尔值(false)。
递增Redis缓存中键的值
$result = $redisConnection->incrBy($namespacePrefix, 'foo', 3);
可以使用incrBy方法,该方法接受三个参数作为输入,类似于Redis键命名空间前缀、Redis键后缀和要进行的增量操作的数字。如果键不存在,则在执行操作之前将其设置为0。
递减Redis缓存中键的值
$result = $redisConnection->decrBy($namespacePrefix, 'foo', 3);
可以使用decrBy方法,该方法接受三个参数作为输入,类似于Redis键命名空间前缀、Redis键后缀和要进行的递减操作的数字。如果键不存在,则在执行操作之前将其设置为0。
通过传递关联数组中的数据来设置单个或多个键及其值作为字符串
$result = $redisConnection->stringSet(['f33'=>'jai','h33'=>'ram']);
stringSet方法将键('f33','h33')的值设置为指定的字符串('jai','ram')。如果操作成功,则结果为true,否则结果为false。
将值推送到指定Redis键的列表中,从头部以数组形式,在Redis缓存中
$result = $redisConnection->listPush('H', $namespacePrefix, 'list100', ['a','b']);
注意:listPush方法返回推送到列表后的长度。
将值推送到指定Redis键的列表中,从尾部以数组形式,在Redis缓存中
$result = $redisConnection->listPush('T', $namespacePrefix, 'list100', ['c','d']);
注意:listPush方法返回推送到列表后的长度。
从Redis缓存中指定的Redis键的列表中移除值,从头部
$result = $redisConnection->listPop('H', $namespacePrefix, 'list100');
注意:listPop方法返回移除列表后的删除元素。
从Redis缓存中指定的Redis键的列表中移除值,从尾部
$result = $redisConnection->listPop('T', $namespacePrefix, 'list100');
注意:listPop方法返回移除列表后的删除元素。
在Redis缓存中存储在键中的哈希中设置指定的字段及其相应值
$result = $redisConnection->mapSet($namespacePrefix, 'map100', ['yoo'=>'1','moo'=>'2']);
此命令将覆盖哈希中已存在的任何指定字段。如果键不存在,则创建一个新的包含哈希的键。如果操作成功,则结果为true,否则结果为false。
从Redis缓存中获取Redis键的值
$result = $redisConnection->get($namespacePrefix, 'f33');
根据特定Redis键的数据类型,get方法通过内部使用适当的redis命令返回值
if type of key is string, get method returns the value of the key as a string
if type of key is list, get method returns the value of the key as a numeric index array
if type of key is hash, get method returns the value of the key as an associative array
在Redis Pubsub上订阅一个频道
$result = $redisConnection->subscribe('hello');
可以通过在应用中使用subscribe方法来订阅一个频道。由于这是一个阻塞操作,建议扩展EaseAmpRedis类,然后在扩展类中的subscribe方法内编写相关业务逻辑的代码。
在Redis Pubsub上根据指定的模式订阅多个频道
$result = $redisConnection->pSubscribe('h?llo');
可以通过在应用中使用pSubscribe方法根据指定的模式('h?llo')来订阅一个或多个频道。例如:频道名称如'hello','htllo','hxllo'等。由于这是一个阻塞操作,建议扩展EaseAmpRedis类,然后在扩展类中的pSubscribe方法内编写相关业务逻辑的代码。
在Redis Pubsub上向频道发布消息
$result = $redisConnection->publish('koo','Hello');
publish方法将消息('Hello')发布到频道('koo')。如果消息成功发布到指定的频道,则所有已订阅该频道(即,WebSocket客户端)的用户将接收到该消息。
在Redis Pubsub上取消订阅特定频道
$result = $redisConnection->unSubscribe('koo');
unSubscribe方法取消用户对指定频道('koo')的订阅。如果结果是true,则用户将不会接收到之后发布到该频道的任何消息。
在Redis Pubsub上根据指定的模式取消订阅多个频道
$result = $redisConnection->pUnSubscribe('h?llo');
pUnSubscribe 方法用于将用户从所有基于指定模式('h?llo')的频道取消订阅。例如:频道名称如 'hello'、'htllo'、'hxllo' 等。如果结果为 true,则用户将不会收到发布到所有匹配该指定模式频道的任何消息。
贡献者
克里山维尼尼(krishnaveni.nimmala@invincibletechsystems.com)