zoukankan      html  css  js  c++  java
  • redis缓存使用

    什么是缓存(cache):

      在项目中没有必要每次请求都查询数据库的情况就可以使用缓存,让每次请求先查询缓存,如果命中,就直接返回缓存结果,如果没有命中,就查询数据库, 并将查询结果放入缓存,下次请求时查询缓存命中,直接返回结果,就不用再次查询数据库。

    缓存的作用?

      缓和较慢存储的高频请求缓解数据库压力,提升响应速率。

    为什么缓存可以提高响应速度?

      因为缓存时基于内存的存储的,内存的读写速率时普通SSD硬盘的至少十倍,更何况机械硬盘了:看对比图

    缓存介质?

      web项目中常用的缓存是memcached和redis,它们都支持分布式存储

    缓存一定能给项目响应速率带来较大提升吗?

      答案是不见得,要根据项目实际情况分析,有没有使用缓存的必要。在考虑使用缓存前,不妨先问问自己:

      1. 项目的读写操作比例为多少,如果是写多读少,那缓存真的比一定能帮助你,此时不妨考虑数据库分库分表,然后做MySQL的分布式集群,或者简单直接,将硬盘全部替换为SSD(如果你的公司财大气粗),反之,以读为主的项目就比较适合加缓存了

      2. 项目的访问频率高不高(用户多不多)?如果用户区区几千人或几万人,全然没有必要使用缓存,这点访问量经过网络后几乎不会造成并发,即使偶出现几万的并发,MySQL也是扛得住的,强行使用缓存反而会增加代码复杂度,甚至不容易维护,得不偿失。

      3. 数据是否要求强一致性?如果项目涉及到金钱或者重要数据,且数据频繁发生变化,不允许存在一点差异,那是否使用缓存就要慎重慎重再慎重!因为缓存适用的是对数据一致性不是特别高的项目,如果使用,需要对缓存的设计有很好的方案,非常考验技术功底

     

    说了这么多,进入正题吧,我们通过代码来模拟一下缓存的使用:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import functools
    import redis
    import time
    import json
    """
    使用redis做缓存,这里模拟一个web接口缓存的例子
    """
    
    # 这里使用redis连接池,管理redisservice的所有连接,避免每次创建关闭连接的开销
    pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
    redis_cli = redis.Redis(connection_pool=pool)
    
    def redis_cache(func):
        @functools.wraps(func)        # 为了保留原函数的属性,因为被装饰的函数对外暴露的是装饰器的属性
        def wrapper(*args,**kargs):
            start_time = time.time()
            _key = 'function-name:{},args:{},kargs:{}'.format(func.__name__,args,kargs)     #定义key的形式:函数名加与参数组成唯一的key
            result = redis_cli.get(_key)
            if result:      # redis查找到对应的key,直接返回结果
                result = json.loads(result)
                print(type(result))
                print('redis find:{},result:{}'.format(_key,result))
            else:            # redis没有查找到对应key,查询执行函数,查询mysql
                print('redis not find:{}'.format(_key))
                result = func(*args,**kargs)
                redis_cli.setex(_key,json.dumps(result),5)     #将mysql结果写入redis,并设置过期时间 单位s
            print("final result:{}".format(result))
            end_time = time.time()-start_time
            print("Total time of this query:{}".format(end_time))
            return result
        return wrapper
    
    
    @redis_cache
    def mysql_dispose(name,age):
        time.sleep(2)
        result = {'name:':name,'age':age}
        print('mysql-result:{}'.format(result))
        return(result)
    
    
    if __name__ == '__main__':
        mysql_dispose('tom',18)
    

    第一次查询:

    2秒内第2次查询:

    第3次查询:

     转自:https://www.cnblogs.com/wangbaojun/p/10716607.html

  • 相关阅读:
    C++ UFT-8和GB2312间的转换
    ssh不输入密码
    thinkpad T480安装WIN7
    删除目录下的不规则文件
    使用组合的方式来创建新类, 并可以重新定制某些类的特定行为
    使用gradle 编译生成 apk出现的问题
    android studio 使用 SVN
    Fiddler 抓取 Genymotion 数据包
    在eclipse中查看android源代码
    计算 md5
  • 原文地址:https://www.cnblogs.com/Sandy-1128/p/redis_python-0416.html
Copyright © 2011-2022 走看看