這篇文章主要講解了“redis blaster怎么安裝使用”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“redis blaster怎么安裝使用”吧!
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都網(wǎng)站設計、網(wǎng)站制作、云和網(wǎng)絡推廣、小程序開發(fā)、云和網(wǎng)絡營銷、云和企業(yè)策劃、云和品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供云和建站搭建服務,24小時服務熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
Rb,redis blaster,是一個為 redis 實現(xiàn)非復制分片(non-replicated sharding)的庫。它在 python redis 之上實現(xiàn)了一個自定義路由系統(tǒng),允許您自動定位不同的服務器,而無需手動將請求路由到各個節(jié)點。
它沒有實現(xiàn) redis 的所有功能,也沒有嘗試這樣做。您可以隨時將客戶端連接到特定主機,但大多數(shù)情況下假設您的操作僅限于可以自動路由到不同節(jié)點的基本 key/value 操作。
你可以做什么:
自動針對主機進行單 key 操作。
對所有或部分節(jié)點執(zhí)行命令。
并行執(zhí)行所有這些。
rb 在 PyPI 上可用,可以從那里安裝:
$ pip install rb
開始使用 rb 非常簡單。如果您之前一直在使用 py-redis,您會感到賓至如歸。主要區(qū)別在于,不是連接到單個主機,而是將 cluster 配置為連接到多個:
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', })
在這種情況下,我們在同一主機上的四個不同服務器進程上設置了 8 個節(jié)點。hosts 參數(shù)是要連接的主機的映射。字典的 key 是 host ID(整數(shù)),值是參數(shù)字典。host_defaults 是為所有主機填寫的可選默認值字典。如果您想共享一些重復的常見默認值(在這種情況下,所有主機都連接到 localhost),這很有用。
在默認配置中,PartitionRouter 用于路由。
現(xiàn)在集群已經(jīng)構(gòu)建好了,我們可以使用 Cluster.get_routing_client() 來獲取一個 redis 客戶端,它會為每個命令自動路由到正確的 redis 節(jié)點:
client = cluster.get_routing_client() results = {} for key in keys_to_look_up: results[key] = client.get(key)
該客戶端的工作原理與標準的 pyredis StrictClient 非常相似,主要區(qū)別在于它只能執(zhí)行只涉及一個 key 的命令。
然而,這個基本操作是串聯(lián)運行的。使 rb 有用的是它可以自動構(gòu)建 redis 管道并將查詢并行發(fā)送到許多主機。但是,這會稍微改變用法,因為現(xiàn)在該值無法立即使用:
results = {} with cluster.map() as client: for key in keys_to_look_up: results[key] = client.get(key)
雖然到目前為止看起來很相似,但不是將實際值存儲在 result 字典中,而是存儲 Promise 對象。當 map context manager 結(jié)束時,它們保證已經(jīng)被執(zhí)行,您可以訪問 Promise.value 屬性來獲取值:
for key, promise in results.iteritems(): print '%s: %s' % (key, promise.value)
如果要向所有參與的主機發(fā)送命令(例如刪除數(shù)據(jù)庫),可以使用 Cluster.all() 方法:
with cluster.all() as client: client.flushdb()
如果你這樣做,promise 值是一個字典,其中 host ID 作為 key,結(jié)果作為 value。舉個例子:
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'])
要明確針對某些主機,您可以使用 Cluster.fanout() 接受要將命令發(fā)送到 host ID 列表。
這是公共 API 的完整參考。請注意,此庫擴展了 Python redis 庫,因此其中一些類具有更多功能,您需要查閱 py-redis 庫。
cluster 是 rb 背后的核心對象。它保存到各個節(jié)點的連接池,并且可以在應用程序運行期間在中央位置共享。
具有默認 router 的四個 redis 實例上的集群的基本示例:
cluster = Cluster(hosts={ 0: {'port': 6379}, 1: {'port': 6380}, 2: {'port': 6381}, 3: {'port': 6382}, }, host_defaults={ 'host': '127.0.0.1', })
hosts 是一個主機字典,它將 host ID 數(shù)量映射到配置參數(shù)。參數(shù)對應于 add_host() 函數(shù)的簽名。這些參數(shù)的默認值是從 host_defaults 中提取的。要覆蓋 pool 類,可以使用 pool_cls 和 pool_options 參數(shù)。這同樣適用于 router 的 router_cls 和 router_options。pool 選項對于設置 socket 超時和類似參數(shù)很有用。
add_host(host_id=None, host='localhost', port=6379, unix_socket_path=None, db=0, password=None, ssl=False, ssl_options=None)
將新主機添加到集群。這僅對單元測試真正有用,因為通常主機是通過構(gòu)造函數(shù)添加的,并且在第一次使用集群后進行更改不太可能有意義。
all(timeout=None, max_concurrency=64, auto_batch=True)
扇出到所有主機。其他方面與 fanout() 完全一樣。
例子:
with cluster.all() as client: client.flushdb()
disconnect_pools()
斷開與內(nèi)部池的所有連接。
execute_commands(mapping, *args, **kwargs)
同時在 Redis 集群上執(zhí)行與路由 key 關(guān)聯(lián)的一系列命令,返回一個新映射,其中值是與同一位置的命令對應的結(jié)果列表。例如:
>>> cluster.execute_commands({ ... 'foo': [ ... ('PING',), ... ('TIME',), ... ], ... 'bar': [ ... ('CLIENT', 'GETNAME'), ... ], ... }) {'bar': [], 'foo': [,]}
作為 redis.client.Script 實例的命令將首先檢查它們在目標節(jié)點上的存在,然后在執(zhí)行之前加載到目標上,并且可以與其他命令交錯:
>>> 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)
返回特定主機 ID 的本地化 client。這個 client 就像一個普通的 Python redis 客戶端一樣工作,并立即返回結(jié)果。
get_local_client_for_key(key)
類似于 get_local_client_for_key() 但根據(jù) router 所說的 key 目的地返回 client。
get_pool_for_host(host_id)
返回給定主機的連接池。
redis 客戶端使用此連接池來確保它不必不斷地重新連接。如果要使用自定義 redis 客戶端,可以手動將其作為連接池傳入。
get_router()
返回 cluster 的 router 。如果 cluster 重新配置,router 將被重新創(chuàng)建。通常,您不需要自己與 router 交互,因為集群的路由客戶端會自動執(zhí)行此操作。
這將返回 BaseRouter 的一個實例。
get_routing_client(auto_batch=True)
返回一個路由客戶端。該客戶端能夠自動將請求路由到各個主機。它是線程安全的,可以類似于主機本地客戶端使用,但它會拒絕執(zhí)行無法直接路由到單個節(jié)點的命令。
路由客戶端的默認行為是嘗試將符合條件的命令批處理成批處理版本。例如,路由到同一節(jié)點的多個 GET 命令最終可以合并為一個 MGET 命令。可以通過將 auto_batch 設置為 False 來禁用此行為。這對于調(diào)試很有用,因為 MONITOR 將更準確地反映代碼中發(fā)出的命令。
有關(guān)詳細信息,請參閱 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。這僅對單元測試真正有用。
可以路由到單個目標的客戶端。
有關(guān)參數(shù),請參見 Cluster.get_routing_client()。
execute_command(*args, **options)
執(zhí)行命令并返回解析后的響應
fanout(hosts=None, timeout=None, max_concurrency=64, auto_batch=None)
返回映射操作的 context manager,該操作扇出到手動指定的主機,而不是使用路由系統(tǒng)。例如,這可用于清空所有主機上的數(shù)據(jù)庫。context manager 返回一個 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ù)是一個 host_id 列表,或者是字符串 'all' ,用于將命令發(fā)送到所有主機。
fanout API 需要非常小心地使用,因為當 key 被寫入不期望它們的主機時,它可能會造成很多損壞。
get_fanout_client(hosts, max_concurrency=64, auto_batch=None)
返回線程不安全的扇出客戶端。
返回 FanoutClient 的實例。
get_mapping_client(max_concurrency=64, auto_batch=None)
返回一個線程不安全的映射客戶端。此客戶端的工作方式類似于 redis 管道并返回最終結(jié)果對象。它需要 join 才能正常工作。您應該使用自動 join 的 map() 上下文管理器,而不是直接使用它。
返回 MappingClient 的一個實例。
map(timeout=None, max_concurrency=64, auto_batch=None)
返回映射操作的 context manager。這會并行運行多個查詢,然后最后 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)
路由客戶端使用 cluster 的 router 根據(jù)執(zhí)行的 redis 命令的 key 自動定位單個節(jié)點。
有關(guān)參數(shù),請參見 Cluster.map()。
cancel()
取消所有未完成的請求。
execute_command(*args, **options)
執(zhí)行命令并返回解析后的響應
join(timeout=None)
等待所有未完成的響應返回或超時
mget(keys, *args)
返回與 key 順序相同的值列表
mset(*args, **kwargs)
根據(jù)映射設置 key/value。映射是 key/value 對的字典。key 和 value 都應該是可以通過 str() 轉(zhuǎn)換為 string 的字符串或類型。
這與 MappingClient 的工作方式相似,但它不是使用 router 來定位主機,而是將命令發(fā)送到所有手動指定的主機。
結(jié)果累積在由 host_id 鍵入的字典中。
有關(guān)參數(shù),請參見 Cluster.fanout()。
execute_command(*args, **options)
執(zhí)行命令并返回解析后的響應
target(hosts)
為一次調(diào)用臨時重新定位 client。當必須為一次調(diào)用處理主機 subset 時,這很有用。
target_key(key)
臨時重新定位客戶端以進行一次調(diào)用,以專門路由到給定 key 路由到的一臺主機。在這種情況下,promise 的結(jié)果只是一個主機的值而不是字典。
1.3 版中的新功能。
一個嘗試為 Promise 對象鏡像 ES6 API 的 Promise 對象。與 ES6 的 Promise 不同,這個 Promise 也直接提供對底層值的訪問,并且它有一些稍微不同的靜態(tài)方法名稱,因為這個 Promise 可以在外部解析。
static all(iterable_or_dict)
當所有傳遞的 promise 都解決時,promise 就解決了。你可以傳遞一個 promise 列表或一個 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
如果它被拒絕,這個 promise 的原因。
reject(reason)
以給定的理由拒絕 promise。
static rejected(reason)
創(chuàng)建一個以特定值被拒絕的 promise 對象。
resolve(value)
用給定的值解決 promise。
static resolved(value)
創(chuàng)建一個以特定值解析的 promise 對象。
then(success=None, failure=None)
向 Promise 添加成功和/或失敗回調(diào)的實用方法,該方法還將在此過程中返回另一個 Promise。
value
如果它被解決,這個 promise 所持有的值。
所有路由的基類。如果你想實現(xiàn)一個自定義路由,這就是你的子類。
cluster
引用回此 router 所屬的 Cluster。
get_host_for_command(command, args)
返回應執(zhí)行此命令的主機。
get_host_for_key(key)
執(zhí)行路由并返回目標的 host_id。
子類需要實現(xiàn)這一點。
get_key(command, args)
返回命令操作的 key。
基于一致哈希算法返回 host_id 的 router。一致的哈希算法僅在提供 key 參數(shù)時才有效。
該 router 要求主機是無間隙的,這意味著 N 臺主機的 ID 范圍從 0 到 N-1。
get_host_for_key(key)
執(zhí)行路由并返回目標的 host_id。
子類需要實現(xiàn)這一點。
一個簡單的 router,僅根據(jù)簡單的 crc32 % node_count 設置將命令單獨路由到單個節(jié)點。
該 router 要求主機是無間隙的,這意味著 N 臺主機的 ID 范圍從 0 到 N-1。
get_host_for_key(key)
執(zhí)行路由并返回目標的 host_id。
子類需要實現(xiàn)這一點。
如果發(fā)出的命令無法通過 router 路由到單個主機,則引發(fā)。
測試設置是生成多個 redis 服務器進行測試并自動關(guān)閉它們的便捷方式。這可以用作 context manager 來自動終止客戶端。
rb.testing.make_test_cluster(*args, **kwargs)
用于創(chuàng)建測試設置然后從中創(chuàng)建 cluster 的便捷快捷方式。這必須用作 context manager:
from rb.testing import make_test_cluster with make_test_cluster() as cluster: ...
感謝各位的閱讀,以上就是“redis blaster怎么安裝使用”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對redis blaster怎么安裝使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!