目录
(1)在项目中缓存是如何使用的?
(2)为什么要用缓存呢?
1)高性能
2)高并发
(3)用了缓存之后会有啥不良的后果?
(4)redis和memcached有啥区别
(5)redis的线程模型
(6)为啥redis单线程模型也能效率这么高?
(7) redis都有哪些数据类型?分别在哪些场景下使用比较合适?
(8) redis的过期策略都有哪些?内存淘汰机制都有哪些?
redis的过期策略都有哪些
内存淘汰机制
(10)如何保证Redis的高并发和高可用?
高并发:
高可用:
1、主从架构的核心原理
在我的微服务电商项目中,通过redis缓存来保存商品的数据。
高性能和高并发
redis查询走的是缓存,速度远比数据库查询快很多
我自己之前通过jmeter对mysql进行压测,2核cpu支撑到2000的qps,基本上就不行了。
而我使用redis进行压测的时候,2核cpu支撑到4000的qps。
理论上redis的性能应该远高于mysql的几十倍,但是这的电脑上进行压测的时候没有达到预期的10万qps效果,但是也足以证明redis性能比mysql要好。
1)缓存与数据库双写不一致
2)缓存雪崩
3)缓存穿透
4)缓存并发竞争
1)redis支撑过多的数据类型
2)redis支持redis cluster集群模式的
1)文件事件处理器
redis基于reactor模式开发的文件事件处理器,由一个IO多路复用机制同时监听多个socket,用队列模式将并发访问变成串行访问。,所以多客户端对Redis的连接并不存在竞争关系。
文件事件处理器的结构包含4个部分:socket,IO多路复用程序,文件事件分派器,事件处理器(命令请求处理器、命令回复处理器、连接应答处理器,等等)。
2)客户端与redis通信的一次流程
在redis启动初始化的时候,redis会将连接应答处理器跟AE_READABLE事件关联起来,接着如果一个客户端跟redis发起连接,此时会产生一个AE_READABLE事件,然后由连接应答处理器来处理,跟客户端建立连接,创建客户端对应的socket,同时将这个socket的AE_READABLE事件跟命令请求处理器关联起来。
当客户端向redis发起请求的时候(不管是读请求还是写请求,都一样),首先就会在socket产生一个AE_READABLE事件,然后由对应的命令请求处理器来处理。这个命令请求处理器就会从socket中读取请求相关数据,然后进行执行和处理。
接着redis准备好了客户端的响应数据之后,就会将socket的AE_WRITABLE事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据时,就会在socket上产生一个AE_WRITABLE事件,会由对应的命令回复处理器来处理,将准备好的响应数据写入到socket,供客户端来读取。
命令回复处理器写完之后,就会删除这个socket的AE_WRITABLE事件和命令回复处理器的关联关系。
1)纯内存操作
2)核心是基于非阻塞的IO多路复用机制
3)单线程反而避免了多线程的上下文切换问题
(1)string
(2)hash
存储复杂类型
(3)list
存储集合
(4)set
(5)sorted set
定期删除+惰性删除:
定期删除:指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
惰性删除:获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间,如果过期了此时就会删除,不会给你返回任何东西。
过期策略导致redis存储了大量数据,内存不足。
1)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key
redis高并发:主从架构,实现读写分离
Redis采用两种持久化方式,AOF(实时写入,出现故障不会出现数据丢失)和RDB(每隔一段时间拷贝,适合冷备份到云上),AOF持久化是指追加写命令到aof文件的方式,RDB是指定期保存内存快照到rdb文件的方式。
主从复制原理:
如果slave 节点是重启的话,slave节点会通过他保存的master id,连接到master节点,master节点将backlog文件保存的offset位置之后的数据复制给slave节点;(slave节点在backlog文件中也保存了一个offset来于master的offset同步)
如果是第一次连接就会直接在内存中产生一个RDB快照(不经过磁盘),发送给slave节点,slave先将RDB快照 持久化到磁盘上,然后写入到slave内存中