redis详解

什么是redis持久化?redis有哪几种持久化方式?,优缺点是什么?

持久化就是把内存数据写到磁盘中去。

redis提供了两种持久化方式 ,RDB(默认使用)和AOF
RDB redis database
在这里插入图片描述
核心函数,rdbSave和rdbLoad,分别存数据和从磁盘读取数据。

AOF : append only file
在这里插入图片描述
每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用,执行以下两个工作。
aof写入保存:
WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件
SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。

优缺点:
1、AOF比rdb更新频率高,优先使用aof还原数据,
2、aof比rdb更安全也更大
3、rdb比aof效率高
4、如果aof和rdb都有的情况下,优先使用aof。

什么是RESP?(redis和服务器之间的通讯协议)
resp:Redis Serialization Protocol (Redis序列化协议)
该协议是redis与服务器之间通讯的。
RESP 的特点:实现简单、快速解析、可读性好

什么是redis分布式锁?
控制分布式系统有序的去对共享资源进行访问,通过互斥来保持一致性。(假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁就是保证这个房子只有一个门并且一次只有一个人可以进,而且门只有一把钥匙。然后许多人要去看书,可以,排队,第一个人拿着钥匙把门打开进屋看书并且把门锁上,然后第二个人没有钥匙,那就等着,等第一个出来,然后你在拿着钥匙进去,然后就是以此类推)
实现原理:
互斥性:保证同一时刻只有一个客户端可以拿到锁,拿到了锁就可以对共享资源进行访问。
安全性:只有加锁的服务才有解锁的权利,不会出现那种a加锁了公共资源,然后b解锁。
保证加锁和解锁都是原子性操作,这样可以避免死锁。
redis如何实现分布式锁?
使用redis命令 set key value NX EX max-lock-time 实现加锁
使用redis命令 EVAL 实现解锁

如何使用redis做异步队列?
Redis设计用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列。
方式:使用list结构做队列。rpush生产消息,lpop消费消息,当lpop没有消息的时候,要适当sleep一会再重试。
缺点:在消费者下线时,生产的消息就不会被lpop出,就会造成消息丢失。
如何做到生产一次消费N次呢?
发布订阅者模式:使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

什么是缓存穿透和缓存雪崩,如何解决?
**缓存穿透:**缓存穿透是指,查询一个不存在的数据时,由于缓存不命中时,需要到数据库中查询,然后复制到缓存中,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方法:
布隆过滤:
对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。还有最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
将结果缓存为null:对查询结果为空的情况也进行缓存,缓存时间设置短一点。

**缓存雪崩:**当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
解决方法:
1、二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2。
2、不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。类似与缓存永不过期。
3、加锁排队:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值