Python redis使用hget命令存储json数据。在获取时,强制获取所有json数据以代替单个json变量

Python redis使用hget命令存储json数据。在获取时,强制获取所有json数据以代替单个json变量,python,json,django,redis,Python,Json,Django,Redis,我正在使用Redis在django项目中存储缓存数据。 下面是将缓存数据设置到Redis的代码 red = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=5, socket_timeout=2) pip = red.pipeline() cached_page = {} cached_page['content'] = page.content cached_page['header'] = page._headers cached_page[

我正在使用Redis在django项目中存储缓存数据。
下面是将缓存数据设置到Redis的代码

red = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=5, socket_timeout=2)
pip = red.pipeline()
cached_page = {}
cached_page['content'] = page.content
cached_page['header'] = page._headers
cached_page['has_tag'] = False
cached_page = json.dumps(cached_page)
pip.hset(url, 'cached_page', cached_page)
pip.execute()
工作正常,我能够成功地将数据设置到redis中。
现在我想在我的项目中的某些条件下将
has_pag
的值更新为True。
下面是我用来将
has_tag
值更新为True的代码

cached_page = red.hget(url, 'cached_page')
cached_page = json.loads(cached_page)
_content = cached_page[u'content']
_headers = cached_page[u'header']
red = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=5, socket_timeout=2)
pip = red.pipeline()
cached_page = {}
cached_page['content'] = _content
cached_page['header'] = _header
cached_page['has_tag'] = True
cached_page = json.dumps(cached_page)
pip.hset(url, 'cached_page', cached_page)
pip.execute()
它也可以正常工作,但我不想在从Redis获取数据时获取内容和标题。

请给我一个有效的解决方案。

您可以使用哈希在redis中存储dict,而不是从缓存的页面只更新一个键/值

In [1]: import redis

In [2]: pool = redis.ConnectionPool(host='localhost', port=6379, db=0)

In [3]: r = redis.Redis(connection_pool=pool)

In [4]: r.hmset('test', {1: 'a', 2: 'b'})
Out[4]: True

In [5]: r.hset('test', 2, 'c')
Out[5]: 0L

In [6]: r.hget('test', 2)
Out[6]: 'c'

您可以使用散列在redis中存储dict,而不是只更新缓存页面中的一个键/值

In [1]: import redis

In [2]: pool = redis.ConnectionPool(host='localhost', port=6379, db=0)

In [3]: r = redis.Redis(connection_pool=pool)

In [4]: r.hmset('test', {1: 'a', 2: 'b'})
Out[4]: True

In [5]: r.hset('test', 2, 'c')
Out[5]: 0L

In [6]: r.hget('test', 2)
Out[6]: 'c'

Redis不支持嵌套哈希,但您可以更改数据模型以模拟它们

简单的解决方案是将“cached_page”存储为一个单独的散列条目,并更改键以合并类型和url(例如,通过添加前缀),因此更改标记的方式如下:

red = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=5, socket_timeout=2)
red.hset('cached_page:' + url, 'has_tag', True)

但是redis散列是可用的,您可以将页面内容作为单独的键分隔(也可以使用前缀),并继续将其他页面元数据(标题、has_标记)作为散列存储。

redis不支持嵌套散列,但您可以更改数据模型以模拟它们

简单的解决方案是将“cached_page”存储为一个单独的散列条目,并更改键以合并类型和url(例如,通过添加前缀),因此更改标记的方式如下:

red = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=5, socket_timeout=2)
red.hset('cached_page:' + url, 'has_tag', True)
但是redis散列是可以使用的,您可以将页面内容作为单独的键(也可以使用前缀)分开,并继续将其他页面元数据(标题、has_标记)作为散列存储