这篇文章主要介绍“Redis面试常问点有哪些”,在日常操作中,相信很多人在Redis面试常问点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis面试常问点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
存储方式
Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。memcached本身是为缓存而设计的服务器,因此没有考虑数据的永久性问题。
Redis有部份存在硬盘上,这样能保证数据的持久性。停电后可恢复。
数据支持类型
Memcache对数据类型支持相对简单。>>Redis有5种数据类型。
线程
Memecache高性能的分布式内存缓存服务器,由于 redis 只使用单核,而 memcached 可以使用多核,
value大小
redis最大可以达到1GB,而memcache只有1MB
纯内存操作
核心是基于非阻塞的 IO 多路复用机制
单线程反而避免了多线程的频繁上下文切换问题
官方现实QPS可达10W/s
问题:目前电商首页以及热点数据都会去做,一==缓存 ==般缓存都是定时任务去刷新,或者是查不到之后去查数据库然后更新的,定时任务刷新就有一个问题。如果所有redis缓存在同一时间失效了,此时正好双十一秒杀活动则会导致前端所有请求直接打到DB上,如过挂的是一个用户服务的库,那其他依赖他的库所有的接口几乎都会报错,如果没做熔断等策略基本上就是瞬间挂一片的节奏,
解决方法:在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值就好了,
setRedis(Key,value,time + Math.random() * 10000);
缓存穿透:指缓存和数据库中的数都没有据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
解决方法:在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截,IP单位请求次数限制等操作。从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值具体取啥问产品,或者看具体的场景,缓存有效时间可以设置短点,如30秒。
缓存击穿:这个跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,简单理解为子弹穿透一个物体。
解决方法:设置热点key用不过期。
Bloom Filter:防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
分布式锁实现原理, 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
如果在setnx之后,执行expire之前进程意外crash或重启维护, 那么就需要把setnx和expire合成一条指令来用。
使用keys指令可以扫出指定模式的key列表。
如果这个redis正在给线上的业务提供服务,那么使用key指令会导致线程阻塞。(redis是单线程的,执行key指令期间,线上服务会卡顿,直到指令执行完成,服务才会恢复)。
在这种场景下,就可以使用scan指令,该指令可以的提无阻塞取出指定模式的key列表,但是会有一定重复的概率,可以在客户端做一次去重就好了, 但是整体花费的时间会比直接使用keys指令长。
一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。(如果不用sleep, list还有个指令blpop, 在没有消息的时候, 他会阻塞住直到有消息到来)。
如果要生产一次消费多次,则需要使用pub/sub主题订阅者模式,可以实现1:N的消息队列。(在消费者下线的情况下,生产的消息会丢失。在这种情况下, 就得使用更专业的消息队列了,例如RabbitMQ)
RDB:你给出两个词汇就可以了,fork和cow。fork是指redis通过创建子进程来进行RDB操作,cow指的是=copy on write===,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。
AOF:保存等其实锁增修的RESP指令,一般为全量数据,恢复起来较慢也。并且 服务器重启顺序先AOF后RDB
可以将多次IO往返的时间缩减为一次, 前提是pipeline执行的指令质检没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是piepline批次指令的数目。
redis可以使用主从同步, 从从同步。第一次同步时, 主节点做一次bgsave, 并同时将后续修改操作记录到内存buffer, 待完成后将rdb文件全量同步到复制节点, 复制节点接受完成后, 将rdb镜像加载到内存。加载完成后, 再通知主节点将修改期间的操作 记录同步到复制节点进行重放就完成了同步过程。
redis sentinal着眼于高可用, 在master宕机时会自动将slave提升为master, 继续提供服务。
redis cluster着眼于扩展性, 在单个redis内存不足时, 使用cluster进行分片存储
一般避免以上情况发生我们从三个时间段去分析下:
事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL 被打死。
事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
到此,关于“Redis面试常问点有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。