【问题标题】:Redis cache and overall processRedis缓存及整体流程
【发布时间】:2017-10-27 13:56:15
【问题描述】:

我无法理解使用 redis 作为缓存的应用程序的开始到结束调用过程。假设一个应用程序有一个数据库,例如 SQL,并且正在使用 redis 来缓存该进程的时间是如何工作的?据我了解,redis 调用 SQL DB 以缓存数据和 UI 调用并直接从 redis 使用该数据,因此限制了对 SQL DB 的调用。通常,redis 何时调用数据库以获取其数据?它如何与 SQL DB 保持同步?我只是想了解这个高水平。谢谢!

【问题讨论】:

    标签: sql-server database caching redis


    【解决方案1】:

    Redis 只是一个缓存,它提供高速数据存储,而数据库速度较慢但更可靠且功能更多。您的应用程序负责从 Redis 获取数据,如果找不到,则从数据库中提取数据并将其添加到 Redis,并使用适当的过期和失效机制。

    【讨论】:

    • 处理一个大型应用程序通常需要多少个redis实例?
    • "一根绳子有多长?"我几乎没有足够的信息来回答这个问题,这不是 SO 的问题。这取决于“大型”应用程序的含义、用途、数据量、频率以及可用于 redis 实例的资源。
    【解决方案2】:

    让我们看一个简化的例子。让我们考虑一个假设的 Python 应用程序,它使用 Redis 来缓存用户对象。用户对象在 Redis 中以 Hash 数据类型的键 user:{id} 缓存。用户数据的记录系统存储在关系数据库中。 id是一个整数,pk在db中生成。

    要获取用户,我们将执行如下代码:

    # r = redis.StrictRedis(hostname)
    def get_user(r, id):
        key = "user:{}".format(id)
        user = r.hgetall(key)
        if user is None:
            return fetch_user_from_db(id)
        else:
            return user
    

    要编写一个用户,我们将执行类似于:

    # r = redis.StrictRedis(hostname)
    def update_user(r, user):
        key = "user:{}".format(user['id'])
        r.delete(key)
        write_user_to_db(user)
    

    这个简化的示例省略了在分布式环境中保持缓存和数据库一致性的许多细节,但对于单个节点,这是基本过程。你的应用必须处理缓存的细节,检查缓存命中和写无效。

    【讨论】:

      【解决方案3】:

      我自己从未遇到过 Redis 调用 SQL DB 的场景。由于 Redis 是一个将自己的数据保存在 RAM 中的键值对存储,因此它通常直接用于应用程序的缓存。在这些情况下,根本没有 SQL DB 的参与。

      Redis 的最大优势在于,许多操作在恒定时间内返回数​​据,与存储的元素数量无关。这就是为什么它非常适合许多需要快速响应时间的用例,例如缓存和锁定机制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-24
        • 2018-11-23
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 2018-01-30
        • 2011-08-15
        相关资源
        最近更新 更多