前言:
我有一個遺留的 memcached 實體正在運行,它與 Perl 模塊互動以管理密鑰。
我可以遠程登錄到服務器以手動獲取和設定密鑰。
問題:
我正在嘗試使用 Ruby/Rails 連接到這個實體。
使用 Dalli Gem,我已成功連接到 memcached 實體。
我遇到了兩個問題。一個使用:meta協議。一個使用:binary協議。
元協議:
代碼:
dc = Dalli::Client.new("<address>:11211", socket_timeout: 2.0, protocol: :meta, namespace: 'ws')
dc.get('item_679')
輸出:
Traceback (most recent call last):
1: from (irb):2
Dalli::DalliError (Response error: ERROR)
Memcached 的日志輸出:
<32 new auto-negotiating client connection
32: Client using the ascii protocol
<32 version
>32 VERSION 1.4.4
<32 mg ws:item_679 v f
>32 ERROR
二進制協議
代碼:
dc = Dalli::Client.new("<address>:11211", socket_timeout: 2.0, protocol: :binary, namespace: 'ws')
dc.get('item_679')
輸出:
Traceback (most recent call last):
1: from (irb):5
Dalli::UnmarshalError (Unable to unmarshal value: incompatible marshal file format (can't be read))
format version 4.8 required; 5.9 given
Memcached 的日志輸出:
<38 Read binary protocol data:
<38 0x80 0x00 0x00 0x0b
<38 0x00 0x00 0x00 0x00
<38 0x00 0x00 0x00 0x0b
<38 0x00 0x00 0x00 0x00
<38 0x00 0x00 0x00 0x00
<38 0x00 0x00 0x00 0x00
<38 GET ws:item_679
>38 Writing bin response:
>38 0x81 0x00 0x00 0x00
>38 0x04 0x00 0x00 0x00
>38 0x00 0x00 0x06 0x5f
>38 0x00 0x00 0x00 0x00
>38 0x00 0x00 0x00 0x00
>38 0x00 0x00 0x00 0x00
版本
- 記憶體快取 1.4.4
- 紅寶石 2.7
- 達利3.2.2
關于為什么我的請求奇怪地通過的任何想法?
uj5u.com熱心網友回復:
看來您正在使用 1.4.4 版的 Memcached 服務器。此版本的服務器尚不支持元協議。它僅在 Memcached 1.6 中引入。
因此,只有將服務器升級到至少 Memcached 1.6.0 后,您才能使用元協議。
使用二進制協議時,您似乎可以從 Memcached 服務器讀取資料。但是,Dalli (and ActiveSupport::Cache) 寫入的資料默認使用 Ruby 的Marshal庫序列化為二進制格式。
讀取時,Dalli 會嘗試智能檢測從 Memcached 讀取的資料是否已編組,如果認為已編組,則嘗試解組。但是,如果您正在讀取二進制資料,則此啟發式可能會失敗。在這種情況下(或者如果您知道資料未編組),您可以指示 Dalli 回傳原始資料:
dc.get('item_679', raw: true)
您可以自己處理任何所需的對話/反序列化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508362.html
上一篇:Ruby版本安裝后不更新
