官方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)动态创建;

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

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

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

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

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

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

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

指定“retry_interval”参数

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

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

指定“lazy_connect”参数

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

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

指定“connect_timeout”参数

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

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

指定“read_timeout”参数

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

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

在Redis.ini中定义阵列

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

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

用法

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

  1. $ra = new RedisArray("users");
  2. $ra->set("user1:name", "Joe");
  3. $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

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

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

迁移密钥

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

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

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

运行此代码将:

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

Multi/exec

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

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

限制

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

Array info

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

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

运行单元测试

  1. $ cd tests
  2. $ ./mkring.sh start
  3. $ php array-tests.php

phpredis Redis阵列 Redis Arrays的更多相关文章

  1. 转:Windows下PHP7安装Redis和Redis扩展phpredis

    原文地址:Windows下PHP7安装Redis和Redis扩展phpredis Windows下PHP7安装Redis和Redis扩展phpredis 2016-06-08 17:53:00 标签: ...

  2. CentOS下安装Redis及Redis的PHP扩展

    1.安装Redis 1.1 如果没有安装wget,安装wget yum install wget 1.2 在http://redis.io/download页面查看redis版本,并下载安装 wget ...

  3. redis/php redis扩展 安装

    作者:silenceper 日期:2013-10-03 原文地址: http://silenceper.com/archives/952.html 我是在CentOS 6.3 中进行的. 使用到的软件 ...

  4. windows下与linux下安装redis及redis扩展

    1.        Redis的介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起 ...

  5. 搭建LNAMP环境(五)- PHP7源码安装Redis和Redis拓展

    上一篇:搭建LNAMP环境(四)- 源码安装PHP7 一.安装Redis 1.创建redis用户组和用户 groupadd redis useradd -r -g redis -s /sbin/nol ...

  6. Redis以及Redis的php扩展安装无错版

    安装Redis 下载最新的 官网:http://redis.io/  或者  http://code.google.com/p/redis/downloads/list 第一步:下载安装编译 #wge ...

  7. Linux安装redis及redis的php扩展。

    ------ redis安装,启动服务,开机启动,打开redis客户端 ------ yum install -y redis systemctl start redis systemctl enab ...

  8. springboot+shiro+redis(单机redis版)整合教程-续(添加动态角色权限控制)

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(单机redis版)整合教程 3. springboot+shiro+redis(集群re ...

  9. 【Redis】Redis事务详解,Redis事务支持回滚(不支持悲观锁)

    1.redis事物参考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc (php操作red ...

随机推荐

  1. 时间mysql

    查询一天/今天: select * from table where to_days(column_time) = to_days(now()) select * from table where d ...

  2. MATLAB 条形图添加多个图例

    MATLAB 条形图添加多个图例: 1)只有一个图例: 2)两个图例:

  3. 分析轮子(十)- HashMap.java 之概念梳理

    注:玩的是JDK1.7版本 一:还是原来的风格,先上一下类的继承关系图,这样能够比较清楚的知道此类的相关特性 二:HashMap.java 的代码比较难看,所以,我看了几天,写的话也分开来写,这样能表 ...

  4. 找不到指定的 VM 安装:类型 标准 VM,名称 jre7

    问题背景是这样 原来使用的是jre7.0.55,后来为了安装使用 layabox IDE ,然后装了jdk_8u144 之后需要切换环境变量 之后java项目调试的时候重新设置了jdk,没问题. 直到 ...

  5. redis学习 (key)键,Python操作redis 键 (二)

    # -*- coding: utf-8 -*- import redis #这个redis 连接不能用,请根据自己的需要修改 r =redis.Redis(host=") 1. delete ...

  6. [rook] rook的控制流

    以下是rook为一个pod准备可用块存储的过程: 1. rook operator运行,并且在k8s每台机器上运行一个rook agent的pod: 2. 用户创建一个pvc,并指定storagecl ...

  7. js中定义配置文件

    var config = (function($){ $.testConfig = { contextPath:'http://localhost:8080/test', maps:[ {id:'ma ...

  8. hive建表报错:Specified key was too long; max key length is 767 bytes,hadoophive

    情况描述 Hive建表时报错,元数据存储在mysql中. 报错信息 如下: FAILED: Execution Error, bytes com.mysql.jdbc.exceptions.jdbc4 ...

  9. java.exe和javaw.exe的区别

    相同点:二者都是Java的虚拟机,用来执行Java程序 区别: 1. javaw.exe运行程序时不会输出控制台信息 (注:“w”就是window的意思). 使用案例  start.bat(y以下代码 ...

  10. SpringBoot系统列 5 - 接口版本控制、SpringBoot FreeMarker模板引擎

    接着上篇博客的代码继续写 1.接口版本控制 一个系统上线后会不断迭代更新,需求也会不断变化,有可能接口的参数也会发生变化,如果在原有的参数上直接修改,可能会影响线上系统的正常运行,这时我们就需要设置不 ...