如何将字节/切片(UInt8)存储为水晶中的字符串?



我正在通过MessagePack将一个对象编码为Bytes(即Slice(UInt8))。如何将它存储在只接受字符串的数据存储客户端(例如 Crystal-Redis)中?

Crystal 和 Redis 都应该能够处理具有无效 UTF-8 字节的字符串,因此您可以直接从切片创建一个String并将其存储到 Redis,反之亦然。

这当然不完全安全:您应该确保避免调用任何需要有效 UTF-8 字符串的字符串方法。 但除此之外,这种直接方法应该完全没问题。比使用字符串编码更快、更节省内存。

redis.set key, String.new(slice)
redis.get(key).to_slice

如果您没有其他选择将切片存储为字符串,则可以将其编码为字符串,但代价是性能降低。

有 Base64 strict_encode/解码:

encoded = An_Object.to_msgpack # Slice(UInt8)
save_to_datastore "my_stuff", Base64.strict_encode(encoded)
from_storage = get_from_datastore "my_stuff"
if from_storage
My_MsgPack_Mapping.from_msgpack( Base64.decode(from_storage) )
end

或者你可以使用 Slice#hexstring 和 String#hexbytes:

encoded = An_Object.to_msgpack # Slice(UInt8)
save_to_datastore "my_stuff", encoded.hexstring
from_storage = get_from_datastore "my_stuff"
if from_storage && from_storage.hexbytes?
My_MsgPack_Mapping.from_msgpack( from_storage.hexbytes )
end

(Crystal-Redis用户还有另一种选择:请参阅此问题。

相关内容

  • 没有找到相关文章

最新更新