【问题标题】:Django redis LPUSH / RPUSHDjango redis LPUSH / RPUSH
【发布时间】:2017-05-12 22:47:54
【问题描述】:

我正在使用 django-redis 后端和 django.core.cache.cache 模块。 django 缓存模块似乎不支持推送到列表和操作某些数据结构的正确功能。

用于更新 django 缓存模块中列表的隐含实现:

my_list = cache.get('my_list')
my_list.append('my value')

cache.set('my_list', my_list)

这种方法效率不高,因为整个列表都被加载到应用服务器的内存中。

Redis 支持 LPUSH / RPUSH 命令来动态更新列表。但是,看起来这些方法在 django 缓存模块中不可用。

官方的python redis客户端好像实现了这些方法。 django 有什么理由不提供这个实现?我是出于好奇而问的。可能我遗漏了一些细节?

【问题讨论】:

    标签: python django caching redis django-redis


    【解决方案1】:

    它确实支持原始客户端和命令访问,因为您必须访问原始客户端而不是使用 django 缓存。

    https://github.com/jazzband/django-redis#raw-client-access

    在某些情况下,您的应用程序需要访问原始 Redis 客户端才能使用 Django 缓存接口未公开的一些高级功能。为了避免存储用于创建原始连接的其他设置,django-redis 公开了一些函数,您可以使用这些函数获取原始客户端,重用缓存连接字符串:get_redis_connection(alias)。

    代码示例:

    >>> from django_redis import get_redis_connection
    >>> con = get_redis_connection("default")
    >>> con
    <redis.client.StrictRedis object at 0x2dc4510>
    >>> con.lpush('mylist',1)
    

    【讨论】:

    • 但不支持将对象数据(如list或dict)存储到list中。您应该在推送数据之前使用json.dumps,在弹出数据时使用json.loads。或者你可以使用lock来满足你的功能。
    • 很好奇。原始客户端是否仍然执行 Django 缓存接口完成的前缀和版本控制?
    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多