• phpredis Redis阵列 Redis Arrays


    官方URL:https://github.com/phpredis/phpredis/blob/master/arrays.markdown#readme

     2017年10月29日20:44:01

    Redis数组是一个孤立的命名空间,其中的键以某种方式相关。 密钥分布在多个Redis实例中,使用一致的散列。 散列函数用于在数组中扩展键以保持均匀分布。 此功能是由A + E Networks大力赞助的结果。

    数组由以下组成:

    • Redis主机列表
    • 密钥提取功能,用于对密钥的部分进行散列,以便在相同的节点上分发相关的密钥(可选)。 这是由“功能”选项设置的
    • 先前在环中的节点列表,仅在添加或删除节点之后才存在。 当读取命令发送到阵列(例如,GET,LRANGE ...)时,首先在主环中询问密钥,然后在主环中找到密钥。 可选地,当发生这种情况时,可以自动迁移密钥。 写命令将始终进入主环。 这是由“上一个”选项设置的。
    • 每个节点的Redis集合形式的可选索引,用于在添加或删除节点时迁移密钥; 由“index”选项设置。
    • 可以通过“autorehash”选项设置添加或删除节点来自动重新排列阵列的选项。

    创建一个阵列

    有几种创建Redis数组的方法; 它们可以在redis.ini中使用新的RedisArray(string $ name)来预定义;或者使用新的RedisArray(数组$ hosts,array $ options)动态创建;

    声明一个包含节点列表的新数组

    $ra = new RedisArray(array("host1", "host2:63792", "host2:6380"));
    

    声明一个包含节点列表的新数组和一个提取键的一部分的函数

    function extract_key_part($k) {
        return substr($k, 0, 3);	// 仅在前3个字符上散列
    }
    $ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("function" => "extract_key_part"));
    

    在添加或删除节点时定义“上一个”数组。

    当一个新的节点被添加到一个数组,phpredis需要知道它。 旧的节点列表成为“上一个”数组,新的节点列表用作主环。 在添加节点之后,一些读取命令将指向错误的节点,并且将需要查找上一个环中的密钥

    // 将host3添加到包含host1和host2的环中。 如果主环中没有找到数据,则读命令将在前一个环中显示
    $ra = new RedisArray(array("host1", "host2", "host3"), array("previous" => array("host1", "host2")));
    

    指定“retry_interval”参数

    retry_interval用于指定重新连接尝试之间的延迟(以毫秒为单位),以防客户端与服务器断开连接

    $ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("retry_timeout" => 100));
    

    指定“lazy_connect”参数

    当集群有许多分片但不一定是必须一起使用时,此选项很有用

    $ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("lazy_connect" => true));
    

    指定“connect_timeout”参数

    connect_timeout值为double,用于在RedisArray中创建redis套接字连接时指定超时秒数

    $ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("connect_timeout" => 0.5));
    

    指定“read_timeout”参数

    read_timeout值为double,用于在等待服务器响应时指定超时时间。

    $ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("read_timeout" => 0.5));
    

    在Redis.ini中定义阵列

    因为php.ini参数必须预定义,Redis数组必须共享相同的.ini设置

    // 列表可用的Redis阵列
    ini_set('redis.array.names', 'users,friends');
    
    // set host names for each array.
    ini_set('redis.arrays.hosts', 'users[]=localhost:6379&users[]=localhost:6380&users[]=localhost:6381&users[]=localhost:6382&friends[]=localhost');
    
    // set functions
    ini_set('redis.arrays.functions', 'users=user_hash');
    
    // use index only for users
    ini_set('redis.arrays.index', 'users=1,friends=0');
    

    用法

    Redis数组可以像Redis对象一样使用:

    $ra = new RedisArray("users");
    $ra->set("user1:name", "Joe");
    $ra->set("user2:name", "Mike");
    

    键哈希

    默认情况下,为了与其他库兼容,phpredis将尝试在密钥名称中查找包含在花括号中的子字符串,并使用它来分发数据。

    例如,“{user:1}:name”和“{user:1}:email”的密钥将被存储在相同的服务器上,只有“user:1”将被散列。 您可以使用“function”选项在redis数组中提供自定义函数名称; 每当一个键都需要散列时,这个函数将被调用。 它应该使用一个字符串并返回一个字符串

    自定义密钥分发功能

    为了手动控制键的分配,您可以提供一个自定义函数或闭包,返回服务器编号,这是创建RedisArray对象的服务器阵列中的索引。

    例如,使用新的RedisArray(数组(“us-host”,“uk-host”,“de-host”),array(“distributor”=>“dist”))来设置一个RedisArray对象; 并写一个名为“dist”的函数,对于所有应该在“de-host”服务器上的密钥将返回2

    $ra = new RedisArray(array("host1", "host2", "host3", "host4", "host5", "host6", "host7", "host8"), array("distributor" => array(2, 2)));
    

    这宣称我们从2个碎片开始,移动到4个碎片。 初始碎片数为2,重塑级别(或迭代次数)为2

    迁移密钥

    当一个节点被添加或从一个环中删除时,RedisArray实例必须用“先前的”节点列表来实例化。对$ ra - > _ rehash()的单个调用将导致根据新的节点列表重新分配所有密钥。将回调函数传递给_rehash()可以跟踪该操作的进度:该函数使用节点名称和要检查的密钥数量进行调用。 _rehash(function($ host,$ count){...});.
    
    可以通过在构造函数选项中设置“autorehash”=> TRUE来自动执行此过程。当它们需要从上一个数组读取时,这将导致键被迁移。
    
    为了迁移密钥,必须对其进行检查和重新打包。如果设置了“索引”选项,则每个节点单个键将列出所有键。否则,KEYS命令用于列出它们。如果提供了“先前”的服务器列表,则当当前环中找不到键时,它将被用作备份环。写入将永远转到新的戒指,而读取将首先进入新的环,并将第二个环作为备份。

     

    支持添加和/或删除多个实例

    $ra = new RedisArray("users"); // 从redis.ini加载一个新的配置,使用“.previous”列表
    $ra->_rehash();
    

    运行此代码将:

    • 使用更新的节点列表创建一个新的环。
    • 按服务器服务器,查找上一个节点列表中的所有密钥。
    • 重新刷新每个键,并将其移动到另一个服务器。
    • 使用新的节点列表更新数组对象

    Multi/exec

    Multi / exec仍然可用,但必须在单个节点上运行:

    $host = $ra->_target("{users}:user1:name");	// find host first
    $ra->multi($host)	// then run transaction on that host.
       ->del("{users}:user1:name")
       ->srem("{users}:index", "user1")
       ->exec();
    

    限制

    使用跨多个键的Redis命令时,关键数组不能保证。 除了使用MGET,MSET和DEL之外,还将使用单个连接,并在其中读取或写入所有的键。 在RedisArray对象上运行KEYS()将在每个节点上执行命令,并返回关键字数组,按主机名索引

    Array info

    RedisArray对象提供了几种帮助了解集群状态的方法。 这些方法从下划线开始

    • $ra->_hosts() → 返回所选数组的主机列表
    • $ra->_function() → 返回在一致的散列过程中用于提取关键部分的函数的名称
    • $ra->_target($key) → 返回要用于某个键的主机
    • $ra->_instance($host) → 返回连接到特定节点的redis实例; 与_target一起使用以获取单个Redis对象

    运行单元测试

    $ cd tests
    $ ./mkring.sh start
    $ php array-tests.php
  • 相关阅读:
    【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    107. Binary Tree Level Order Traversal II
    109. Convert Sorted List to Binary Search Tree
    108. Convert Sorted Array to Binary Search Tree
    110. Balanced Binary Tree
    STL容器迭代器失效问题讨论
    113. Path Sum II
    112. Path Sum
  • 原文地址:https://www.cnblogs.com/zx-admin/p/7750609.html
Copyright © 2020-2023  润新知