我在我的python应用程序中使用redis来存储简单的值,比如计数器和时间戳列表,但是尝试获取一个计数器并将其与一个数字进行比较时遇到了一个问题。
如果我这样做了:
import redis
...
myserver = redis.Redis("localhost")
myserver.set('counter', 5)
然后试着像这样得到这个值:
if myserver.get('counter') < 10:
myserver.incr('counter')
然后我在if语句中得到一个类型错误,因为我正在比较'5‘< 10,这意味着我存储了一个整数值,并获得了一个的字符串(可以被认为是一个不同的值)。
我的问题是:这应该是这样工作的吗?我的意思是它是一个非常基本的类型,我理解如果我必须解析对象而不是int?似乎我做错了什么。
我是不是遗漏了什么配置?
有没有办法让redis返回正确的类型而不总是字符串?我这么说是因为列表和日期时间,甚至是浮点值都是一样的。
这会不会是我正在使用的redis-py客户端而不是redis本身的问题?
发布于 2012-10-25 10:30:20
从技术上讲,你需要自己解决这个问题。
但是,看看this link,特别是他们的自述文件中提到解析器和响应回调的部分,也许这是您可以使用的东西。问题是这对你来说是不是有点过头了。
发布于 2013-07-14 07:48:53
正如@favoretti所说,响应回调可以做到这一点。这一点也不复杂,只需要一行代码,一切都会迎刃而解。
In [2]: import redis
In [3]: r = redis.Redis()
In [10]: r.set_response_callback('HGET', float)
In [11]: r.hget('myhash', 'field0')
Out[11]: 4.6
对于hmget
,它返回一个字符串列表,而不是一个单独的字符串,所以您需要构造一个更全面的回调函数:
In [12]: r.set_response_callback('HMGET', lambda l: [float(i) for i in l])
In [13]: r.hmget('myhash', 'field0')
Out[13]: [4.6]
hgetall
也是如此。
发布于 2018-12-13 05:16:43
虽然使用set_response_callback
对于简单的数据类型很好,但如果你想知道存储字典、列表、元组等内容的最快、最简单的方法,并保留它们可能包含或可能不包含的python原生数据类型,我建议使用python的内置pickle
库:
# Imports and simplified client setup
>>> import pickle
>>> import redis
>>> client = redis.Redis()
# Store a dictionary
>>> to_store = {'a': 1, 'b': 'A string!', 'c': [1, True, False, 14.4]}
>>> client.set('TestKey', pickle.dumps(to_store))
True
# Retrieve the dictionary you just stored.
>>> retrieved = pickle.loads(client.get('TestKey'))
{'a': 1, 'b': 'A string!', 'c': [1, True, False, 14.4]}
这是一个简单的客户端,它将减少上面示例中的pickle
样板,并为您提供一个干净的接口,用于在Redis中存储和检索原生python数据类型:
"""Redis cache."""
import pickle
import redis
redis_host = redis.Redis()
class PythonNativeRedisClient(object):
"""A simple redis client for storing and retrieving native python datatypes."""
def __init__(self, redis_host=redis_host):
"""Initialize client."""
self.client = redis_host
def set(self, key, value, **kwargs):
"""Store a value in Redis."""
return self.client.set(key, pickle.dumps(value), **kwargs)
def get(self, key):
"""Retrieve a value from Redis."""
val = self.client.get(key)
if val:
return pickle.loads(val)
return None
redis_client = PythonNativeRedisClient()
用法:
>>> from some_module import redis_client
>>> to_store = {'a': 1, 'b': 'A string!', 'c': [1, True, False, 14.4]}
>>> redis_client.set('TestKey', to_store)
True
>>> retrieve = redis_client.get('TestKey')
{'a': 1, 'b': 'A string!', 'c': [1, True, False, 14.4]}
https://stackoverflow.com/questions/13060632
复制相似问题