zoukankan      html  css  js  c++  java
  • django连接redis

    1、首先安装redis,ubuntu下执行以下命令

    sudo  apt-get  install  redis-server

    2、安装redis库

    pip install django-redis

    3、配置django中的settings

    caches={

    ‘default’:{

    ‘backend’:‘redis_caches.cache.RedisCache’,

    'location':127.0.0.1:9999  #redis服务ip和端口,

    ‘option’:{

    'client_class':'redis_cache.client.DefaultClient',

    },

    },

    }

    REDIS_TIMEOUT=7*24*60*60
    CUBES_REDIS_TIMEOUT=60*60
    NEVER_REDIS_TIMEOUT=365*24*60*60
     
    #其实只是需要CACHES中的那几条就可以了,后面这三句可以不需要的,只是我后面的例子里需要用到,我就在这里配置了。
     
    3、进行读写操作
    from django.conf  import settings
    from django.core.cache import cache
    #read cahce user_id
    def read_from_cache(self,username)
       key='user_id_of'+username
       value=cache.get(key)
       if value==none:
             data=none
       else:
             date=json.loads(value)

       return data

    #write cahche

    def write_to_cache(self,username)

            key='user_id_of'+username

            cache.set(key,json.dumps(username),settint.NEVER_REDIS_TIMEOUT)

    4、

    通过上面的这两个方法就可以实现对redis的读取操作了,只需要将需要的字段当参数传入到方法中就好了。

    那么之前提到的memcached呢?其实也是一样的配置:

    CACHES = {
        'default': {
            'BACKEND''django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION''127.0.0.1:11211',
        }
    }

    当然用法也是和我上面的例子是一样的了。其实对于redis这样的缓存服务器来说,配置都是很简单的,而具体的使用也不难,官网上面也有很多简单明了的例子可以供我们参考,只有一点需要注意的,那就是对于要将什么样的信息保存到redis才是我们真正需要关心的。

    5、使用缓存redis开发博客系统

    Django开发博客系统redis缓存

    Redis 是一个高性能的key-value数据库。redis的出现, 很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。 它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

    目前Redis已经发布了3.0版本,正式支持分布式,这个特性太强大,以至于你再不用就对不住自己了。

    性能测试

    服务器配置:Linux 2.6, Xeon X3320 2.5Ghz

    SET操作每秒钟110000次,GET操作每秒钟81000次

    stackoverflow网站使用Redis做为缓存服务器。

    安装redis

    服务器安装篇我写了专门文章, 请参阅redis入门与安装

    django中的配置

    我们希望在本博客系统中,对于文章点击数、阅览数等数据实现缓存,提高效率。

    requirements.txt

    添加如下内容,方便以后安装软件依赖,由于在pythonanywhere上面并不能安装redis服务,所以本章只能在本地测试。

    redis==2.10.5
    django-redis==4.4.2
    APScheduler==3.1.0

    settings.py配置

    新增内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    from urllib.parse import urlparse
    import dj_database_url

    redis_url = urlparse(os.environ.get('REDISTOGO_URL', 'redis://localhost:6959'))
    CACHES = {
    'default': {
    'BACKEND': 'redis_cache.cache.RedisCache',
    'LOCATION': '{0}:{1}'.format(redis_url.hostname, redis_url.port),
    'OPTIONS': {
    'DB': 0,
    'PASSWORD': redis_url.password,
    'CLIENT_CLASS': 'redis_cache.client.DefaultClient',
    'PICKLE_VERSION': -1, # Use the latest protocol version
    'SOCKET_TIMEOUT': 60, # in seconds
    'IGNORE_EXCEPTIONS': True,
    }
    }
    }

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
    SESSION_CACHE_ALIAS = 'default'

    # 本地开发配置放在local_settings.py中
    try:
    from .local_settings import *
    except ImportError:
    pass

    local_settings.py配置

    这个是本地开发时候使用到的配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    DEBUG = True

    CACHES = {
    'default': {
    'BACKEND': 'redis_cache.cache.RedisCache',
    'LOCATION': '192.168.203.95:6379:1',
    'OPTIONS': {
    'CLIENT_CLASS': 'redis_cache.client.DefaultClient',
    # 'PASSWORD': 'secretpassword',
    'PICKLE_VERSION': -1, # Use the latest protocol version
    'SOCKET_TIMEOUT': 60, # in seconds
    'IGNORE_EXCEPTIONS': True,
    }
    }
    }

    使用方法

    cache_manager.py缓存管理器

    我们新建一个缓存管理器cache_manager.py,内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    Topic: redis缓存管理器
    """
    from ..models import Post
    from redis_cache import get_redis_connection
    from apscheduler.schedulers.background import BackgroundScheduler

    RUNNING_TIMER = False
    REDIS_DB = get_redis_connection('default')


    def update_click(post):
    """ 更新点击数 """
    if REDIS_DB.hexists("CLICKS", post.id):
    print('REDIS_DB.hexists...' + str(post.id))
    REDIS_DB.hincrby('CLICKS', post.id)
    else:
    print('REDIS_DB.not_hexists...' + str(post.id))
    REDIS_DB.hset('CLICKS', post.id, post.click + 1)
    run_timer()


    def get_click(post):
    """ 获取点击数 """
    if REDIS_DB.hexists("CLICKS", post.id):
    return REDIS_DB.hget('CLICKS', post.id)
    else:
    REDIS_DB.hset('CLICKS', post.id, post.click)
    return post.click

    def sync_click():
    """同步文章点击数"""
    print('同步文章点击数start....')
    for k in REDIS_DB.hkeys('CLICKS'):
    try:
    p = Post.objects.get(k)
    print('db_click={0}'.format(p.click))
    cache_click = get_click(p.id)
    print('cache_click={0}'.format(cache_click))
    if cache_click != p.click:
    p.click = get_click(p.id)
    p.save()
    except:
    pass

    views.py修改

    然后我们修改view.py,在相应的action里使用这个cache_manager:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from .commons import cache_manager

    def post_list(request):
    """所有已发布文章"""
    posts = Post.objects.annotate(num_comment=Count('comment')).filter(
    published_date__isnull=False).prefetch_related(
    'category').prefetch_related('tags').order_by('-published_date')
    for p in posts:
    p.click = cache_manager.get_click(p)
    return render(request, 'blog/post_list.html', {'posts': posts})

    def post_detail(request, pk):
    try:
    pass
    except:
    raise Http404()
    if post.published_date:
    cache_manager.update_click(post)
    post.click = cache_manager.get_click(post)
    热爱前端技术
  • 相关阅读:
    【多线程】工具类汇总
    【JVM】GC日志样例解读
    【Docker】
    XXS level5
    XXS level4
    XXS level3
    XXS level2
    SQLI DUMB SERIES-6
    SQLI DUMB SERIES-5
    XXS level1
  • 原文地址:https://www.cnblogs.com/lcosima/p/7061666.html
Copyright © 2011-2022 走看看