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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM