什么是缓存(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

redis缓存使用的更多相关文章

  1. 缓存工厂之Redis缓存

    这几天没有按照计划分享技术博文,主要是去医院了,这里一想到在医院经历的种种,我真的有话要说:医院里的医务人员曾经被吹捧为美丽+和蔼+可亲的天使,在经受5天左右相互接触后不得不让感慨:遇见的有些人员在挂 ...

  2. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...

  3. 总结:如何使用redis缓存加索引处理数据库百万级并发

    前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据, ...

  4. .NET基于Redis缓存实现单点登录SSO的解决方案[转]

    一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...

  5. Redis缓存连接池管理

    import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.Assert;import ...

  6. ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存

    基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...

  7. Windows Azure Redis 缓存服务

    8月20日,Windows Azure (中国版)开始提供Redis缓存服务,比较国际版的Microsoft Azure晚了差不多一年的时间.说实话,微软真不应该将这个重要的功能delay这么长时间, ...

  8. .NET基于Redis缓存实现单点登录SSO的解决方案

    一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...

  9. spring boot redis缓存JedisPool使用

    spring boot redis缓存JedisPool使用 添加依赖pom.xml中添加如下依赖 <!-- Spring Boot Redis --> <dependency> ...

  10. spring aop搭建redis缓存

    SpringAOP与Redis搭建缓存 近期项目查询数据库太慢,持久层也没有开启二级缓存,现希望采用Redis作为缓存.为了不改写原来代码,在此采用AOP+Redis实现. 目前由于项目需要,只需要做 ...

随机推荐

  1. 15 个 Eclipse 常用开发快捷键使用技巧

    15 个 Eclipse 常用开发快捷键使用技巧 1.alt+? 或 alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+r:打开资源列表 4.c ...

  2. [原创]Zynq AXI-CDMA的使用

    Xilinx 提供了3种DMA AXI-DMA AXI-CDMA AXI-VDMA 使用CDMA能够满足项目需求(MM-MM),DS文档介绍如下: The Xilinx LogiCORE™ IP AX ...

  3. Webpack3 从入门到放弃

    我是网络的搬运工,具体请看:Webpack 3,从入门到放弃

  4. Python OpenCV 图像相识度对比

    强大的openCV能做什么我就不啰嗦,你能想到的一切图像+视频处理. 这里,我们说说openCV的图像相似度对比, 嗯,说好听一点那叫图像识别,但严格讲, 图像识别是在一个图片中进行类聚处理,比如图片 ...

  5. 一个类,有新增元素(add)和获取元素数量(size)方法。 启动两个线程。线程1向容器中新增数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止

    方式一: /** * 两个线程要是可见的所以要加上votalile */public class Test_01 { public static void main(String[] args) { ...

  6. Hadoop的数据压缩

    一.Hadoop的数据压缩 1.概述 在进行MR程序的过程中,在Mapper和Reducer端会发生大量的数据传输和磁盘IO,如果在这个过程中对数据进行压缩处理,可以有效的减少底层存储(HDFS)读写 ...

  7. Jmeter中主要管理器功用

    不管是在使用jmeter进行性能测试还是接口自动化测试时经常用到各种管理器进行对参数的处理,但是有时候分不清几种管理器的具体用法,所以做个笔记,列一下吧(所列内容基于版本为3.2) 主要内容包含以下: ...

  8. tensor内部结构

    内部结构 1.tensor分为头信息区(Tensor)和存储区(Storage): 信息区:tensor的形状(size).步长(stride).数据类型(type),信息区占用内存较少 存储区:数据 ...

  9. Jquery weui picker 支持label和value

    万年没更新了. 最近用jquery weui. 在使用picker时需要一些问题. 就是让picker 显示label, 但是取值的时候取value用于存储. 官网例子如下 Jquery-weui 官 ...

  10. Redis安装及使用

    1.我们可以通过在官网下载tar.gz的安装包,或者通过wget的方式下载 进入要下载到的文件夹: wget http://download.redis.io/releases/redis-4.0.1 ...