zoukankan      html  css  js  c++  java
  • 如何用redis做缓存

    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最好在同一个局域网内

  • 相关阅读:
    向工信部投诉中国联通、移动、电信等运营服务商的权威途径
    如何把本机Sql Sever数据库转移到虚拟主机sql数据库
    SQL Server 2005如何远程连接数据库?
    mssql server 2005还原数据库bak文件与“备份集中的数据库备份与现有的xx数据库不同”解决方法
    傲游5里保存的网址,在傲游4不能同步?外加几句吐槽
    mysql数据库基础的简单操作指南
    MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
    Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库
    Jupyter Notebook导入自定义模块时ImportError
    Pandas数据处理(2): 数据透视表,行转列、列转行、以及一行生成多行
  • 原文地址:https://www.cnblogs.com/lgj8/p/12734854.html
Copyright © 2011-2022 走看看