上一篇文章我们已经了解了什么是高并发,django解决高并发的方法和什么是django的缓存框架,今天我们将结合django官方文档学习dajngo缓存框架中的第一部分——设置缓存。
需要查看上一篇博客的小伙伴从这里进入:【Django实现高并发①】——什么是高并发,解决高并发的基本方法,django缓存框架
缓存系统需要少量的设置。也就是说,你必须告诉它你的缓存数据应该放在哪里 —— 是在数据库中,还是在文件系统上,或者直接放在内存中。这是一个重要的决定,会影响缓存的性能。缓存设置项位于配置文件的缓存配置中。
总的来说,使用缓存的时候我们需要告诉程序缓存数据在哪里,这样他才能找到,那么我们怎么样告诉程序缓存数据在哪里呢?留个疑问,我们往下看。
老规矩,把设置缓存部分的目录给大家放出来,接下来我们一起学习究竟如何设置缓存:
Memcached 是一个完全基于内存的缓存服务器,最初是开发的 在 LiveJournal.com 处理高负载,它被 Facebook 和 Wikipedia 等网站用于 减少数据库访问并显著提高站点性能。
Memcached 以一个守护进程的形式运行,并且被分配了指定数量的 RAM。它所做的就是提供一个快速接口用于在缓存中添加,检索和删除数据。所有数据都直接存储在内存中,因此不会产生数据库或文件系统使用的开销。
安装 Memcached 本身后,需要安装 Memcached 捆绑。有几种可用的 Python Memcached 绑定, Django 支持的绑定是 pylibmc 和 pymemcache。
简单来说,Memcached是一个缓存服务器,可以处理高负载,这就能够实现高并发了,而我们django可以使用Memcached 作为缓存后端,这样来弥补django自身在高并发方面的不足。当我们安装Memcached后,有两种方式来使用他。
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
"LOCATION": "unix:/tmp/memcached.sock",
}
}
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 实例进行通信。
Django 的缓存框架还支持使用 Redis 作为缓存后端。使用 Redis 作为缓存后端可以提供更高的性能和灵活性。
老规矩,先来了解一下什么是redis:
Redis(Remote Dictionary Server)是一个开源的内存中的数据存储和缓存系统,它也可以用作消息队列和发布/订阅系统。它被设计为高性能、可扩展和灵活的数据库解决方案。
Redis 是一个键值对存储系统,其中每个键都与一个值相关联。这些键值对可以被存储在内存中,也可以通过持久化机制保存到磁盘上。Redis 支持各种类型的值,包括字符串、哈希表、列表、集合和有序集合等。这使得 Redis 在不同场景下可以应对各种数据存储和计算需求。
Redis 具有以下特点:
- 高性能:Redis 将数据存储在内存中,因此可以实现非常快速的读写操作。它使用高效的数据结构和算法,以及异步的 I/O 操作,实现了很高的吞吐量和低延迟。
- 数据持久化:Redis 提供了两种持久化的方法,将数据保存到磁盘上以便在重启后恢复数据。一种是快照(snapshotting),它可以将内存中的数据以二进制格式保存到磁盘上;另一种是日志(append-only
file),它可以将所有写操作追加到一个日志文件中,从而保证数据的持久性。- 多种数据结构支持:Redis 不仅仅是一个简单的键值存储系统,还支持多种复杂的数据结构。例如,它可以存储和操作字符串、哈希表、列表、集合和有序集合等数据类型,提供了丰富的数据操作命令。
- 分布式支持:Redis 提供了一些分布式特性,例如主从复制(master-slave replication)、分片(sharding)和哨兵(sentinel)。这些特性使得 Redis
可以横向扩展以应对大规模的数据和高并发访问的需求。- 内置的高级功能:Redis 提供了许多高级功能,例如事务(transaction)、发布/订阅(publish/subscribe)和 Lua 脚本执行。这些功能使得开发者可以利用 Redis 来构建复杂的应用程序和解决方案。 由于其高性能、灵活性和丰富的功能,Redis在许多场景下被广泛应用,例如缓存、会话存储、实时分析、排行榜和消息队列等。
了解了什么是redis,我们来学习如何在django中使用redis。
要在 Django 中配置 Redis 缓存后端,需要进行以下步骤:
安装 Redis:首先,在服务器上安装 Redis 数据库。
安装 Python 的 Redis 库:然后,在 Django 项目所在的虚拟环境中安装 Python 的 Redis 库,可以使用以下命令:
pip install redis
这将安装 redis
库,用于在 Django 项目中与 Redis 数据库进行通信。
配置 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
。小伙伴们可以根据实际配置修改这些值。
启用缓存中间件:为了使用缓存,你需要在 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------
如果这个分享对小伙伴有用,或者小伙伴想要关注后续的分享,也可以扫一扫下面的微信公众号二维码关注一下公众号,感谢小伙伴们的关注: