>백엔드 개발 >파이썬 튜토리얼 >Python 캐시를 사용하여 데이터 액세스 속도를 향상시키는 방법

Python 캐시를 사용하여 데이터 액세스 속도를 향상시키는 방법

WBOY
WBOY앞으로
2023-05-15 22:22:121668검색

Python은 캐싱을 사용합니다

웹 애플리케이션이나 분산 시스템을 개발할 때 캐싱은 시스템 성능을 크게 향상시킬 수 있는 일반적인 솔루션 중 하나입니다. Python에서는 메모리 캐시(예: functools.lru_cache 사용) 또는 외부 저장소(예: Redis 사용)를 사용하여 캐시 기능을 구현할 수 있습니다. functools.lru_cache)或者外部存储(例如使用Redis)来实现缓存功能。

Django项目接入Redis

Django是一个非常流行的Python Web框架,其内置了很多的功能模块,包括缓存。Django框架默认的缓存后端是内存缓存,然而在实际应用中,内存缓存很容易就会出现OOM(Out of Memory)错误,因此我们需要将Django项目接入到外部的缓存服务中,例如Redis。

为了接入Redis,我们可以使用django-redis这个Django插件。首先在项目的settings.py文件中,我们需要配置Redis的连接信息,例如:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

这里我们使用了默认的django-redis缓存后端。其中LOCATION参数指定了Redis的连接地址和端口,OPTIONS参数中的CLIENT_CLASS参数指定了Redis连接客户端的类名。

接下来我们可以在代码中使用cache对象来进行缓存操作,例如:

from django.core.cache import cache
...
data = cache.get(key)
if not data:
    data = db.query(...)
    cache.set(key, data, timeout=60)

这里我们使用了cache.get来获取缓存数据,如果缓存中没有数据,则使用数据库查询操作来获取数据,并通过cache.set将数据写入缓存中。其中timeout参数指定了缓存数据的过期时间,单位是秒。

为视图提供缓存服务

在Django中,我们可以为视图提供缓存服务,以提高视图的响应速度。为了提供缓存服务,我们可以使用django.views.decorators.cache模块中提供的装饰器。

声明式缓存

cache_page装饰器可以将视图的响应结果缓存到Redis中,例如:

from django.views.decorators.cache import cache_page
...
@cache_page(60)
def my_view(request):
    ...

这里我们使用了cache_page装饰器,将视图的响应结果缓存到Redis中,过期时间为60秒。

需要注意的是,cache_page装饰器只能用于函数视图,而不能用于类视图。这是因为它是装饰函数的装饰器,而类视图的方法是不能直接装饰的。因此,Django框架提供了method_decorator来解决这个问题,method_decorator是一个装饰类的装饰器。例如:

from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
@method_decorator(cache_page(timeout=60), name='get')
class MyView(View):
    ...

这里我们使用了method_decoratorcache_page装饰器应用到类视图的get方法上。

编程式缓存

除了声明式缓存之外,我们也可以使用编程式缓存来实现对视图的缓存控制。例如:

def my_view(request):
    # 先尝试从缓存中获取数据
    data = cache.get(key)
    if not data:
        # 如果缓存中没有数据,则查询数据库
        data = db.query(...)
        # 将查询结果缓存到Redis中
        cache.set(key, data, timeout=60)
    return HttpResponse(data)

这里我们使用了cache.get来尝试从Redis中获取数据,如果没有获取到,则进行数据库查询操作,并将查询结果写入到Redis中。

需要注意的是,Django框架提供了cachecaches两个现成的变量来支持缓存操作。向cache对象发送getset消息就可以实现对缓存的读和写操作,但是这种方式能做的操作有限。如果需要更加灵活的对缓存进行操作,我们可以使用caches['default']

Django 프로젝트는 Redis에 연결됩니다

Django는 캐싱을 포함한 많은 기능 모듈이 내장된 매우 인기 있는 Python 웹 프레임워크입니다. Django 프레임워크의 기본 캐시 백엔드는 메모리 캐시입니다. 그러나 실제 애플리케이션에서는 메모리 캐시로 인해 OOM(Out of Memory) 오류가 발생할 수 있으므로 Django 프로젝트를 Redis와 같은 외부 캐시 서비스에 연결해야 합니다.

Redis에 액세스하려면 Django 플러그인 django-redis를 사용할 수 있습니다. 먼저 프로젝트의 settings.py 파일에서 Redis 연결 정보를 구성해야 합니다. 예:

from django.core.cache import caches
...
redis_cli = caches['default'].client

여기에서는 기본 django-redis 캐시 백엔드를 사용합니다. LOCATION 매개변수는 Redis의 연결 주소와 포트를 지정하고, OPTIONS 매개변수의 CLIENT_CLASS 매개변수는 Redis 연결 클라이언트의 클래스 이름을 지정합니다. .

다음으로 코드의 cache 개체를 사용하여 캐싱 작업을 수행할 수 있습니다. 예:
    rrreee
  • 여기에서는 캐시된 경우 cache.get을 사용하여 캐시 데이터를 얻습니다. 캐시에 데이터가 없으면 데이터베이스 쿼리 작업을 통해 데이터를 얻은 후 cache.set를 통해 캐시에 데이터를 씁니다. timeout 매개변수는 캐시된 데이터의 만료 시간을 초 단위로 지정합니다.

    뷰에 대한 캐싱 서비스 제공
  • Django에서는 뷰의 응답 속도를 향상시키기 위해 뷰에 대한 캐싱 서비스를 제공할 수 있습니다. 캐싱 서비스를 제공하기 위해 django.views. decorators.cache 모듈에 제공되는 데코레이터를 사용할 수 있습니다.

    선언적 캐싱
  • cache_page 데코레이터는 뷰의 응답 결과를 Redis에 캐시할 수 있습니다. 예:

    rrreee

    여기에서는 cache_page 데코레이터를 사용하여 뷰를 캐시합니다. 응답 결과는 Redis에 캐시되며 만료 시간은 60초입니다.
cache_page 데코레이터는 클래스 뷰가 아닌 함수 뷰에만 사용할 수 있다는 점에 유의하세요. 함수를 꾸미는 데코레이터이고, 클래스뷰 메소드를 직접 데코레이션할 수는 없기 때문이다. 따라서 Django 프레임워크에서는 이 문제를 해결하기 위해 method_Decorator를 제공합니다. 예:

rrreee

여기에서는 method_decator를 사용하여 cache_page 데코레이터를 클래스 뷰의 get 메서드에 적용합니다.

프로그래밍 캐싱
  • 선언적 캐싱 외에도 프로그래밍 캐싱을 사용하여 뷰의 캐시 제어를 구현할 수도 있습니다. 예:

    rrreee

    여기에서는 cache.get을 사용하여 Redis에서 데이터를 가져오려고 합니다. 데이터를 얻지 못한 경우 데이터베이스 쿼리 작업을 수행하고 쿼리 결과를 Redis에 씁니다.
  • Django 프레임워크는 캐싱 작업을 지원하기 위해 두 개의 미리 만들어진 변수인 cachecaches를 제공합니다. 캐시에 대한 읽기 및 쓰기 작업은 cache 개체에 getset 메시지를 전송하여 수행할 수 있지만, 수행할 수 있는 작업은 이 방법은 제한되어 있습니다. 캐시를 보다 유연하게 운영해야 하는 경우 caches['default']를 사용하여 지정된 캐시 서비스를 얻은 다음 이를 운영할 수 있습니다. 예:

    rrreee

    캐시 ​​관련 문제
  • 캐시는 성능 최적화에 매우 효과적인 수단이지만, 실제 애플리케이션에서는 예상치 못한 오류를 방지하기 위해 일부 캐시 관련 문제에 주의를 기울여야 합니다.

    Cache Avalanche
Cache Avalanche는 캐시에 있는 많은 양의 데이터가 동시에 만료되거나 캐시 서버가 다운되어 캐시가 무효화되어 데이터베이스에 순간적인 압력이 증가하는 현상으로, 아니면 붕괴라도. 캐시 사태를 방지하려면 다음 방법을 사용할 수 있습니다.

캐시 만료 시간을 무작위로 설정하여 많은 수의 캐시가 동시에 무효화되는 것을 방지하세요. 🎜🎜🎜🎜캐시 일관성을 보장하려면 분산 잠금을 사용하세요. 🎜🎜🎜🎜핫 데이터는 메모리 캐시에 배치하고 콜드 데이터는 Redis에 배치하는 등 다단계 캐시를 사용하여 캐시 오류로 인한 즉각적인 압력 증가를 방지합니다. 🎜🎜🎜🎜캐시 고장🎜🎜캐시 고장은 특정 캐시에 장애가 발생한 후 동시에 많은 수의 요청이 데이터베이스에 쇄도하여 데이터베이스에 순간적으로 압력이 가해지거나 심지어 붕괴되는 현상을 말합니다. 캐시 중단을 방지하기 위해 다음 방법을 채택할 수 있습니다. 🎜🎜🎜🎜뮤텍스 잠금을 사용하여 동시에 데이터베이스에 대량의 요청이 쇄도하는 것을 방지합니다. 🎜🎜🎜🎜 캐시를 미리 로드합니다. 즉, 캐시가 만료될 때 많은 요청을 피하기 위해 캐시가 만료되기 전에 미리 캐시를 새로 고칩니다. 🎜🎜🎜🎜핫스팟 데이터 캐시를 사용하여 자주 요청되는 데이터를 메모리 캐시에 배치하면 캐시가 실패할 때 많은 요청이 발생하는 것을 방지할 수 있습니다. 🎜🎜🎜🎜캐시 침투🎜🎜캐시 침투란 캐시에 필요한 데이터가 없어 데이터베이스에 직접 액세스하는 요청이 발생하여 데이터베이스에 대한 부담이 가중되거나 심지어 붕괴되는 현상을 말합니다. 캐시 침투를 방지하기 위해 다음 방법을 사용할 수 있습니다. 🎜
  • 캐시에 없는 데이터의 경우 기본값을 설정하여 데이터베이스에 대한 직접 접근을 요청하지 않도록 할 수 있습니다.

  • 블룸 필터를 사용하여 캐시에 존재하지 않는 데이터를 기록하여 데이터베이스에 직접 접근하는 것을 방지하세요.

  • 데이터베이스에 대한 불법적인 액세스 요청을 방지하려면 요청 매개변수를 확인하세요.

위 내용은 Python 캐시를 사용하여 데이터 액세스 속도를 향상시키는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제