【Redis】Redis缓存
目录
一、缓存
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缓存相关推荐
- Spring Boot 整合Redis 实现缓存
本文提纲 一.缓存的应用场景 二.更新缓存的策略 三.运行 springboot-mybatis-redis 工程案例 四.springboot-mybatis-redis 工程代码配置详解 运行环境 ...
- 项目总结10:通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题...
通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题 关键字 springboot热部署 ClassCastException异常 反射 ...
- redis一般缓存什么样数据_门户数据展示_Redis缓存数据
学习主题:门户数据展示_Redis缓存数据 一.Redis_3主3从集群环境搭建 谈单你对读写分离和主从同步的理解 读写分离:Master负责写数据的操作,salve负责读数据的操作 主从同步:sal ...
- 面试不怂之redis与缓存大全
基础篇 问题:什么是redis? Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源.包含多种数据结构.支持网络.基于内存.可选持久性的键值对存储数据库,其具备 ...
- 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)
源码地址:https://github.com/Tinywan/PHP_Experience 问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量 ...
- Redis 作为缓存服务器的配置
转自:http://www.open-open.com/lib/view/open1419670554109.html# 随着Redis的发展,越来越多的架构用它取代了memcached作为缓存服务器 ...
- Redis 分布式缓存 Java 框架
https://dzone.com/articles/java-distributed-caching-in-redis 为什么要在 Java 分布式应用程序中使用缓存? 在提高应用程序速度和性能上, ...
- Redis专题-缓存穿透、缓存雪崩、缓存击穿
一.缓存穿透 缓存穿透概念 缓存穿透是指查询一个一定不存在的数据,在数据库没有,自然在缓存中也不会有.导致用户查询的时候,在缓存中找不到对应key的value,每次都要去数据库再查询一遍,如果从存储层 ...
- HAProxy 的负载均衡服务器,Redis 的缓存服务器
问答社区网络 StackExchange 由 100 多个网站构成,其中包括了 Alexa 排名第 54 的 StackOverflow.StackExchang 有 400 万用户,每月 5.6 亿 ...
- Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透
Redis 的缓存异常处理 -- 缓存雪崩.缓存击穿.缓存穿透 在实际应用 Redis 过程中,如果将 Redis 作为数据库的缓存,经常会遇到这几个问题:缓存雪崩.缓存击穿.缓存穿透等. 缓存雪崩 ...
最新文章
- 进击webpack4 (优化篇)
- python难度大的题_早看少被坑!Python 最难的问题
- 关于 tsm 磁带槽位
- 云计算三大主流阵营的竞争与合作
- 过长内容分成了多次发送 问题 LengthFieldBasedFrameDecoder使用
- 如何破解Mac并为其提供真正应得的精美壁纸
- Mysql 数据库导入导出
- CentOS 使用yum update 更新时保留特定版本的软件
- 折线图后面无数据_老板让数据师分析二八法则,此图表完美解决,项目管理师专用图表...
- 一起来看小米发布会!
- Python丨调用百度的人脸识别api给你的颜值打个分
- 人工智能几行代码实现换脸,python+dlib实现图文教程
- 【EI会议征稿】山西财经大学主办!往届全部成功检索!机器学习、大数据与商务智能征稿中!...
- Ubuntu下安装新版QQ
- 读《春秋》有感之十二:偪阳之战
- Linux下根据关键字搜索最后一条日志
- LeetCode面试热题十二
- lua与php通用异或算法,php使用异或实现的加密解密实例
- Java修饰符与关键字
- 常见波形的傅里叶级数展开式
热门文章
- G1D38-Evaluation Metrics
- 两部手机怎样才能把数据都传过来_两台苹果手机怎么传数据最快(两台 iPhone 互传应用的 3 个小技巧)...
- JS 之Node节点的 属性、方法 获取
- sqoop import 数据同步到hive的用法
- navicat for mysql 12 破解工具 亲测可用
- c语言编程自幂数,【C语言基础】-自幂数优化-这个算法快得像一道闪电
- 百度的文心一言 ChatGTP 的对比
- Unity中的进度条(内含计数器)
- 计算机视觉OpenCv学习系列:第十部分、实时人脸检测
- ubuntu 16.04 gtx1060 显卡安装