面试的时候经常问面试者, redis为什么这么快,通常的回答都是, 1.数据存储在内存中. 2.Redis是单线程的. 答案满意吗,如果你就这样戛然而止,那么抱歉,我觉得你还是需要再深入了解下redis,接下来,我为大家提供一些思路,逐渐的去了解下redis
1.Redis为什么这么快
1). 纯内存操作,将数据存储在内存中,读取的时候不需要进行磁盘IO
2).单线程,减少了系统线程的上下文切换,至于为什么上下文切换会消耗性能,我建议你也说一下,别认为这是常识,毕竟你是面试者,你回答的越多,延伸的越广,加分越多
3). 高效的数据结构,Redis常见的5种数据结构,String,List,Hash,Set,Zset 你能说明各自使用场景,同时能说明原理,我觉得你符合计算机行业的要求,毕竟数据结构是基础
4). Redis用到了NIO,多路复用,那接下来我问,NIO底层实现是怎么样的呢? Linux API 提供的 IO 复用方式有select、poll 和 epoll,那么这三种有什么区别呢,epoll底层的结构是怎样的呢?
5). 合理的数据编码
6). 其他方面的优化 比如过期数据删除的设计,过期数据删除机制有三种,定时删除,惰性删除,定期删除;定时删除,对内存友好,对CPU不友好,如果过期删除的键比较多的时候,删除键这一行为会占用相当一部分CPU性能,会对Redis吞吐量造成一定影响;惰性删除,对CPU友好,内存不友好,如果很多键过期了,但在将来很长一段时间内没有很多客户端访问该键导致过期键不会被删除,占用大量内存空间;定时删除,是定时删除和惰性删除的一种折中
2. Redis实现分布式锁
面试时问到如何用redis实现分布式锁,面试者总是会说有个setnx的指令,那么比如A,B两个客户端,用setnx,抢占锁,如果A抢占成功,之后A没释放锁奔溃了,那么B是不是永远就拿不到锁了,除非A复活,释放锁,此时面试者又会加一个setex,设置下超时时间,但是这里注意的是,如果要用这两个命令,一定要是原子的,否则始终会出现上述问题,其实高版本的redis提供了一个set的命令SET key value [EX seconds] [PX milliseconds] [NX|XX],直接一步到位,但是这是最好的方案吗,也不是,只能说这是Redis单机下的解决方案,如果要是redis集群,要用redlock算法
其他的需要准备的,比如Redis主从复制(注意原理),Redis持久化机制(RDB和AOF区别和实现机制),Redis数据淘汰机制,Redis哨兵和集群模式等
本文重在提供思路,不在具体的知识点,如果你是有心人,你会顺着这个思路,挖的很深很深,相反,不是有心人,给出具体的知识点,也不过几天就会忘掉
网友评论