Redis学习笔记
1.持久化
1.1 redis 的持久化机制(如何保证 redis 挂掉再重启可以进行数据恢复)
Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。
-
RDB 方式:(默认)
- 将某一时刻所有的 redis 内存数据生成快照映射到磁盘.
- 如果系统发生故障,将会丢失最后一次创建快照之后的数据。
-
AOF 方式(Append Only File): appendonly yes(命令开启)
-
开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入硬盘中的 AOF 文件。AOF 文件的保存位置和 RDB 文件的位置相同
-
有三种不同的持久化方式
-
appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度 appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘 appendfsync no #让操作系统决定何时进行同步
-
为了兼顾数据和写入性能,用户可以考虑 appendfsync everysec 选项 ,让 Redis 每秒同步一次 AOF 文件,Redis 性能几乎没受到任何影响。而且这样即使出现系统崩溃,用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候,Redis 还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。
-
1.2 redis数据会丢失吗?
会有一些损失
1.3 简述Redis自动触发RDB机制
- redis关闭后,如果没有设置默认支持RDB
- 通过配置文件,设置一定时间后自动执行RDB
- 如采用主从复制过程,会自动执行RDB
2.主从复制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYChw7kj-1627266335776)(/Users/yazhouheilong/Library/Application Support/typora-user-images/截屏2021-05-25 16.00.45.png)]
主服务器可以进行读写操作,从服务器只能进行读操作
一个从服务器只能有一个主服务器,并且不支持主主复制。
-
完整重同步:
- 主服务器收到同步命令后,主服务进行 rdb 持久化操作,发送给从服务器,快照文件发送完毕之后,开始向从服务器发送存储在缓冲区中的写命令,从服务器接收快照,接收命令,丢弃原来的数据,达到同步
-
部分重同步:
- 用于处理断线后重复制情况:当从服务器断线后重新连接主服务器时,主服务可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器接收并执行这些写命令
2.1 redis数据是一致的嘛
是的
3.缓存血崩和缓存穿透和缓存击穿
-
缓存血崩:是指缓存同一时间大面积失效,所以请求都落在了数据库上,造成短时间内承受了大量强求而崩掉
-
解决方案:
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
- 热点数据永不过期
-
缓存穿透:是指缓存和数据库中没有的数据,用户不断发起请求,例如请求 id 为-1的数据,导致数据库压力太大
-
解决方案:
- 接口层增加校验:id 基础校验(id<=0),用户的权限校验
- 将这个值key-value 设置为 key-null,缓存有效时间设置短点,如30s,防止对一个 id 反复攻击
- 设置布隆过滤器将所有所有可能的数据存到 bitmap 里面,一个一定不存在的元素就会被这个 bitmap 拦截掉
-
缓存击穿:缓存击穿指缓存中没有数据,但数据库中有该数据。一般这种情况指特定数据的缓存时间到期,但由于并发用户访问该数据特别多,因此去数据库去取数据,引起数据库访问压力过大
-
解决方案:
1.设置热点数据永不过期
2. 对并发读数据设置并发锁,降低并发性
4.Redis的过期键的删除策略
Reids 的过期策略就是当 redis 的 key 过期后怎么处理这个 key。
- 惰性删除:只有当访问一个 key 时候,才判断key 是否过期,过期的话就会清除,这种方法最大程度的节约了 cpu 资源,但是对内存不友好(可能出现大量的 key 没有被访问导致占用的大量内存)。
- 定期删除:每隔100ms 检查一次,查看(随机抽查部分)是否有过期的 key,有过期的 key 则删除。通过调整扫描的间隔和扫描的时间,使 cpu 和内存的资源达到平衡
5.Redis 单线程为什么这么快
- 单线程模型,没有线程上下文切换,排队反而比并发更有效,尤其是又有一个cpu专门用来管理redis情况
- 内存级别的数据库
- 核心是非阻塞的io多路复用机制
6.redis和memcached的区别
缓存 | redis | memcached |
---|---|---|
数据类型 | 支持五种数据类型 | 只支持字符串 |
数据持久化 | RDB和AOF | 无 |
分布式 | redis cluster | 不支持 |
内存管理 | 很久没用的会存在磁盘内 | 一直在内存中 |
7.redis常用的数据类型
String:字符串类型,最简单的类型 Hash:类似于Map的一种结构。 List:有序列表。 Set:无序集合。 ZSet:带权值的无序集合,即每个ZSet元素还另有一个数字代表权值,集合通过权值进行排序。
8.为什么要用到redis
高性能:从缓存内取数据比从数据库硬盘内取数据快很多
高并发:redis支持的并发数量要高很多
9.redis内存淘汰机制
- 目的:为了更好地使用内存,用一定的缓存miss来换取内存的使用效率
- allkeys-lru:如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),也是项目使用的
- allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
- volatile-ttl:这种策略可以手动向Redis提示哪些key更适合被淘汰