Redis Arrays

来自地址:https://github.com/phpredis/phpredis/blob/master/arrays.markdown#readme

扩展原文件arrays.markdown也说明了redis arrays用法。英文不好,见谅。

一个Redis的数组是个孤立的命名空间,在其中键以某种方式相关。键被分布在多个Redis的实例上,使用一致的散列(hash)。一个哈希函数用于散布keys在array里,以保持均匀分布。这个特性的加入是一个慷慨的赞助商帮助的结果A+E Networks.

一个array是由以下内容组成:

  • Redis的主机列表。
  • 一个“键”提取函数,用于散列一个key的部分,以便发布关联的keys在同一节点(可选)。这是由“function”的选项设置。
    •   eg: 如下key: key_abc, key_ccd,key_ecffff, 可以只散列头三个key,这样他们会散列到一个节点。
  • 以前在环中的节点列表,节点被添加或删除后才呈现。当读命令被发送到array(例如,GET,LRANGE ...),键首先在主环queryied,如果它在主环没有被发现则在二级环。或者,发生这种情况时该键可以自动迁移。写命令会一直去主环。This is set by the "previous" option.
  • 一个可选索引在每一个设置的redis节点,用于当节点被添加或删除时迁移key.在“index”选项设置。
  • 一个选项来自动rehash的数组当节点添加或删除,由“autorehash”选项设置。

创建一个数组

有建立Redis阵列的多种方式; 它们可以被预先定义在redis.ini使用新RedisArray(string $name);或使用动态创建新RedisArray(array $hosts, array $options);

声明新阵列节点的列表 - Declaring a new array with a list of nodes

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

声明新阵列节点列表和一个函数来提取key 的一部分

function extract_key_part($k) {
return substr($k, 0, 3); // hash only on first 3 characters.
}
$ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("function" => "extract_key_part"));

定义“以前的”阵列时,节点被添加或删除。-Defining a "previous" array when nodes are added or removed.

当一个新的节点添加到一个数组,phpredis需要知道它。节点的旧列表变成“previous”数组,节点的新列表作为主环。当一个节点已添加后,一些读命令将指向错误的节点,此时将需要在先前的环查找key。

// adding host3 to a ring containing host1 and host2. Read commands will look in the previous ring if the data is not found in the main ring.
$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”参数

此选项很有用。当一个集群里有很多shards,但不是他们没必要同时使用。

//是否在需要操作某个Redis instance上的数据时,才建立连接
$ra = new RedisArray(array("host1", "host2:63792", "host2:6380"), array("lazy_connect" => true));

在Redis.ini定义数组

由于php.ini中的参数必须预先定义,Redis的数组都必须共享相同的.ini设置。

// list available Redis Arrays
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 arrays 可以像Redis对象那样使用:

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

键散列 - Key hashing

默认情况下,为了与其他库兼容,phpredis将尝试找到key name中的大括号括起来的子串,并用它来分发数据。

例如,键“{user:1}:name”和“{user:1}:email”将被存储在同一台服务器上,因为只有“user:1”将被散列。您可以在Redis的阵列“function”选项提供自定义的函数名; 这个函数都会被调用的关键需要被散列的时间。它应该采取一个字符串,并返回一个字符串。

自定义键分布函数 - Custom key distribution function

为了手工的控制键的分布,就可以提供一个自定义function或闭包,返回服务器号 - 即 创建 RedisArray对象时 服务器数组的索引。

例如,实例化一个RedisArray对象new RedisArray(array("us-host", "uk-host", "de-host"),array("distributor" => "dist"));写一个调用的函数“DIST”将返回2为所有的键应该结束于“de-host”服务器上。

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

此声明,我们开始与2碎片,并转移到4,然后8碎片。初始碎片的数目为2和resharding水平(或迭代次数)为2。

迁移键 - Migrating keys

当一个节点从环添加或删除,RedisArray实例必须被实例与节点的“previous”列表中。一个单独的调用 `$ra->_rehash()`使所有的key根据新列表的节点重新分配。传递一个回调函数到_rehash()使得可以跟踪操作的进度:该函数参数是要检查的 节点名称 和 键数量 ,

e.g. `_rehash(function ($host, $count){ ... });`

可以自动完成这一过程,通过设置'autorehash'=> TRUE在构造函数中的选项。这将导致键的迁移当需要将它们从先前阵列读取时。

为了迁移按键,它们都必须进行检查和重新处理。如果设置了“index”选项,一个key每个节点列出目前所有键。否则,KEYS命令被用于列出它们。

如果提供服务器的“先前”列表中,将使用它作为备份环时密钥不能在当前的环中找到。写操作会一 ​​直去新环,而读取将进入新的环第一,和第二环作为备份。

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

$ra = new RedisArray("users"); // load up a new config from redis.ini, using the “.previous” listing.
$ra->_rehash();

运行该代码:

  • 创建一个节点的更新列表中选择一个新的环。
  • 通过服务器服务器,查找在节点的前一个列表中的所有键。
  • 老调重弹每个按键,并可能将其移动到另一台服务器。
  • 更新与节点的新列表数组对象。

Multi/exec

多/ 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();

限制 - Limitations

使用跨越多个键的Redis的命令时,key arrays没有提供任何保证。除了使用MGET,MSET,和DEL的情况。一个单一的实例将被使用,并读出或写入存在的所有键。在RedisArray对象中运行键()将在每个节点上执行命令和返回键的关联数组,通过主机名进行索引。

阵列信息

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

  • $ra->_hosts() → 返回所选阵列的主机的
  • $ra->_function() → 返回用于在一致的散列提取关键部位的功能的名称。
  • $ra->_target($key) → 返回到用于规定密钥的主机。
  • $ra->_instance($host)→ 返回连接到特定的节点Redis的实例; 与使用_target得到一个Redis的对象。

运行单元测试

$ cd tests
$ ./mkring.sh start
$ php array-tests.php

 

phpredis -- Redis Arrays用法的更多相关文章

  1. phpredis Redis阵列 Redis Arrays

    官方URL:https://github.com/phpredis/phpredis/blob/master/arrays.markdown#readme 2017年10月29日20:44:01 Re ...

  2. 30个php操作redis经常用法代码样例

    这篇文章主要介绍了30个php操作redis经常用法代码样例,本文事实上不止30个方法,能够操作string类型.list类型和set类型的数据,须要的朋友能够參考下 redis的操作非常多的,曾经看 ...

  3. redis基本用法

    java连接redis基本用法 package Redis;    import java.util.HashMap;  import java.util.List;  import java.uti ...

  4. Redis详细用法

    Redis详细用法 1.redis启动命令 本机Redis 安装路径是在usr/local/redis 目录下 启动命令: ./redis-server redis.conf(启动时指定配置文件) 测 ...

  5. phpredis Redis集群 Redis Cluster

    官方url: https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#readme 2017年10月29日20:44:25 ...

  6. Redis HyperLogLog用法简介

    (1)HyperLogLog简介 在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 ...

  7. Redis常见用法

    using ServiceStack.Redis;using System;using System.Collections.Generic;using System.Linq;using Syste ...

  8. spring data redis RedisTemplate操作redis相关用法

    http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

  9. Redis基础用法、高级特性与性能调优以及缓存穿透等分析

     一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...

随机推荐

  1. hdfs命令大全

    hdfs常用命令: 第一部分:hdfs文件系统命令 第一类:文件路径增删改查系列: hdfs dfs -mkdir dir  创建文件夹 hdfs dfs -rmr dir  删除文件夹dir hdf ...

  2. AssertionError

    (1)p1 = multiprocessing.Process(test1)p2 = multiprocessing.Process(target=test2) 错误: p1缺少target,应为(t ...

  3. NO.6:自学python之路------面向对象、内存持久化

    引言 虽然加速学习了,可是还是感觉进度不够快,担心.还得准备毕业论文,真是焦虑. 正文 面向对象 编程是程序员用特定语法+数据结构+算法组成的代码,告诉计算机如何执行任务的过程.对不同的编程方式的特点 ...

  4. du命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/linuxnews/article/details/51207738 导读du命令是检查硬盘使用情况,统计文件或目录及子目录 ...

  5. 前端_JQuery

    使用参考:http://jquery.cuishifeng.cn/ 目录 jQuery是什么 jQuery对象 寻找元素(选择器和筛选器) 选择器 表单属性选择器 筛选器 操作元素(属性.css.文档 ...

  6. Daily Scrum 11.15

    今日完成任务: 1.在回答页面显示用户的相关信息 2.重写了搜索方法,并在自己的Demo网站测试成功 3.修改问题实体属性,加入悬赏积分:并在问题列表页面显示问题悬赏分数 遇到困难:一个是对于学长的搜 ...

  7. <<梦断代码>>读后感

    <梦断代码>中对软件工程所面临的种种困难与艰难的描述,即便再过5年读也许都不过时.因为正如原作者所说,书中描写的是一队人马并肩扛起代码大石,虽历经磨难仍欲将其推上山顶的故事,而正是这种故事 ...

  8. Beta冲刺 (7/7)

    队名:天机组 组员1友林 228(组长) 今日完成:封装代码 明天计划: 剩余任务:优化网络通讯机制 主要困难:暂无 收获及疑问:暂无 组员2方宜 225 今日完成:优化了一部分活动 明天计划:剩余活 ...

  9. week3c:个人博客作业

    程序测试: 一个基本的测试. 在Visual Studio 2013 中使用C++单元测试 操作如下: 这是我学到的过程. 有复杂程序的测试.以后有时间再弄.

  10. 关于Keil C51中“ERROR L107: ADDRESS SPACE OVERFLOW ”的总

    最近写一个关于单片机播放音乐的程序,出现如下错误: *** ERROR L107: ADDRESS SPACE OVERFLOW ... ... Program Size: data=167.6 xd ...