本文为Redis部分的复盘总结
- 知道redis所处地位:作为服务器的缓存(而不是直接访问mysql),redis读取更快所以作为存储热点信息(应用于抢购(很多人访问高并发),有较多改动不急于写回数据库(例如购物车,浏览量))。
- 知道常见的nosql数据库:redis,mongodb
- 知道redis的基本命令
- 知道redis数据库的五种基本数据类型:string(append,mset,incr,incrby,decr),hash(hset key field value,购物车),list(lpush,lindex),set,sorted_set(zadd score(key可重复) 94(socre) zhangsan(member).以及他们的应用场景和常见操作。
- 注意mset的执行时间如果过长,可能会导致阻塞。
- 注意key的命名规范
- 知道redis有分区
- 知道有jedis这么一个链接redis的工具类以及导入依赖的方法
- 知道redis有两种持久化策略:rdb(这个是快照机制),aof(保存操作的策略)
- 知道rdb与aof的区别 :由于rdb可以采用数据压缩所所以更加小,同时由于rdb保存的是现有数据所以恢复更加快速。aof 的优势体现在存储更快,更加及时(可以使用策略达到每秒)。
- 知道rdb有save与bgsave(不会阻塞客户端)
- aof的实现是保存操作到缓冲区然后刷新给.aof后缀的aof文件当中所以叫appendonlyfile
- aof更加实时所以是主流采用的策略,但是不会默认开启,需要配置文件里开启,一旦开启优先级高于rdb策略
- aof还提供了三种针对保存频率的策略:always,everysec,no
- 知道aof重写机制:将多个操作产生的结果用一个操作也能产生同样的结果的语句替代,这样多个语句操作就变成一个操作了
- 数据具有阶段性特点(很长时间不变)选择rdb,而对数据有实时性要求(很敏感)的选择aof。
- 知道什么是事务:就是一个命令队列,这个队列里有很多指令,执行的时候按顺序一次性执行完毕,是一个不可分割的整体,这就是一个事务。
- 与mysql不同,redis的事务开启与提交是通过如下指令完成的:multi,exec
- 知道redis的两种锁:watch(监控锁,只能监控数值变不变,变了就终止事务),setnx(公共锁,这个有点类似与synchronized,主要是解决类似超卖的问题),对于公共锁,redis还设置了时间到时自动释放,防止长期客户端占用。
- 了解redis删除策略:定时(时间到立马删除),惰性(访问时删除,该数据若已经过期就删除),定期(是指redis定期去轮询几个分区里的数据是否过期,在分区里面抽查数据看过期没,如果过多删除还要再访问该分区并删除)。
- 要注意删除策略是针对有时效的数据(这是redis数据当中的大多数),而对于没有设置时效的数据(小部分)要用到逐出策略。
- 逐出策略对于任何数据都有效:它是为了解决内存紧缺的问题。
- 对于不同区域的逐出策略是不同的:expires区域(有时效数据):lru(最近还要最少),lfu(最少的),tll(要过期了),random。全局数据:使用lru,lfu,random策略
- 知道redis的三个高级数据类型:bitmaps(位计数),hyperloglog,GEO
- 知道redis服务器集群的架构(读写分离):slave对外提供数据(读)这个数据是从master得到的,而master对外只让写入数据。这样还可以负载均衡。
- 知道主从复制机制的常见问题:1.全量复制;master重启导致id变化slave会认为是一个新的master就会发生全量复制(解决办法是持久化master的id)2.断网超时导致slave与master频繁断开,slave就会频繁全量复制(提高ping的频率)
- 一般是slave去链接master。
- 哨兵应当设置为单数防止平票。
- 知道哨兵的机制作用,哨兵互通消息,发送ping指令检查是否在线,故障转移等。
- 描述一下哨兵作用发生的过程,当检测到master下线,首先是主观下线然后客观下线,接着要选取执行哨兵,执行哨兵去选取下一任master,这个过程会产生很多ping命令。
- 知道集群的优势:负载均衡,存储可扩展性强,风险规避。
- 知道redis结构设计,将存储分为16384个分区,这个数量是不变的,通过与16384取余实现定位key,最多只会查询两次。
- 知道四种常见企业级解决方案:缓存预热:找点常用数据备在redis当中。缓存雪崩:较多的key失效。缓存击穿,较高的访问一条信息,而这条信息失效。缓存穿透:黑客攻击,访问不存在redis的数据直接大量攻击mysql
- 解决上述问题的上策是预防:设置二级缓存nginx防止失效带来的大量访问数据库,监控数据变化,手动维护数据的有效期。下策则是牺牲用户体验:限制访问url,对数据加锁不让太多人访问。