【Django实现高并发②】——Django缓存框架之设置缓存:Memcached,Redis

1.前言

上一篇文章我们已经了解了什么是高并发,django解决高并发的方法和什么是django的缓存框架,今天我们将结合django官方文档学习dajngo缓存框架中的第一部分——设置缓存。

需要查看上一篇博客的小伙伴从这里进入:【Django实现高并发①】——什么是高并发,解决高并发的基本方法,django缓存框架

2.设置缓存

缓存系统需要少量的设置。也就是说,你必须告诉它你的缓存数据应该放在哪里 —— 是在数据库中,还是在文件系统上,或者直接放在内存中。这是一个重要的决定,会影响缓存的性能。缓存设置项位于配置文件的缓存配置中。

总的来说,使用缓存的时候我们需要告诉程序缓存数据在哪里,这样他才能找到,那么我们怎么样告诉程序缓存数据在哪里呢?留个疑问,我们往下看。

老规矩,把设置缓存部分的目录给大家放出来,接下来我们一起学习究竟如何设置缓存:
【Django实现高并发②】——Django缓存框架之设置缓存:Memcached,Redis_第1张图片

1.Memcached

Memcached 是一个完全基于内存的缓存服务器,最初是开发的 在 LiveJournal.com 处理高负载,它被 Facebook 和 Wikipedia 等网站用于 减少数据库访问并显著提高站点性能。

Memcached 以一个守护进程的形式运行,并且被分配了指定数量的 RAM。它所做的就是提供一个快速接口用于在缓存中添加,检索和删除数据。所有数据都直接存储在内存中,因此不会产生数据库或文件系统使用的开销。

安装 Memcached 本身后,需要安装 Memcached 捆绑。有几种可用的 Python Memcached 绑定, Django 支持的绑定是 pylibmc 和 pymemcache。

简单来说,Memcached是一个缓存服务器,可以处理高负载,这就能够实现高并发了,而我们django可以使用Memcached 作为缓存后端,这样来弥补django自身在高并发方面的不足。当我们安装Memcached后,有两种方式来使用他。

  1. 方式一:连接到一个通过 Unix 域套接字 (/tmp/memcached.sock) 提供服务的 Memcached 实例
CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
        "LOCATION": "unix:/tmp/memcached.sock",
    }
}
  1. 方式二:连接到在本地主机上运行的 Memcached 实例,该实例监听在默认的地址和端口(127.0.0.1:11211)上。
CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
        "LOCATION": "127.0.0.1:11211",
    }
}

看到这里,相信聪明的小伙伴关于上文中的疑问有了答案,没错,这些配置都是放在settings.py文件中的。

总结一下,使用Memcached 作为django缓存后端的第一步是安装Memcached ,第二步是在settings.py文件中添加上面的配置。
注意:安装Memcached的时候需要现在服务器上安装Memcached,然后再在Django 项目的虚拟环境中安装 Python 的 Memcached 库。这样,Django 才能使用该库与 Memcached 实例进行通信。

2.Redis

Django 的缓存框架还支持使用 Redis 作为缓存后端。使用 Redis 作为缓存后端可以提供更高的性能和灵活性。

老规矩,先来了解一下什么是redis:

Redis(Remote Dictionary Server)是一个开源的内存中的数据存储和缓存系统,它也可以用作消息队列和发布/订阅系统。它被设计为高性能、可扩展和灵活的数据库解决方案。
Redis 是一个键值对存储系统,其中每个键都与一个值相关联。这些键值对可以被存储在内存中,也可以通过持久化机制保存到磁盘上。Redis 支持各种类型的值,包括字符串、哈希表、列表、集合和有序集合等。这使得 Redis 在不同场景下可以应对各种数据存储和计算需求。
Redis 具有以下特点:

  1. 高性能:Redis 将数据存储在内存中,因此可以实现非常快速的读写操作。它使用高效的数据结构和算法,以及异步的 I/O 操作,实现了很高的吞吐量和低延迟。
  2. 数据持久化:Redis 提供了两种持久化的方法,将数据保存到磁盘上以便在重启后恢复数据。一种是快照(snapshotting),它可以将内存中的数据以二进制格式保存到磁盘上;另一种是日志(append-only
    file),它可以将所有写操作追加到一个日志文件中,从而保证数据的持久性。
  3. 多种数据结构支持:Redis 不仅仅是一个简单的键值存储系统,还支持多种复杂的数据结构。例如,它可以存储和操作字符串、哈希表、列表、集合和有序集合等数据类型,提供了丰富的数据操作命令。
  4. 分布式支持:Redis 提供了一些分布式特性,例如主从复制(master-slave replication)、分片(sharding)和哨兵(sentinel)。这些特性使得 Redis
    可以横向扩展以应对大规模的数据和高并发访问的需求。
  5. 内置的高级功能:Redis 提供了许多高级功能,例如事务(transaction)、发布/订阅(publish/subscribe)和 Lua 脚本执行。这些功能使得开发者可以利用 Redis 来构建复杂的应用程序和解决方案。 由于其高性能、灵活性和丰富的功能,Redis在许多场景下被广泛应用,例如缓存、会话存储、实时分析、排行榜和消息队列等。

了解了什么是redis,我们来学习如何在django中使用redis。

要在 Django 中配置 Redis 缓存后端,需要进行以下步骤:

  1. 安装 Redis:首先,在服务器上安装 Redis 数据库。

  2. 安装 Python 的 Redis 库:然后,在 Django 项目所在的虚拟环境中安装 Python 的 Redis 库,可以使用以下命令:

    pip install redis
    

    这将安装 redis 库,用于在 Django 项目中与 Redis 数据库进行通信。

  3. 配置 Django 缓存设置:在 Django 项目的 settings.py 文件中,找到 CACHES 设置,并进行如下修改:

CACHES = {
“default”: {
“BACKEND”: “django.core.cache.backends.redis.RedisCache”,
“LOCATION”: “redis://127.0.0.1:6379”,
}
}

通常,Redis 服务器受到身份验证的保护。为了提供Redis服务器的用户名和密码,我们的配置通常长这样:

```python
CACHES = {
 "default": {
     "BACKEND": "django.core.cache.backends.redis.RedisCache",
     "LOCATION": "redis://username:[email protected]:6379",
 }
}

如果小伙伴们想要在复制模式下设置多个 Redis 服务器,则可以 将服务器指定为分号或逗号分隔的字符串,或指定为 列表。使用多个服务器时,在第一台服务器上执行写入操作 服务器(领导者)。读取操作在其他服务器(副本)上执行 随机选择,这时候的配置长这样:

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.redis.RedisCache",
        "LOCATION": [
            "redis://127.0.0.1:6379",  # leader
            "redis://127.0.0.1:6378",  # read-replica 1
            "redis://127.0.0.1:6377",  # read-replica 2
        ],
    }
}

当然了,各个redis的密码和用户名大家自行仿照上面的格式添加。
这将告诉 Django 使用 RedisCache 作为默认的缓存后端,并将 Redis 实例的连接地址和端口设置为 localhost:6379,使用数据库索引为 0。小伙伴们可以根据实际配置修改这些值。

  1. 启用缓存中间件:为了使用缓存,你需要在 Django 项目的 MIDDLEWARE 设置中启用缓存中间件。找到 MIDDLEWARE 设置,并确保以下中间件类位于中间件列表的适当位置(MIDDLEWARE也在settings.py文件中):

    MIDDLEWARE = [
        # ...
        'django.middleware.cache.UpdateCacheMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.cache.FetchFromCacheMiddleware',
        # ...
    ]
    

    这些中间件将负责在视图执行前后进行缓存的更新和提取操作。

完成上述步骤后,小伙伴们就可以在 Django 中使用 Redis 作为缓存后端了。可以在视图或函数中使用 cache.get()cache.set() 等方法来操作 Redis 缓存。例如:

from django.core.cache import cache

def my_view(request):
    cached_result = cache.get('my_cache_key')
    if cached_result is None:
        # 如果缓存中没有结果,则执行一些计算或数据库查询等耗时操作
        result = ...
        cache.set('my_cache_key', result, 60)  # 将结果保存到缓存中,有效期为 60 秒
    else:
        result = cached_result
    # 返回结果

好了,我们已经了解了如何利用Memcached或者Redis作为django的缓存后端了,小伙伴们可以动手尝试一下,剩下的我们接着明天学。
------The End------
如果这个分享对小伙伴有用,或者小伙伴想要关注后续的分享,也可以扫一扫下面的微信公众号二维码关注一下公众号,感谢小伙伴们的关注:
【Django实现高并发②】——Django缓存框架之设置缓存:Memcached,Redis_第2张图片

你可能感兴趣的:(django,缓存,django,memcached)