缓存相关知识总结

一、缓存的作用和分类

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

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

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

二、常见的缓存技术

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. 当有节点插入式,按照算法的映射方法,受影响的仅仅为环上新节点开始逆时针方向

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

相关推荐
哭哭啼29 分钟前
Redis环境部署(主从模式、哨兵模式、集群模式)
数据库·redis·缓存
糊涂君-Q1 小时前
Python小白学习教程从入门到入坑------第三十一课 迭代器(语法进阶)
python·学习·程序人生·考研·职场和发展·学习方法·改行学it
路遇晚风3 小时前
力扣=Mysql-3322- 英超积分榜排名 III(中等)
mysql·算法·leetcode·职场和发展
只是有点小怂4 小时前
受害者缓存(Victim Cache)
缓存
simpleGq6 小时前
Redis知识点整理 - 脑图
数据库·redis·缓存
运维小文6 小时前
服务器硬件介绍
运维·服务器·计算机网络·缓存·硬件架构
日里安7 小时前
8. 基于 Redis 实现限流
数据库·redis·缓存
jerry60913 小时前
7天用Go从零实现分布式缓存GeeCache(改进)(未完待续)
分布式·缓存·golang
吾店云建站14 小时前
WordPress 6.7 “Rollins”发布
科技·程序人生·职场和发展·创业创新·程序员创富
看山还是山,看水还是。16 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率