==== =Redis= ====
1、Redis为什么这么快
①、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。
②、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
③、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换
而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁 操作,没有因为可能出现死锁而
导致的性能消耗;
④、使用多路 I/O 复用模型,非阻塞 IO;
⑤、Redis底层模型自己构建了VM机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间
去移动和请求;
2、Redis 的持久化机制是什么?各自的优缺点?
①、RDB:Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保 存到硬盘中,
对应产生的数据文件为dump.rdb。通过配置文件中的save参数来 定义快照的周期。
优点:1)只有一个文件 dump.rdb,方便持久化。
2)容灾性好,一个文件可以保存到安全的磁盘。
3)使用单独子进程来进行持久化,主进程继续其他任务,保证了 redis 的高性能
4)相对于数据集大时,比 AOF 的启动效率更高。
缺点:1)数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故
障,会发生数据丢失。这种方式更适合数据要求不严谨的时候
②、AOF:AOF持久化,将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重
新将持久化的日志中文件恢复数据。 当两种方式同时开启时,数据恢复Redis会优先选
择AOF恢复。
优点:1)数据安全,aof 持久化可以配置 appendfsync 属性,每进行一次命令操作就记录到
aof 文件中一次。
2)通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-checkaof 工具解
决数据一致性问题。
3)AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前,可以删除其中的某些命令
缺点:1)AOF 文件比 RDB 文件大,且恢复速度慢。
2)数据集大的时候,比 rdb 启动效率低。
3、Redis的内存淘汰策略有哪些
①、noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
②、allkeys-lru:当内存不足以容纳新写入数据时,在键空间中移除近少使用的key。(常用)
③、allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
设置过期时间的键空间选择性移除
④、volatile-lru:当内存不足以容纳新写入数据时,过期key中,移除近少使用的key。
⑤、volatile-random:当内存不足以容纳新写入数据时,过期key中,随机移除某个key。
⑥、volatile-ttl:当内存不足以容纳新写入数据时,过期key中,有更早过期时间的key优先移除。
4、Redis事务支持隔离性吗
Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完
所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。
5、Redis事务保证原子性吗,支持回滚吗
Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失
败,其余的命令仍会被执行。
6、redis、 zk 分布式锁的?二者区别
1)Redis:setNx获得锁,获取不到则加锁,expire释放锁
2)zk:①、客户端对某个方法加锁时,在 zk 上的与该方法对应的指定节点的目录下,生成一个唯
一的瞬时有序节点 node1;
②、客户端获取该路径下所有已经创建的子节点,如果发现自己创建的 node1 的序号是最
小的,就认为这个客户端获得了锁。
③、.如果发现 node1 不是最小的,则监听比自己创建节点序号小的最大的节点,等待。
④、获取锁后,处理完逻辑,删除自己创建的 node1 即可。
区别:zk 性能差一些,开销大,实现简单。
7、Redis 集群方案应该怎么做?都有哪些方案?
①.redis主从方案:一个master可以拥有多个slave;多个slave链接同一个master,也可以链接其
它slave;主从复制不会阻塞master,在同步数据时,master可以继续处理client请求.;slave 配
置为slave-read-only on需要升级为主节点或者写入配置文件中, 而不能在默认slave情况下直接
设置master与slave断开后会检测心跳, 从新建立连接.;可以直接copy DUMP文件从新重启
master,在Master为空以后,slave同步数据会抹掉全部数据
②.redis cluster方案:Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供
③.codis集群方案:Codis是目前用的比较多的一种方案,Codis在高可用方面做的比较好
8、缓存穿透、缓存击穿、缓存雪崩
①、缓存穿透:按照 key 去缓存查询,查不到对应的 value,然后查数据库。恶意或大批量这样请
求会故意查询不存在的 key,会对后端系统造成很大的压力。
解决方案:1)对查询结果为空的情况也进行缓存,缓存时间设置短一点;
或者该 key 对应的数据 insert 了之后清理缓存。
2)把所有的可能存在的 key 放到 Bitmap 中,查询时通过该 bitmap 过滤。
什么叫做Redis的bitmap
操作String数据结构的key所存储的字符串指定偏移量上的位,返回原位置的值
1.1 优点:
节省空间:通过一个bit位来表示某个元素对应的值或者状态,其中key就是对应元素的值。实
际上8个bit可以组成一个Byte,所以是及其节省空间的。
效率高:setbit和getbit的时间复杂度都是O(1),其他位运算效率也高。
1.2 缺点:
本质上位只有0和1的区别,所以用位做业务数据记录,就不需要在意value的值。
②、缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,会给后端系统带来很大
压力。导致系统崩溃。
解决方案:1)在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。
比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待。
2)做二级缓存, A1 为原始缓存, A2 为拷贝缓存, A1 失效时,可以访问 A2,
A1 缓存失效时间设置为短期, A2 设置为长期
3)不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀
③、缓存击穿:缓存中没有但数据库中有的数据(缓存时间到期),由于并发用户特别多,同时读
缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大
压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据
都过期了,很多数据都查不到从而查数据库。
解决方案:1)设置热点数据永远不过期。
2)加互斥锁,互斥锁缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可
以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直
接查询事先被预热的缓存数据!
直接写个缓存刷新页面,上线时手工操作一下;数据量不大,可以在项目启动
的时候自动进行加载;定时刷新缓存;
9、为什么Redis是单线程的
1)不需要各种锁的性能消耗
Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会
进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对
象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。单线程的情况下,
就不用去考虑各种锁的问题,不存在加锁、释放锁操作,没有死锁而导致的性能消耗。
2)单线程多进程集群方案
3)CPU消耗
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换
而消耗 CPU。如果CPU成为Redis瓶颈,CPU高利用,可以多起几个Redis进程,Redis数据之
间没有约束。只要客户端分清哪些key放在哪个Redis进程上就可以了。
10、IO多路复用技术
redis 采用网络IO多路复用技术,来保证在多连接的时候系统的高吞吐量。
多路-指的是多个socket网络连接,复用-指的是复用一个线程。
多路复用主要有三种技术:select,poll,epoll。
采用多路I/O复用技术:1)可以让单个线程高效处理多个连接请求
2)Redis在内存中操作数据的速度非常快
11、热点key解决方案
1)热点key多写多读
①、将热点key在不同的redis上存储一份相同的数据
②、读取时,轮询或随机访问具体的redis机器
2)热点key少写多读
①、将热点key写入主库
②、读取时,轮询或随机访问从库
读写分离架构:
• SLB 层做负载均衡
• Proxy 层做读写分离自动路由
• Master 负责写请求
• ReadOnly 节点负责读请求
• Slave 节点和 Master 节点做高可用
实际过程中 Client 将请求传到 SLB,SLB 又将其分发至多个 Proxy 内,通过 Proxy 对请求的
识别,将其进行分类发送
12、说说 Redis 哈希槽的概念?
Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通 过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
13、Redis 集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型, 每个节点都会有 N-1 个复制品.
14、Redis 集群会有写操作丢失吗?为什么?
Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。
异步复制