redis缓存

在互联网应用中经常需要用redis来缓存热点数据。

  1. redis数据在内存,可以保证数据读取的高效,接近每秒数十万次的吞吐量

  2. 减少下层持久层数据库读取压力,像mongodb,每秒近千次读取就已经表示压力山大

  3. redis单进程单线程运行,天然具备读写的原子性,避免并发导致脏读等问题

使用

一般的使用方式是

读取

  1. 先get读取redis,没有读到即未命中则读取db

  2. 将db读到的数据set写入redis,返回数据

更新

  1. del掉redis的数据,

  2. 写数据库

之所以先del,是防止写数据成功但因网络原因没有更新redis,导致数据不一致。而先del则即使写数据库失败也不会有副作用。

有些在使用时将del换为set,就是在更新时直接更新缓存,这可以一定程度提高缓存的命中率。但在并发更新时会有概率导致redis跟数据库数据不一致,同时也不能避免上面说的写数据库失败的副作用。另外作为热点数据的缓存,这里set会导致缓存部分非热点的数据,内存有限时反而降低命中率。

并发问题

按照上面的使用方式基本可以达到使用缓存的目的,但扔存在并发问题,问题出在上面读取过程两个步骤之间,有另外一个线程执行了更新,那2执行写入redis就会用老数据覆盖掉更新的数据。如何解决呢?采用类似乐观锁的原理,在del时不再是简单的删除key,而是写入一个空值标识f1,在未命中写缓存时将get到的标识f1作为参数给redis,只有redis当前value与f1一致时才执行set。基本时序图如下:

 
redis数据缓存时序图.png

Redis做MySQL的缓存是怎么做的?

比如有一张表,我MySQL查询后要写入Redis做缓存,那用Redis怎么存储MySQL查询出来的结果呢,如果MySQL新增、修改后,Redis应该做哪些操作呢

做缓存的前提是数据不保持实时一致,如果需要实时一致的数据,那就失去了为MySQL做缓存的意义,还不如直接在redis里实现业务。

逻辑上是这样:

每当你查询数据,会先从redis里查询,发现没有这条数据再去Mysql里查询,并把结果写入redis同时设置生存时间。(保持的key是sql语句,value是结果。几乎是没有逻辑的)

当对Mysql进行修改和新增操作后,redis并不会修改。只有当key过期下次查询时才会更新数据。

1.定义:
Redis 是一个开源(BSD许可)的,基于内存的,多数据结构存储系统.;
作用于:数据库、缓存和消息中间件,支持多种类型的数据结构;
2.常用的数据类型:
String;
Hash;
List;
Set;
SetSorted;
3.存储方式:
以一种键值对的方式;
4.特点:
有三种存储分别为:内存存储,磁盘存储,log文件;
支持主从模式,可以配置集群;
5.好处:
速度快;
支持丰富数据类型;
支持事物,操作具有原子性;
6.应用场景:
数据库;
缓存;
队列;
排行榜/计数器;
发布/订阅等;

7.常见性问题与解决方式:
① : Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能 影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
② : Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
③ : Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
④ : Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

如何用redis做缓存的更多相关文章

  1. spring+redis的集成,redis做缓存

    1.前言 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.我们都知道,在日常的应用中,数据库瓶颈是最容易出现的 ...

  2. SpringBoot之Mybatis操作中使用Redis做缓存

    上一博客学习了SpringBoot集成Redis,今天这篇博客学习下Mybatis操作中使用Redis做缓存.这里其实主要学习几个注解:@CachePut.@Cacheable.@CacheEvict ...

  3. spring-boot集成mybatis,用redis做缓存

    网上有很多例子了,执行源码起码有3个,都是各种各样的小问题. 现在做了个小demo,实现spring-boot 用redis做缓存的实例,简单记录下思路,分享下源码. 缓存的实现,分担了数据库的压力, ...

  4. django使用redis做缓存

    Django 使用 Redis 做缓存 django中应用redis:pip3 install django-redis - 配置 CACHES = { "default": { ...

  5. Spring Boot 2整合Redis做缓存

    既然是要用Redis做缓存,自然少不了安装了.但是本文主要讲Spring Boot与Redis整合.安装教程请另行百度! 1.首先是我们的Redis配置类 package com.tyc; impor ...

  6. springboot2.0+redis实现消息队列+redis做缓存+mysql

    本博客仅供参考,本人实现没有问题. 1.环境 先安装redis.mysql 2.springboot2.0的项目搭建(请自行完成),本人是maven项目,因此只需配置,获取相应的jar包,配置贴出. ...

  7. spring使用redis做缓存

    缓存 什么是缓存? 在高并发下,为了提高访问的性能,需要将数据库中 一些经常展现和不会频繁变更的数据,存放在存取速率更快的内存中.这样可以 降低数据的获取时间,带来更好的体验 减轻数据库的压力 缓存适 ...

  8. 简单封装Redis做缓存

    基于Redis封装一个简单的Python缓存模块 0. Docker Redis安装 参考: Get Docker CE for CentOS Docker 安装 Redis 安装Docker时错误s ...

  9. spring boot-16.使用redis做缓存

    spring boot 自动配置了多种 缓存管理器,按照下面的顺序查找,如果容器中有相应的组件,则使用相应的缓存管理器. Generic JCache (JSR-107) EhCache 2.x Ha ...

随机推荐

  1. [CF1216E] Numerical Sequence hard version

    题目 The only difference between the easy and the hard versions is the maximum value of k. You are giv ...

  2. JavaScript基础对象创建模式之私有属性和方法(024)

    JavaScript没有特殊的语法来表示对象的私有属性和方法,默认的情况下,所有的属性和方法都是公有的.如下面用字面声明的对象: var myobj = { myprop: 1, getProp: f ...

  3. Kafka 可视化监控和管理 UI工具评估

    以下内容,来自网络资料整理和个人安装使用结果.后续会持续更新

  4. 在html中如何兼容使用WebP格式的图片【图片升级到WebP】

    把已有的图片转换为WebP格式 要使用WebP格式,需要将你网站用到的图片都制作一份WebP格式的版本,如果你使用CDN服务商,它们一般都会提供转码到WebP格式的选项.如又拍云: 增加这样的配置后, ...

  5. 【.NET Core】在Win10中用VS Code debug

    虽然windows平台中有功能丰富且强大的Visual Studio,但有时也稍显臃肿,不如VS Code(vsc)小巧便捷,废话不多说,直接进入正题 前提 .NET Core RC2 X64系统 W ...

  6. Re5ilio 5ync:资源神器

    文章目录 #0x0 简单的介绍 #0x1 安装使用 #0x10 下载 #0x11 安装 #0x12 升级pro权限 #0x13 开始添加资源 #0x14 后续 一定要小心哦!! #0x0 简单的介绍 ...

  7. python PEP8开发规范

    为了使得代码更美观,方便阅读,建议遵循下PEP8规范 每行长度最大不要超过79. 换行可以使用反斜杠,换行点要在操作符的后面敲回车. 类个top-level函数定义之间空两行:类中的方法定义之间空一行 ...

  8. Scala 面向对象(三):package 包 (二)

    1 包对象 基本介绍:包可以包含类.对象和特质trait,但不能包含函数/方法或变量的定义.这是Java虚拟机的局限.为了弥补这一点不足,scala提供了包对象的概念来解决这个问题. package ...

  9. VSCode下,项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    vscode下webpack错误:无法将“webpack”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 解决方法: 1.因为 ...

  10. 数据可视化之 图表篇(五) PowerBI图表不够炫酷?来看看这个

    现在这个大数据时代,每时每刻.各行各业都在产生多种多样的海量数据,如何简单高效的来理解.挖掘这些数据,发现背后的见解就非常重要. 本文介绍这个图表就可以帮你快速发现海量数据背后的见解,微软研究院打造的 ...