缓存相关知识总结

一、缓存的作用和分类

缓存可以减少数据库的访问压力,提升整个网站的数据访问速度,改善数据库的写入性能。缓存可以分为两种:

缓存在应用服务器上的本地缓存:访问速度快,但受应用服务器内存限制

缓存在专门的分布式缓存服务器上的远程缓存:访问速度慢,但内存不受限制

二、常见的缓存技术

MemCache :是一个高性能的分布式内存对象缓存系统,用于动态网络应用以减轻数据库负载。Memcache在内存内维护一个统一的巨大的hash表,数据存在hash表中。

Redis :是一个开源的使用ANSI C语言编写、支持网络、可给予内存亦可持久化的日志型、Key-Value数据库,支持多种数据类型(key-value,list,set,string,对象等),并提供多种语言的API。

Squid:Squid是一个高性能的代理缓存服务器,支持FTP,gopher,HTTPS和HTTP协议

Redis和Memcache对比:

|-------|----------------|------------|
| | Memcache | Redis |
| 数据类型 | 简单的key/value结构 | 丰富的数据结构 |
| 持久性 | 不支持 | 支持 |
| 分布式存储 | 客户端哈希分片/一致性哈希 | 主从、哨兵、集群 |
| 多线程 | 支持 | 5.0以后的版本支持 |
| 内存管理 | 似有内存池/内存池 | 无 |
| 事务支持 | 不支持 | 有限支持 |
| 数据容灾 | 不支持,掉电消失 | 支持 |

三、缓存与数据库一致性方案

数据的读取:

  1. 根据key从缓存中读取数据;

  2. 若缓存中存在,则返回数据;

  3. 若缓存中不存在,则从数据库中读取,并将数据写入缓存

数据的插入/更新/删除:

  1. 先操作数据库中的数据内容

  2. 根据操作更新相应缓存中的内容

四、缓存常见问题

一、缓存雪崩:

原因 :大部分缓存同时失效,导致大量数据请求访问数据库,造成数据库崩溃

解决方案 :1. 使用队列或锁,保证不会有大量线程对数据库进行高并发的读写

  1. 为缓存设置不同的过期时间,固定数值+随即数值

  2. 多级缓存,设置失效事件不同的缓存

二、缓存穿刺:

原因: 查询数据库与缓存中都不存在的数据,造成性能浪费

解决方案: 1. 当数据库中的结果为空时,在缓存中加入默认值。

  1. 设置布隆过滤器:将所有可能存在的值放入一个bitmap中。

布隆过滤器介绍:

布隆过滤器用于快速识别一个元元素是否在集合中,通过一个长二进制向量和一系

列随机映射函数记录和识别某个数据是否在一个集合中。

|-------------------------------------|--------------------------------------------|
| 优点 | 缺点 |
| 1. 占用内存小 2. 查询效率高 3. 不存储数据本身,数据安全性好 | 1. 有一定的误判性 2. 一般情况下不能从中删除元素 3. 不能直接获取需要的数据 |

三、缓存预热:

系统启动后,将相关的缓存数据世界加载到缓存系统中。

实现方案:

  1. 编写相关的接口或页面

  2. 数据量不大时,在项目启动后加载数据

  3. 定时任务刷新缓存

四、缓存更新:

  1. 定时清理过期缓存

  2. 根据用户操作,将过期的请求更新到缓存中

五、缓存降级:

降级的目的是保证核心服务的可用,通过记日志等方式,将优先级不高的操作记录

五、Redis的相关介绍

1. Redis支持的数据类型

String,Hash(字典),List,Set, Sorted Set(有序集合)

2. Redis数据的淘汰策略

|-------------|-----------------|---------------------|
| 类型 | 策略 | 实现方式 |
| 不淘汰 | noeviction | 数据不过期,当内存不足时,写入操作报错 |
| 设置了过期时间的键空间 | volatile-random | 随即删除某个key |
| 设置了过期时间的键空间 | volatile-lru | 优先移除最近没使用过的key |
| 设置了过期时间的键空间 | volatile-ttl | 优先移除剩余生命周期最短的key |
| 全键空间 | allkeys-random | 随即删除某个key |
| 全键空间 | volatile-lru | 优先移除最近没使用过的key |

3. Redis持久化实现方式

RDB方式:传统数据库中快照的思想,指定时间间隔将数据进行全量备份

AOF方式:传统数据库中日志的思想,把每条改变数据集的指令追加到AOF文件中

|---------|------------------|----------------------|
| 纬度 | RDB持久化方案 | AOF持久化方案 |
| 备份量 | 重量级的全量备份,整个数据库数据 | 轻量级的增量备份,一次只保存一个操作指令 |
| 间隔时间 | 较长 | 较短,默认1秒 |
| 还原速度 | 快 | 慢 |
| 备份事阻塞情况 | save会阻塞,bgsave不会 | 不会 |
| 备份文件大小 | 小,只有备份时刻的数据 | 大,包括每次操作的指令 |
| 安全性 | 低,备份间隔长,容易丢失数据 | 高,备份间隔短,数据精确 |

4. Redis分布式存储方式

主从模式:一主多从,主节点写数据,从节点度数据,主节点故障时手动切换

哨兵模式:有哨兵的一主多从,哨兵对节点进行健康监控,主节点故障时自动通过选举

的方式选择新的主节点

集群模式:分节点对等集群,分slots,不同slots的信息存储到不同的节点

5. Redis数据切片方案

|-------|--------------------|---------------------------|
| 分片方案 | 分片方式 | 举例 |
| 范围分片 | 按数据分为进行分配,如key值的范围 | 如0-999一组,1000-1999一组 |
| 哈希分片 | 通过对值进行hash运算后分片 | hash后的结果对节点数量取余,对取余结果进行分组 |
| 一致性哈希 | 哈希分片的升级 | 有利于节点扩展和删除,解决数据在节点上分布不均与 |

一致性哈希的实现方式:

  1. 将存储节点抽象成一个环形,每个节点都有对应的值

  2. 对数据进行哈希运算,按顺时针方向将其映射到离其最近的节点上去

  3. 当有节点出现故障离线时,按照算法的映射方法,受影响的仅仅为环上故障节点开始

逆时针方向至下一个节点之间区间的数据对象

  1. 当有节点插入式,按照算法的映射方法,受影响的仅仅为环上新节点开始逆时针方向

至下一个节点之间区间的数据对象

相关推荐
Greedy Alg4 小时前
LeetCode 438. 找到字符串中所有的字母异位词
算法·leetcode·职场和发展
啊嘞嘞?15 小时前
力扣(滑动窗口最大值)
算法·leetcode·职场和发展
YuTaoShao19 小时前
【LeetCode 热题 100】75. 颜色分类——双指针
算法·leetcode·职场和发展
踩坑小念20 小时前
Redis线程模型
数据库·redis·缓存
天才测试猿21 小时前
测试用例如何评审?
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
静若繁花_jingjing1 天前
面试之JVM
面试·职场和发展
piikee1 天前
php内存缓存插件yac的安装配置--平替apcu,多进程共享内存
开发语言·缓存·php·yac·php扩展·php内存缓存·apcu平替
Asmalin1 天前
【代码随想录day 21】 力扣 77. 组合
算法·leetcode·职场和发展
Python代狂魔1 天前
Redis
数据库·redis·python·缓存
独行soc2 天前
2025年渗透测试面试题总结-29(题目+回答)
web安全·职场和发展·渗透测试·单元测试·压力测试