溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

redis blaster怎么安裝使用

發(fā)布時(shí)間:2023-04-12 09:40:20 來(lái)源:億速云 閱讀:90 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“redis blaster怎么安裝使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“redis blaster怎么安裝使用”吧!

Rb,redis blaster,是一個(gè)為 redis 實(shí)現(xiàn)非復(fù)制分片(non-replicated sharding)的庫(kù)。它在 python redis 之上實(shí)現(xiàn)了一個(gè)自定義路由系統(tǒng),允許您自動(dòng)定位不同的服務(wù)器,而無(wú)需手動(dòng)將請(qǐng)求路由到各個(gè)節(jié)點(diǎn)。

它沒(méi)有實(shí)現(xiàn) redis 的所有功能,也沒(méi)有嘗試這樣做。您可以隨時(shí)將客戶端連接到特定主機(jī),但大多數(shù)情況下假設(shè)您的操作僅限于可以自動(dòng)路由到不同節(jié)點(diǎn)的基本 key/value 操作。

你可以做什么:

  • 自動(dòng)針對(duì)主機(jī)進(jìn)行單 key 操作。

  • 對(duì)所有或部分節(jié)點(diǎn)執(zhí)行命令。

  • 并行執(zhí)行所有這些。

安裝

rb 在 PyPI 上可用,可以從那里安裝:

$ pip install rb

配置

開始使用 rb 非常簡(jiǎn)單。如果您之前一直在使用 py-redis,您會(huì)感到賓至如歸。主要區(qū)別在于,不是連接到單個(gè)主機(jī),而是將 cluster 配置為連接到多個(gè):

rom rb import Cluster

cluster = Cluster(hosts={
0: {'port': 6379},
1: {'port': 6380},
2: {'port': 6381},
3: {'port': 6382},
4: {'port': 6379},
5: {'port': 6380},
6: {'port': 6381},
7: {'port': 6382},
}, host_defaults={
'host': '127.0.0.1',
})

在這種情況下,我們?cè)谕恢鳈C(jī)上的四個(gè)不同服務(wù)器進(jìn)程上設(shè)置了 8 個(gè)節(jié)點(diǎn)。hosts 參數(shù)是要連接的主機(jī)的映射。字典的 key 是 host ID(整數(shù)),值是參數(shù)字典。host_defaults 是為所有主機(jī)填寫的可選默認(rèn)值字典。如果您想共享一些重復(fù)的常見默認(rèn)值(在這種情況下,所有主機(jī)都連接到 localhost),這很有用。

在默認(rèn)配置中,PartitionRouter 用于路由。

路由

現(xiàn)在集群已經(jīng)構(gòu)建好了,我們可以使用 Cluster.get_routing_client() 來(lái)獲取一個(gè) redis 客戶端,它會(huì)為每個(gè)命令自動(dòng)路由到正確的 redis 節(jié)點(diǎn):

client = cluster.get_routing_client()
results = {}
for key in keys_to_look_up:
results[key] = client.get(key)

該客戶端的工作原理與標(biāo)準(zhǔn)的 pyredis StrictClient 非常相似,主要區(qū)別在于它只能執(zhí)行只涉及一個(gè) key 的命令。

然而,這個(gè)基本操作是串聯(lián)運(yùn)行的。使 rb 有用的是它可以自動(dòng)構(gòu)建 redis 管道并將查詢并行發(fā)送到許多主機(jī)。但是,這會(huì)稍微改變用法,因?yàn)楝F(xiàn)在該值無(wú)法立即使用:

results = {}
with cluster.map() as client:
for key in keys_to_look_up:
results[key] = client.get(key)

雖然到目前為止看起來(lái)很相似,但不是將實(shí)際值存儲(chǔ)在 result 字典中,而是存儲(chǔ) Promise 對(duì)象。當(dāng) map context manager 結(jié)束時(shí),它們保證已經(jīng)被執(zhí)行,您可以訪問(wèn) Promise.value 屬性來(lái)獲取值:

for key, promise in results.iteritems():
print '%s: %s' % (key, promise.value)

如果要向所有參與的主機(jī)發(fā)送命令(例如刪除數(shù)據(jù)庫(kù)),可以使用 Cluster.all() 方法:

with cluster.all() as client:
client.flushdb()

如果你這樣做,promise 值是一個(gè)字典,其中 host ID 作為 key,結(jié)果作為 value。舉個(gè)例子:

with cluster.all() as client:
results = client.info()
for host_id, info in results.iteritems():
print 'host %s is running %s' % (host_id, info['os'])

要明確針對(duì)某些主機(jī),您可以使用 Cluster.fanout() 接受要將命令發(fā)送到 host ID 列表。

API

這是公共 API 的完整參考。請(qǐng)注意,此庫(kù)擴(kuò)展了 Python redis 庫(kù),因此其中一些類具有更多功能,您需要查閱 py-redis 庫(kù)。

Cluster

class rb.Cluster(hosts, host_defaults=None, pool_cls=None, pool_options=None, router_cls=None, router_options=None)

cluster 是 rb 背后的核心對(duì)象。它保存到各個(gè)節(jié)點(diǎn)的連接池,并且可以在應(yīng)用程序運(yùn)行期間在中央位置共享。

具有默認(rèn) router 的四個(gè) redis 實(shí)例上的集群的基本示例:

cluster = Cluster(hosts={
0: {'port': 6379},
1: {'port': 6380},
2: {'port': 6381},
3: {'port': 6382},
}, host_defaults={
'host': '127.0.0.1',
})

hosts 是一個(gè)主機(jī)字典,它將 host ID 數(shù)量映射到配置參數(shù)。參數(shù)對(duì)應(yīng)于 add_host() 函數(shù)的簽名。這些參數(shù)的默認(rèn)值是從 host_defaults 中提取的。要覆蓋 pool 類,可以使用 pool_cls 和 pool_options 參數(shù)。這同樣適用于 router 的 router_cls 和 router_options。pool 選項(xiàng)對(duì)于設(shè)置 socket 超時(shí)和類似參數(shù)很有用。

  • add_host(host_id=None, host='localhost', port=6379, unix_socket_path=None, db=0, password=None, ssl=False, ssl_options=None)

將新主機(jī)添加到集群。這僅對(duì)單元測(cè)試真正有用,因?yàn)橥ǔV鳈C(jī)是通過(guò)構(gòu)造函數(shù)添加的,并且在第一次使用集群后進(jìn)行更改不太可能有意義。

  • all(timeout=None, max_concurrency=64, auto_batch=True)

扇出到所有主機(jī)。其他方面與 fanout() 完全一樣。

例子:

with cluster.all() as client:
client.flushdb()
  • disconnect_pools()

斷開與內(nèi)部池的所有連接。

  • execute_commands(mapping, *args, **kwargs)

同時(shí)在 Redis 集群上執(zhí)行與路由 key 關(guān)聯(lián)的一系列命令,返回一個(gè)新映射,其中值是與同一位置的命令對(duì)應(yīng)的結(jié)果列表。例如:

>>> cluster.execute_commands({
... 'foo': [
... ('PING',),
... ('TIME',),
... ],
... 'bar': [
... ('CLIENT', 'GETNAME'),
... ],
... })
{'bar': [],
 'foo': [,]}
  • 作為 redis.client.Script 實(shí)例的命令將首先檢查它們?cè)谀繕?biāo)節(jié)點(diǎn)上的存在,然后在執(zhí)行之前加載到目標(biāo)上,并且可以與其他命令交錯(cuò):

>>> from redis.client import Script
>>> TestScript = Script(None, 'return {KEYS, ARGV}')
>>> cluster.execute_commands({
... 'foo': [
... (TestScript, ('key:1', 'key:2'), range(0, 3)),
... ],
... 'bar': [
... (TestScript, ('key:3', 'key:4'), range(3, 6)),
... ],
... })
{'bar': [],
 'foo': []}

在內(nèi)部,F(xiàn)anoutClient用于發(fā)出命令。

  • fanout(hosts=None, timeout=None, max_concurrency=64, auto_batch=True)

用于獲取路由客戶端、開始扇出操作并 join 結(jié)果的快捷上下文管理器。

在上下文管理器中,可用的客戶端是 FanoutClient。示例用法:

with cluster.fanout(hosts='all') as client: client.flushdb()
get_local_client(host_id)
  • get_local_client(host_id)

返回特定主機(jī) ID 的本地化 client。這個(gè) client 就像一個(gè)普通的 Python redis 客戶端一樣工作,并立即返回結(jié)果。

  • get_local_client_for_key(key)

類似于 get_local_client_for_key() 但根據(jù) router 所說(shuō)的 key 目的地返回 client。

  • get_pool_for_host(host_id)

返回給定主機(jī)的連接池。

redis 客戶端使用此連接池來(lái)確保它不必不斷地重新連接。如果要使用自定義 redis 客戶端,可以手動(dòng)將其作為連接池傳入。

  • get_router()

返回 cluster 的 router 。如果 cluster 重新配置,router 將被重新創(chuàng)建。通常,您不需要自己與 router 交互,因?yàn)榧旱穆酚煽蛻舳藭?huì)自動(dòng)執(zhí)行此操作。

這將返回 BaseRouter 的一個(gè)實(shí)例。

  • get_routing_client(auto_batch=True)

返回一個(gè)路由客戶端。該客戶端能夠自動(dòng)將請(qǐng)求路由到各個(gè)主機(jī)。它是線程安全的,可以類似于主機(jī)本地客戶端使用,但它會(huì)拒絕執(zhí)行無(wú)法直接路由到單個(gè)節(jié)點(diǎn)的命令。

路由客戶端的默認(rèn)行為是嘗試將符合條件的命令批處理成批處理版本。例如,路由到同一節(jié)點(diǎn)的多個(gè) GET 命令最終可以合并為一個(gè) MGET 命令??梢酝ㄟ^(guò)將 auto_batch 設(shè)置為 False 來(lái)禁用此行為。這對(duì)于調(diào)試很有用,因?yàn)?MONITOR 將更準(zhǔn)確地反映代碼中發(fā)出的命令。

有關(guān)詳細(xì)信息,請(qǐng)參閱 RoutingClient。

  • map(timeout=None, max_concurrency=64, auto_batch=True)

用于獲取路由客戶端、開始映射操作并 join 結(jié)果的快捷上下文管理器。max_concurrency 定義在隱式連接發(fā)生之前可以存在多少未完成的并行查詢。

在上下文管理器中,可用的客戶端是 MappingClient。示例用法:

results = {}
with cluster.map() as client:
for key in keys_to_fetch:
results[key] = client.get(key)
for key, promise in results.iteritems():
print '%s => %s' % (key, promise.value)
  • remove_host(host_id)

從 client 中刪除 host。這僅對(duì)單元測(cè)試真正有用。

Clients

class rb.RoutingClient(cluster, auto_batch=True)

可以路由到單個(gè)目標(biāo)的客戶端。

有關(guān)參數(shù),請(qǐng)參見 Cluster.get_routing_client()。

  • execute_command(*args, **options)

執(zhí)行命令并返回解析后的響應(yīng)

  • fanout(hosts=None, timeout=None, max_concurrency=64, auto_batch=None)

返回映射操作的 context manager,該操作扇出到手動(dòng)指定的主機(jī),而不是使用路由系統(tǒng)。例如,這可用于清空所有主機(jī)上的數(shù)據(jù)庫(kù)。context manager 返回一個(gè) FanoutClient。示例用法:

with cluster.fanout(hosts=[0, 1, 2, 3]) as client:
results = client.info()
for host_id, info in results.value.iteritems():
print '%s -> %s' % (host_id, info['is'])

返回的 promise 將所有結(jié)果累積到由 host_id 鍵入的字典中。

hosts 參數(shù)是一個(gè) host_id 列表,或者是字符串 'all' ,用于將命令發(fā)送到所有主機(jī)。

fanout API 需要非常小心地使用,因?yàn)楫?dāng) key 被寫入不期望它們的主機(jī)時(shí),它可能會(huì)造成很多損壞。

  • get_fanout_client(hosts, max_concurrency=64, auto_batch=None)

返回線程不安全的扇出客戶端。

返回 FanoutClient 的實(shí)例。

  • get_mapping_client(max_concurrency=64, auto_batch=None)

返回一個(gè)線程不安全的映射客戶端。此客戶端的工作方式類似于 redis 管道并返回最終結(jié)果對(duì)象。它需要 join 才能正常工作。您應(yīng)該使用自動(dòng) join 的 map() 上下文管理器,而不是直接使用它。

返回 MappingClient 的一個(gè)實(shí)例。

  • map(timeout=None, max_concurrency=64, auto_batch=None)

返回映射操作的 context manager。這會(huì)并行運(yùn)行多個(gè)查詢,然后最后 join 以收集所有結(jié)果。

在上下文管理器中,可用的客戶端是 MappingClient。示例用法:

results = {}
with cluster.map() as client:
for key in keys_to_fetch:
results[key] = client.get(key)
for key, promise in results.iteritems():
print '%s => %s' % (key, promise.value)
class rb.MappingClient(connection_pool, max_concurrency=None, auto_batch=True)

路由客戶端使用 cluster 的 router 根據(jù)執(zhí)行的 redis 命令的 key 自動(dòng)定位單個(gè)節(jié)點(diǎn)。

有關(guān)參數(shù),請(qǐng)參見 Cluster.map()。

  • cancel()

取消所有未完成的請(qǐng)求。

  • execute_command(*args, **options)

執(zhí)行命令并返回解析后的響應(yīng)

  • join(timeout=None)

等待所有未完成的響應(yīng)返回或超時(shí)

  • mget(keys, *args)

返回與 key 順序相同的值列表

  • mset(*args, **kwargs)

根據(jù)映射設(shè)置 key/value。映射是 key/value 對(duì)的字典。key 和 value 都應(yīng)該是可以通過(guò) str() 轉(zhuǎn)換為 string 的字符串或類型。

class rb.FanoutClient(hosts, connection_pool, max_concurrency=None, auto_batch=True)

這與 MappingClient 的工作方式相似,但它不是使用 router 來(lái)定位主機(jī),而是將命令發(fā)送到所有手動(dòng)指定的主機(jī)。

結(jié)果累積在由 host_id 鍵入的字典中。

有關(guān)參數(shù),請(qǐng)參見 Cluster.fanout()。

  • execute_command(*args, **options)

執(zhí)行命令并返回解析后的響應(yīng)

  • target(hosts)

為一次調(diào)用臨時(shí)重新定位 client。當(dāng)必須為一次調(diào)用處理主機(jī) subset 時(shí),這很有用。

  • target_key(key)

臨時(shí)重新定位客戶端以進(jìn)行一次調(diào)用,以專門路由到給定 key 路由到的一臺(tái)主機(jī)。在這種情況下,promise 的結(jié)果只是一個(gè)主機(jī)的值而不是字典。

1.3 版中的新功能。

Promise

class rb.Promise

一個(gè)嘗試為 Promise 對(duì)象鏡像 ES6 API 的 Promise 對(duì)象。與 ES6 的 Promise 不同,這個(gè) Promise 也直接提供對(duì)底層值的訪問(wèn),并且它有一些稍微不同的靜態(tài)方法名稱,因?yàn)檫@個(gè) Promise 可以在外部解析。

  • static all(iterable_or_dict)

當(dāng)所有傳遞的 promise 都解決時(shí),promise 就解決了。你可以傳遞一個(gè) promise 列表或一個(gè) promise 字典。

  • done(on_success=None, on_failure=None)

將一些回調(diào)附加到 Promise 并返回 Promise。

  • is_pending

如果 promise 仍然等待,則為 True,否則為 False。

  • is_rejected

如果 promise 被拒絕,則為 True,否則為 False。

  • is_resolved

如果 promise 已解決,則為 True,否則為 False。

  • reason

如果它被拒絕,這個(gè) promise 的原因。

  • reject(reason)

以給定的理由拒絕 promise。

  • static rejected(reason)

創(chuàng)建一個(gè)以特定值被拒絕的 promise 對(duì)象。

  • resolve(value)

用給定的值解決 promise。

  • static resolved(value)

創(chuàng)建一個(gè)以特定值解析的 promise 對(duì)象。

  • then(success=None, failure=None)

向 Promise 添加成功和/或失敗回調(diào)的實(shí)用方法,該方法還將在此過(guò)程中返回另一個(gè) Promise。

  • value

如果它被解決,這個(gè) promise 所持有的值。

Routers

class rb.BaseRouter(cluster)

所有路由的基類。如果你想實(shí)現(xiàn)一個(gè)自定義路由,這就是你的子類。

  • cluster

引用回此 router 所屬的 Cluster。

  • get_host_for_command(command, args)

返回應(yīng)執(zhí)行此命令的主機(jī)。

  • get_host_for_key(key)

執(zhí)行路由并返回目標(biāo)的 host_id。

子類需要實(shí)現(xiàn)這一點(diǎn)。

  • get_key(command, args)

返回命令操作的 key。

class rb.ConsistentHashingRouter(cluster)

基于一致哈希算法返回 host_id 的 router。一致的哈希算法僅在提供 key 參數(shù)時(shí)才有效。

該 router 要求主機(jī)是無(wú)間隙的,這意味著 N 臺(tái)主機(jī)的 ID 范圍從 0 到 N-1。

  • get_host_for_key(key)

執(zhí)行路由并返回目標(biāo)的 host_id。

子類需要實(shí)現(xiàn)這一點(diǎn)。

class rb.PartitionRouter(cluster)

一個(gè)簡(jiǎn)單的 router,僅根據(jù)簡(jiǎn)單的 crc32 % node_count 設(shè)置將命令單獨(dú)路由到單個(gè)節(jié)點(diǎn)。

該 router 要求主機(jī)是無(wú)間隙的,這意味著 N 臺(tái)主機(jī)的 ID 范圍從 0 到 N-1。

  • get_host_for_key(key)

執(zhí)行路由并返回目標(biāo)的 host_id。

子類需要實(shí)現(xiàn)這一點(diǎn)。

exception rb.UnroutableCommand

如果發(fā)出的命令無(wú)法通過(guò) router 路由到單個(gè)主機(jī),則引發(fā)。

Testing

class rb.testing.TestSetup(servers=4, databases_each=8, server_executable='redis-server')

測(cè)試設(shè)置是生成多個(gè) redis 服務(wù)器進(jìn)行測(cè)試并自動(dòng)關(guān)閉它們的便捷方式。這可以用作 context manager 來(lái)自動(dòng)終止客戶端。

  • rb.testing.make_test_cluster(*args, **kwargs)

用于創(chuàng)建測(cè)試設(shè)置然后從中創(chuàng)建 cluster 的便捷快捷方式。這必須用作 context manager:

from rb.testing import make_test_cluster
with make_test_cluster() as cluster:
...

感謝各位的閱讀,以上就是“redis blaster怎么安裝使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)redis blaster怎么安裝使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI