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

  • 相关阅读:
    118/119. Pascal's Triangle/II
    160. Intersection of Two Linked Lists
    168. Excel Sheet Column Title
    167. Two Sum II
    172. Factorial Trailing Zeroes
    169. Majority Element
    189. Rotate Array
    202. Happy Number
    204. Count Primes
    MVC之Model元数据
  • 原文地址:https://www.cnblogs.com/Sandy-1128/p/redis_python-0416.html
Copyright © 2011-2022 走看看