【Django】 django-redis缓存配置、django-redis值自动转换为String

陆安国
2023-12-01

一、cache介绍

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存。

缓存工作原理:缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有用户来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。

Django提供了6种缓存方式:

  • 开发调试缓存
  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)

这里不多介绍,有兴趣的可以去看看官方文档:

Django’s cache framework | Django documentation | Django

应用:全站缓存、单独视图缓存

二、django使用redis:通过django-redis模块,配置cache来实现

安装:pip install django-redis

1、到settings文件中进行配置

#配置redis缓存,使用django-redis模块,重写文件缓存类中的所有方法
CACHES={
    "default":{
        "BACKEND":"django_redis.cache.RedisCache",
         #使用的redis数据
        "LOCATION":"redis://192.168.137.10:6379",
        "OPTIONS":{
            "CLIENT_CLASS":"django_redis.client.DefaultClient",
            #连接池最大数值
            "CONNECTION_KWARGS":{"max_connection":100},
            #"PASSWORD":'12334'redis的密码
        }
    }
}
2、使用方法:在视图类中或序列化器中使用

2.1、直接通过cache来使用redis数据库

       # 使用cache不需要考虑数据类型,导入cache
        from django.core.cache import cache
        #使用通过cache操作到redis,通过cache操作redis数据库
        cache.set('name','lqz1') 

2.2、通过拿到redis的链接操作redis数据库,跟直接操作redis数据库的语法一样,要考虑数据类型

        from django_redis import get_redis_connection
        con = get_redis_connection('default')
        con.set('name','lhz',ex=5*60)
 

3、django-redis值自动转换为String

Python在于Redis交互,存进去的是字符串类型的数据,取出来却是字节类型(Byte)的,这是由于python3的与Redis交互的驱动问题,Python2取出来的就是字符串类型的。那么针对这种情况,我们常常需要对取出的数据进行decode操作,如下:

conn = get_redis_connection()
code = conn.get(phone)
if not code:
    raise ValidationError('验证码过期')
# 配置"decode_responses": True 后就不需要每次都decode('utf-8)
if value != code.decode('utf-8'):
    raise ValidationError('验证码错误')

通过decode将Byte转换为字符串类型,但是每次都这么做比较繁琐。因此,在用django-redis时,可以对其进行配置,使得自动转换。

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

            "CONNECTION_POOL_KWARGS": {

                "decode_responses": True,

                "max_connections": 100

                },

                # "PASSWORD": "密码",
        }
    }
}

我们通过对连接池参数 decode_responses进行配置为True,从而实现自动转换。
 

 类似资料: