目录

一、缓存

1、概念

2、作用

3、缺点

二、缓存模型

三、缓存的更新

1、更新策略

2、主动更新的三种模式

1.cache aside pattern

2.read/write through pattern

3.write behind caching pattern

3、线程安全问题

1.缓存删除还是更新缓存

2.先删除缓存后操作数据库

3.先操作数据库后删除缓存

4.如何保证缓存与数据库操作同时成功或失败

4、最佳选择



一、缓存

1、概念

缓存是数据交换的缓冲区,是数据存储的临时地方,相对来说他的读写性能比较高

2、作用

在web开发中缓存的引入会降低服务器的负载,提高读写效率降低响应时间

3、缺点

使用缓存会存在数据不一致性等问题,导致代码的维护成本变高。

如果在缓存集群的环境下,缓存的使用会消耗更多的人力资源

二、缓存模型

当客户端发送获取数据的请求时,我们先从redis中查询缓存,如果命中也就是缓存中存在数据,直接返回数据,如果缓存未命中,就需要去查询数据库然后将数据作为缓存写入redis

三、缓存的更新

1、更新策略

当数据库被修改,而客户端查询时查询到缓存里更新前的数据,为了解决这一问题有以下几种策略

内存淘汰 超时删除 主动更新
说明 无需维护,利用redis本身的机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存 给缓存的数据加TTL即超时时间,到期后自动删除,下次查询时更新缓存 在实现业务逻辑时,查询数据库的同时去更新缓存
一致性
维护成本

2、主动更新的三种模式

1.cache aside pattern

缓存调用者在操作数据库时的同时去更新缓存

2.read/write through pattern

将缓存与数据库作为一个整体的服务,由该服务来维护一致性。调用者只需要调用即可不需要去关心数据一致性问题

3.write behind caching pattern

调用者只需操作缓存,由其他线程异步的去将缓存的数据持久化到数据库,,以此来保证数据的一致性

3、线程安全问题

1.缓存删除还是更新缓存

上述三种模式,方案一虽然需要开发人员自己编码但是可控性比较高。那么我们在更新数据库的时候是将缓存删除还是更新缓存呢?

如果对数据库做了上百次操作,则需要去更新上百次缓存,但是却没有请求来查询,则上百次的更新缓存相当于是无效操作。而如果删除缓存,则查询请求来的时候就会查询数据库并更新缓存。那么我们选择了删除。

2.先删除缓存后操作数据库

此时又有一个问题,我们是先选择删除缓存后操作数据库呢,还是先操作数据库然后删除缓存呢?

先删除缓存后操作数据库,当线程1刚删除缓存时,线程2此时来查询,发现缓存没有,于是查询数据库,此时线程1还没有来得及去更新数据库,于是线程2获取到旧的数据返回并写入缓存,此时线程1更新完数据库。执行完毕时,缓存里的值是旧的,而数据库里确实跟新了的,就会存在线程安全的问题。

3.先操作数据库后删除缓存

先操作数据库后删除缓存,假设缓存由于某种原因失效了,线程1来查询时缓存未命中于是去查询数据库数据,此时线程2再去更新数据,并将缓存删除,此时线程1执行将读取到的旧数据写入缓存,缓存值与数据库不一致存在线程安全问题。

但是后者是在假定缓存失效的情景下,相比而言前者的线程安全问题更严重

4.如何保证缓存与数据库操作同时成功或失败

最后我们如何保证缓存与数据库操作同时成功或失败呢?

在单体系统里,我们可以将这两个操作放在一个事务里来保证,如果在分布式系统下则可以通过TCC等分布式事务来保证

4、最佳选择

如果对数据的一致性需求低,则可以使用默认的内存淘汰机制,对于一致性高的需求则使用主动更新的策略,并以超时删除作为兜底的方案

【Redis】Redis缓存相关推荐

  1. Spring Boot 整合Redis 实现缓存

    本文提纲 一.缓存的应用场景 二.更新缓存的策略 三.运行 springboot-mybatis-redis 工程案例 四.springboot-mybatis-redis 工程代码配置详解 运行环境 ...

  2. 项目总结10:通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题...

    通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题 关键字 springboot热部署  ClassCastException异常 反射 ...

  3. redis一般缓存什么样数据_门户数据展示_Redis缓存数据

    学习主题:门户数据展示_Redis缓存数据 一.Redis_3主3从集群环境搭建 谈单你对读写分离和主从同步的理解 读写分离:Master负责写数据的操作,salve负责读数据的操作 主从同步:sal ...

  4. 面试不怂之redis与缓存大全

    基础篇 问题:什么是redis? Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源.包含多种数据结构.支持网络.基于内存.可选持久性的键值对存储数据库,其具备 ...

  5. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

    源码地址:https://github.com/Tinywan/PHP_Experience 问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量 ...

  6. Redis 作为缓存服务器的配置

    转自:http://www.open-open.com/lib/view/open1419670554109.html# 随着Redis的发展,越来越多的架构用它取代了memcached作为缓存服务器 ...

  7. Redis 分布式缓存 Java 框架

    https://dzone.com/articles/java-distributed-caching-in-redis 为什么要在 Java 分布式应用程序中使用缓存? 在提高应用程序速度和性能上, ...

  8. Redis专题-缓存穿透、缓存雪崩、缓存击穿

    一.缓存穿透 缓存穿透概念 缓存穿透是指查询一个一定不存在的数据,在数据库没有,自然在缓存中也不会有.导致用户查询的时候,在缓存中找不到对应key的value,每次都要去数据库再查询一遍,如果从存储层 ...

  9. HAProxy 的负载均衡服务器,Redis 的缓存服务器

    问答社区网络 StackExchange 由 100 多个网站构成,其中包括了 Alexa 排名第 54 的 StackOverflow.StackExchang 有 400 万用户,每月 5.6 亿 ...

  10. Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透

    Redis 的缓存异常处理 -- 缓存雪崩.缓存击穿.缓存穿透 在实际应用 Redis 过程中,如果将 Redis 作为数据库的缓存,经常会遇到这几个问题:缓存雪崩.缓存击穿.缓存穿透等. 缓存雪崩 ...

最新文章

  1. 进击webpack4 (优化篇)
  2. python难度大的题_早看少被坑!Python 最难的问题
  3. 关于 tsm 磁带槽位
  4. 云计算三大主流阵营的竞争与合作
  5. 过长内容分成了多次发送 问题 LengthFieldBasedFrameDecoder使用
  6. 如何破解Mac并为其提供真正应得的精美壁纸
  7. Mysql 数据库导入导出
  8. CentOS 使用yum update 更新时保留特定版本的软件
  9. 折线图后面无数据_老板让数据师分析二八法则,此图表完美解决,项目管理师专用图表...
  10. 一起来看小米发布会!
  11. Python丨调用百度的人脸识别api给你的颜值打个分
  12. 人工智能几行代码实现换脸,python+dlib实现图文教程
  13. 【EI会议征稿】山西财经大学主办!往届全部成功检索!机器学习、大数据与商务智能征稿中!...
  14. Ubuntu下安装新版QQ
  15. 读《春秋》有感之十二:偪阳之战
  16. Linux下根据关键字搜索最后一条日志
  17. LeetCode面试热题十二
  18. lua与php通用异或算法,php使用异或实现的加密解密实例
  19. Java修饰符与关键字
  20. 常见波形的傅里叶级数展开式

热门文章

  1. G1D38-Evaluation Metrics
  2. 两部手机怎样才能把数据都传过来_两台苹果手机怎么传数据最快(两台 iPhone 互传应用的 3 个小技巧)...
  3. JS 之Node节点的 属性、方法 获取
  4. sqoop import 数据同步到hive的用法
  5. navicat for mysql 12 破解工具 亲测可用
  6. c语言编程自幂数,【C语言基础】-自幂数优化-这个算法快得像一道闪电
  7. 百度的文心一言 ChatGTP 的对比
  8. Unity中的进度条(内含计数器)
  9. 计算机视觉OpenCv学习系列:第十部分、实时人脸检测
  10. ubuntu 16.04 gtx1060 显卡安装