文章目录
- Redis为什么那么快?
- 为什么要使用Redis,Redis的使用场景?
- Redis有哪些数据类型?
- 数据库缓存双写不一致问题
- 如何保证Redis和MySQL的数据一致性
- Redis如何内存优化?
- Redis中的管道有什么用?
- Redis的持久化
- 布隆过滤器BloomFilter
- 缓存预热
- 缓存雪崩
- 缓存穿透
- 缓存击穿
- 工作中哪里使用过redis
- Redis的过期键删除策略
- redis的集群有几种实现方式?
- 什么是Redis哨兵模式
- Redis Sentinel作用
- Sentinel的工作方式
- Redis Sentinel优缺点
- Redis Sentinel原理
- redis主从同步(主从复制)
Redis为什么那么快?
(1)Redis是基于内存操作,避免了磁盘I/O的开销
(2)Redis是高效数据结构,对数据的操作也比较简单
(3)Redis是单线程模型,避免了多线程中上下文频繁切换的操作
(4)使用多路I/O复用模型,非阻塞I/O
为什么要使用Redis,Redis的使用场景?
使用Redis缓存的目的就是提升读写性能。而实际业务场景下,更多的是为了提升读性能,还可以带来更高的并发量。Redis 的读写性能比 Mysql 好的多,我们就可以把Mysql中的热点数据缓存到 Redis 中,提升读取性能,同时也减轻了 Mysql 的读取压力
①适合存储热点数据(热点商品、资讯、新闻)
②缓存
③任务队列
④消息队列
⑤分布式锁
Redis有哪些数据类型?
(1)String字符串类型
(2)列表list,常用来存储一个有序数据,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
(3)set,集合中不能出现重复的数据。它的底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)
(4)sorted set,不允许重复的成员。每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。
(5)Hash,也叫散列,可以将对象中的每个字段独立存储
(6)Bitmaps相当于是一个以位为单位的数组,数组的每个单位只能存储0和1,是一种统计二值状态的数据类型
(7)HyperLogLog,统计一个集合中不重复的元素个数
(8) Redis流(Stream):Redis流是Redis版的MQ消息中间件+阻塞队列
数据库缓存双写不一致问题
(1)修改DB更新缓存场景:在高并发写请求场景下,若多个请求对数据库中同一个数据进行修改,修改后还需要更新缓存中相关的数据,那么就有可能会出现缓存与数据库中数据不一致的问题。
(2)修改DB删除缓存场景:在高并发读写情况下,若这些请求对数据库中同一个数据的操作既包含写也包含读,且修改后还要删除缓存中相关数据,那么就可能出现缓存与数据库不一致的情况。
如何保证Redis和MySQL的数据一致性
(1)先更新数据库, 再更新缓存
如果先更新数据库,再更新缓存,如果缓存更新失败,就会导致数据库和 Redis中的数据不一致。
(2)先删除缓存, 再更新数据库
如果是先删除缓存, 再更新数据库,理想情况是应用下次访问 Redis 的时候,发现 Redis 里面的
数据是空的, 就从数据库加载保存到 Redis 里面, 那么数据是一致的。 但是在极端情况下, 由于
删除 Redis 和更新数据库这两个操作并不是原子的,所以这个过程如果有其他线程来访问, 还是会
存在数据不一致问题。
(3)延时双删策略(推荐)
①先删除redis中的数据
②更新数据库
③再延时删除redis
例如:客户端1去修改接口的数据时,先删除已有的redis缓存;这时,客户端2查询这个接口,因为redis中没有数据,就会去查找MySQL数据库,将数据缓存到redis中。此时,客户端1更新MySQL数据后,再延时删除redis缓存(延时删除的目的是为查询后,保证构建缓存执行完毕后再去删除,以免删不掉)。当下次再有客户访问时,就又会重新查询数据库,从而保证数据的一致性。
缺点:由于它有延时操作,会造成服务器的阻塞。所以,不适合高并发的场景
(4)在极端情况下保证Redis和Mysql数据最终一致性(推荐)
第二次如果删除失败,使用mq异步重试机制。但是耦合性较高,修改、新增都要加程序。可以使用canal,canal利用MySQL的主从复制机制伪装成MySQL的一个从机,他会不断的去监听我们这个二进制日志文件,当我们的数据发生变化的时候,他会主动的给我们的mq发送一个消息。
Redis如何内存优化?
(1)尽可能的使用散列表,散列表使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。
(2)比如你的web系统中有一个用户对象,不要为这个用户的名称,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。
Redis中的管道有什么用?
一次请求/响应,服务器能处理新的请求,既使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而
不用等待回复,最后在一个步骤中读取该答复,这就是管道。这是一种几十年来广泛使用的技术。例如许多POP3
协议已经实现支持这个功能,大大加快了从服务器下载新邮件的功能。
Redis的持久化
Redis持久化机制是什么?以及优缺点
Redis的持久化有RDB和AOF两中方式
(1)RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘。保存备份时它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中
a.优点
①适合大规模的数据恢复
②按照业务定时备份
③对数据完整性和一致性要求不高
④RDB文件在内存中的加载速度要比AOF快得多
b.缺点
①rdb是在一定间隔时间做一次备份,如果redis意外down掉的话,就会丢失当前最近一次快照期间的数据
②rdb是全量同步,如果数据量太大就会导致I/O阻塞,严重影响服务器性能
③rdb依赖于主进程的fork(通过复制父进程的内存,创建一个完全相同的子进程。这个子进程伴随着父进程一起运行,但有自己独立的内存空间),在更大的数据集中,可能会导致服务请求的瞬时延迟
(2)AOF:以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
a.优点:更好的保护数据不丢失,可做紧急恢复
b.缺点:相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb;aof运行效率也要慢于rdb
RDB原理是什么?
原理是redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个子进程的数据和原进程一模一样,会先将数据写到一个临时文件中,持久化结束后,再用这个临时文件替换上次持久化好的文件,整个过程中,主进