美文网首页
2020-07-22

2020-07-22

作者: 就叫basi | 来源:发表于2020-07-22 14:58 被阅读0次

1、redis基本类型 5个基础类型 HyperLogLog、Geo、Pub/Sub BitMap(支持按bit存储,可以实现BloomFilter)等(加分)
string : 用作缓存;做计数器;
hash:使用场景较少;可以存储对象(但是不能嵌套对象,使用情况比较单一,使用场景较少)
list:可以用于做粉丝列表、评论列表等,还可以做简单的队列,lpush && rpop
set:无序合集,自动去重,获取两个集合的交集(sinter key1, key2)、差集(sdiff key1, key2)啥的效率不错
zset: 有序集合,自动根据分数排序,如排行榜,按点赞数、浏览量等,根据分数默认排序
2、redis 和mc的区别
mc : 缺点
// key不能超过256字节,key的最大失效时间是30天
// 单个value不能超过1m
// 只支持kv形式,不支持持久化和主从同步

优点:
// 多线程异步IO,可以利用多核
Redis:
特点:单线程 俩原因 a、非阻塞异步事件处理函机制
b、缓存数据基于内存,io操作不会耗时太长,避免上下文切换消耗cpu性能
支持持久化,支持主从同步,不仅支持k-v,还支持list、set、hash、zset等多种数据格式

3、redis的分布式锁(setnx、set)
4、查找指定key(keys、scan)
5、做异步队列 (队列 lpop、rpush)
6、redis持久化
rbd : 周期性同步 适合冷备份 持久化过程:
aof :记录操作日志append_only 类似mysql的binlog 适合热备份
二者的工作方式,优缺点:

7、7呢?

8、缓存雪崩、缓存穿透、缓存击穿的区别、解决方式

缓存雪崩指短时间内大量redis的key失效,导致大量请求直接落到db上,db压力过高直接瘫痪
// 在key的过期时间上加上一些随机值,使key的过期相对分散,不要过于集中

缓存穿透:查询的数据缓存、db都不存在,如攻击,查询id<0的数据,大量请求全部打到db上导致服务挂掉
// 攻击可能性更大些,在接口层校验用户权限;对基本的查询数据做校验,eg:id < 0
// 程序开发中不信任任何人的提交,做校验;翻分页查询大小限制等等…
// 不存在的数据也设置缓存 key => null, 过期时间设置稍微短一些
// 网关层 nginx让运维配置,每秒访问超过阈值的ip 拉黑等等…
// 布隆过滤器 bloom filter ? 存在性检测BloomFilter中不存在,则一定不存在

缓存击穿:某一个key是热点的key,承载着很大的请求,这个key失效了,然后大量的请求打到db上,gg
// 解决:永不过期?

9、redis为什么这么快?
// 官方100000+qps
完全基于内存,绝大部分请求是纯内存操作,SO fast
不存在多进程或是线程的切换消耗cpu;
不存在加锁释放锁的操作,也不存在死锁而导致的性能消耗
什么多路I/o, 非阻塞io,sorry, 不懂

10、redis集群高可用的方式? 哨兵集群
redis支持主从同步,cluster集群部署,通过哨兵监控redis主服务器的状态,若主服务器挂掉,将根据一定策略选出新主,然后将其他slave到新主节点
选主策略:
a、slave的priority设置的越低,其优先级越高
b、a相同的情况下,复制的数据越多,优先级越高
c、b相同的情况下, runid 越小越容易被选中 // ???
不问别提,水平不够
哨兵的作用:
集群监控:负责监控 Redis master 和 slave 进程是否正常工作。
消息通知:如果某个 Redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。
配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。

11、为什么读写分离?为什么主从同步?如何同步?
主节点负责写,从节点负责读,读写分离=>高效
主从同步,灾备!数据安全!地球爆炸,凉凉
从节点slave如果是第一次链接master会触发全量机制,master会fork一个子进程去生成rdb文件,并将在该过程中的写操作保存在内存的buffer中(别问这是为啥,要不生成rdb过程总的那些操作不就丢失了?从节点不就没同步全?),slave将rdb文件数据写入本地磁盘,并加载到内存,然后同步master记录的缓存命令

12、内存淘汰机制?
allkeys-lru:在所有key中尝试回收最少使用的key,让新的key有空间存储
volatile-lru:在过期的key中尝试回收最少使用的key,让新的key有空间存储
过期策略:定期删除+惰性删除

lru?手写lru?

13、经典的kv、db读写模式:
读先读缓存,有则返回;无则查库,返回并更新缓存
更新的时候更新db,删除缓存
// 更新db删除缓存而不更新缓存,没必要更新数据就更新缓存(或许特定场景可能会需要), 有可能某一字段短时间内修改几十次,但是基本没怎么读,更新缓存的话就存在大量冷数据,删除的话如果用得到再去缓存,开销降低

14、面试的时候问你缓存,主要是考察缓存特性的理解,对 MC、Redis 的特点和使用方式的掌握。
要知道缓存的使用场景,不同类型缓存的使用方式,例如:
对 DB 热点数据进行缓存减少 DB 压力;对依赖的服务进行缓存,提高并发性能;
单纯 K-V 缓存的场景可以使用 MC,而需要缓存 list、set 等特殊数据格式,可以使用 Redis;
需要缓存一个用户最近播放视频的列表可以使用 Redis 的 list 来保存、需要计算排行榜数据时,可以使用 Redis 的 zset 结构来保存。
要了解 MC 和 Redis 的常用命令,例如原子增减、对不同数据结构进行操作的命令等。
了解 MC 和 Redis 在内存中的存储结构,这对评估使用容量会很有帮助。
了解 MC 和 Redis 的数据失效方式和剔除策略,比如主动触发的定期剔除和被动触发延期剔除
要理解 Redis 的持久化、主从同步与 Cluster 部署的原理,比如 RDB 和 AOF 的实现方式与区别。
要知道缓存穿透、击穿、雪崩分别的异同点以及解决方案。
不管你有没有电商经验我觉得你都应该知道秒杀的具体实现,以及细节点。

相关文章

网友评论

      本文标题:2020-07-22

      本文链接:https://www.haomeiwen.com/subject/fyttlktx.html