zoukankan      html  css  js  c++  java
  • 提高网站的并发、缓存

    并发

    '''
    1.CDN:一些第三方的静态文件直接访问别人的服务器
    2.精灵图:将多个小图通过UI人员拼接成一张大图,降低请求图片资源的次数
    3.数据库:可以缓存的数据,就只存在redis,将一些必须在硬盘的数据才存放在MySql,如果需要缓存,还可以利用redis做硬盘数据的内存缓存
    4.数据库自身的优化:sql优化|索引|分库分表|读写分离
    5.缓存:数据可以缓存,文件也可以缓存、页面也可以缓存,甚至整个项目都可以缓存
    6.架构:
            集群部署:nginx可以完成
            动静分离(静态资源请求专门存放静态文件的服务器)
            负载均衡(多个请求均分配给多个横向部署的服务器)
            分布式异步队列:clery分布异步框架,一个请求分多步处理用一个队列整体管理
    '''

    缓存

    '''
    缓存可以存放在:文件、数据库、内存中,通常我们开发是将缓存存放在内存的数据库中
    内存的数据库:redis与memcache
    '''

    Django中缓存的配置

    CACHES = {
        'default': {
            # 指定缓存使用的引擎
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
            # 写在内存中的变量的唯一值
            'LOCATION': 'unique-snowflake',
            # 缓存超时时间(默认为300秒,None表示永不过期)
            'TIMEOUT': 300,
            'OPTIONS': {
                # 最大缓存记录的数量(默认300)
                'MAX_ENTRIES': 300,
                # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
                'CULL_FREQUENCY': 3,
            }
        }
    }

    三种粒度缓存

    # 页面局部
    """ 由Django渲染的页面
    {% load cache %}
    {% cache 10 'name' %}
    <p>要被缓存的局部内容</p>
    {% endcache %}
    """
    
    # 单个页面
    from django.views.decorators.cache import cache_page
    @cache_page(10)  # 代表该视图函数渲染的页面被缓存10s
    def test_cache(request):
        import time
        c_time = time.time()
        return render(request, 'cache.html', locals())
    
    # 全站缓存
    MIDDLEWARE = [
        # 响应HttpResponse中设置几个headers(必须放在最上方)
        'django.middleware.cache.UpdateCacheMiddleware',
        # ...
        # 用来缓存通过GET和HEAD方法获取的状态码为200的响应(必须放在最下方)
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]
    # 缓存的时间秒数
    CACHE_MIDDLEWARE_SECONDS = 10

    Redis缓存处理Token

    登录的视图函数

    # uitls.py
    import uuid
    
    def get_token():
        return uuid.uuid4().hex
    # views.User.py
    class TestToken(ModelViewSet):
        authentication_classes = [auth.LoginAuthenticate]
    
        def get(self, request, *args, **kwargs):
            api_response = ApiResponse()
            api_response.message = '认证通过'
            return Response(api_response.api_dic)
    
    from django.core.cache import cache
    
    class UserView(ModelViewSet):
        def login(self, request, *args, **kwargs):
            api_response = ApiResponse()
            user = models.User.objects.filter(**request.data).first()
            if user:
                # 登录成功操作token
                token = get_token()
                # cache对象是缓存模块中的对象,采用的缓存引擎为redis,
                # 那cache就可以作为redis对象直接操作redis数据库,取值也要对应cache取
                object = {
                    'user': user,
                    'token': token
                }
                import pickle
                token_object = pickle.dumps(object)
                cache.set(token, token_object, 100)
                user_data = objectjson.UserJson(user).data
                api_response.message = 'login success'
                api_response.token = token
                api_response.results = user_data
                return Response(api_response.api_dic)
            api_response.status = 1
            api_response.message = 'login failed'
            return Response(api_response.api_dic)
    # urls.py
    urlpatterns = [
        url(r'^login/', views.UserView.as_view({'post': 'login'})),
        url(r'^token/', views.TestToken.as_view({'get': 'get'})),
    ]

    认证类的登录认证

    from django.core.cache import cache
    
    class LoginAuthenticate(BaseAuthentication):
        def authenticate(self, request):
            token = request.META.get('HTTP_TOKEN')
            token_data = cache.get(token)
            # 拿redis数据库缓存token
            if not token_data:
                raise AuthenticationFailed('认证失败')
            # token没有过期,将pickle序列化的数据反序列化后使用
            import pickle
            token_object = pickle.loads(token_data)
            user = token_object['use

    前端发送登录后的请求

    vue的组件

    <!--VIP.vue-->
    <template>
        <div class="vip">
            <h2>VIP 功能特区</h2>
            <p @click="atcion">登录后操作的功能</p>
            <p>{{ msg }}</p>
        </div>
    </template>
    
    <script>
        export default {
            name: "VIP",
            data: function () {
                return {
                    msg: ''
                }
            },
            methods: {
                atcion: function () {
                    let token = this.$cookie.get('token');
                    // window.alert(token);
                    if (token) {
                        // window.alert("登录后的请求")
                        let _this = this;
                        this.$ajax({
                            method: 'get',
                            url: this.$base_api + 'token/',
                            headers: {
                                TOKEN: token
                            }
                        }).then(function (response) {
                            _this.msg = response.data
                        })
    
                    } else {
                        window.alert("先登录")
                    }
    
                }
            }
        }
    </script>
    
    <style scoped>
    
    </style>

    后台CORS中间件

    from corsheaders.middleware import CorsMiddleware
    # 该中间件包中defaults.py文件default_headers加入加入 'token' 字段
  • 相关阅读:
    常用Docker命令
    Ubuntu16.04安裝最新Nvidia驱动
    (转)5分钟让你明白“软链接”和“硬链接”的区别
    Centos7 Zabbix3.2集群安装
    Kettle定时抽取两个库中的两个表到目标库SYS_OPLOG表
    Elasticsearch Java API—多条件查询(must)
    logstash采集tomcat日志、mysql错误日志
    让Logstash每次都从头读文件及常见问题
    logstash之multiline插件,匹配多行日志
    spring security积累
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10932583.html
Copyright © 2011-2022 走看看