Python + Memcache将数组更改为字符串

时间:2016-08-10 18:46:22

标签: python arrays memcached

我正在使用Amazon Elasticache和pythons nil模块。

pymemcache

这输出以下内容:

client = Client(('xxxx', 11211))
test=[1,2,3,4]
client.set('test_key', test)
result = client.get('test_key')

pprint.pprint(result)
pprint.pprint(test)

如您所见,memcache结果已更改为字符串。我该如何存储数组?或者将字符串转换回数组?

3 个答案:

答案 0 :(得分:1)

Memcache本身将值存储为字符串。如果需要,您可以pymemcache customize your serialization。它看起来像default,如果没有提供序列化程序,pymemcache只对值使用__str__方法:

  

值必须有 str ()方法才能将自身转换为字节   串。 Unicode对象可能是一个问题,因为Unicode上的str()   object会尝试将其编码为ASCII(如果是,则会失败)   值包含大于U + 127的代码点。你可以用一个来解决这个问题   序列化程序或只是在字符串上调用encode(使用UTF-8,for   实例)。

     

如果您打算使用除str作为值之外的任何内容,那么最好使用   使用序列化器和反序列化器。 pymemcache.serde库有   一些已经实现的序列化器,包括一个兼容的序列化器   使用python-memcache库。

我个人更喜欢pylibmc到pymemcache。它可以很好地处理非字符串值。

答案 1 :(得分:0)

pymemcache作为客户端的服务memcached仅支持字符串值。这就是默认情况下pymemcache返回一个字符串的原因。 我建议添加一个小包装器来序列化和反序列化从字符串到对象(如数组)的值。客户端支持添加自己的序列化器,如此

import json
from pymemcache.client.base import Client

def json_serializer(key, value):
    if type(value) == str:
        return value, 1
    return json.dumps(value), 2

def json_deserializer(key, value, flags):
    if flags == 1:
        return value
    if flags == 2:
        return json.loads(value)
    raise Exception("Unknown serialization format")

client = Client(('localhost', 11211), serializer=json_serializer,
            deserializer=json_deserializer)
client.set('key', [1,2,3,4])
result = client.get('key')

答案 2 :(得分:-1)

图书馆似乎希望您先将数据序列化。 https://pymemcache.readthedocs.io/en/latest/getting_started.html#serialization

也许你可以使用替代图书馆? https://github.com/pinterest/pymemcache#comparison-with-other-libraries

我不确定它是否适合您的目的,但dogpile.cache也可能值得一试。使用起来非常棒,并且已将memcached作为其后端之一。