栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Redis

面试点总结 主从关系的集群有哪些?

    主从的特点就是数据可靠,低可用;

    常见的zookeeper、redis的哨兵、主从复制;

    只有一个写入点,所以数据可靠,不会数据覆盖;

    即使加上哨兵,又有故障转移的时间,但是还是低可用;因为要主从同步,数据复制;

去中心化集群部署有哪些?

    特点是数据不可靠,高可用;

    有erueka和redis cluster,

    因为有多个写入点,所以数据不可靠;因为去中心化所以高可用;

    是一种局部的主从,正常主节点工作,主节点挂掉,从节点升级为局部主节点,继续完成集群事务;

    Erueka的集群方式实际上是去中心化的方式;和redis一样,但是redis并不是传统的每个redis进行数据的同步,而是将16000个插槽分配到每一个redis,所以说并不是数据一致,而是算法一致,每个请求不管访问哪一个节点,都可以通过key找到他的value在哪个位置;

为什么Redis单线程还可以高性能

    非阻塞的IO多路复用模型:

    多路复用程序只负责监听连接,然后压到队列,不负责具体的处理,一个程序可以处理成百上千其请求; 所以称为非阻塞, 如果是阻塞的,那么监听程序会自己去处理每一个请求,没有完成前,其他请求等待;

    问题来了,具体的事件处理器, 也是单线程的,他怎么有那么快可以一直处理呢?

    因为是基于纯内存的操作, 效率性能非常高, 处理一个请求时间非常少, 即便队列塞得很快,这里处理也非常快;1s几万请求;还避免了多线程频繁上下文切换的消耗问题;

redis数据结构及使用场景了解多少?

ps: 一定要结合业务场景说, 每个数据结构都有什么用;

    String:

    就是普通的kv缓存,没什么好说的; hash:

    value类似于map的结构,主要用来存对象, 我们操作时,可以仅仅只操作value当中的一个值,其他不变; list:

    value是有序的列表; 有很棒的 命令lrange:可以从哪个元素开始查多少个;实现分页查;比如某个微博下面的有很多粉丝,那么就可以将这些粉丝存到list, set:

    无序,自动去重;比如需要对数据进行实现快速去重, 当然java程序中可以使用hashset去重,但是如果数据存在多台机器的话,可以实现全局去重;还可以做一些交集操作(百度),比如比较两个微博账号的共同好友有谁; sortset:

    去重, 按分数排序;最常见的最排行榜; 有重要的命令: 获取排名前几的用户(百度):

redis的过期策略,数据淘汰策略了解吗?手写LRU?

​ ps: 说到redis过期一定讲删除策略, 内存淘汰机制;最常用的lru;

    我们存数据的时候可以设置过期时间;但是并不是时间一到直接删除:

    采用定期删除和惰性删除结合;

    定期: redis会默认每隔一段时间去检测一些过期的key去删掉;

    惰性: 如果有些没被检测到,下次查这个过期的key时,会被删掉,返回null;

    最后一定会保证删掉的,之所以会两种结合用, 而不用定时删除就是防止比如10万条数据,设置集中过期,那么redis得开销全花在删除上了;

    比如有些场景,设置了过期时间,但是内存占用还很多,就是因为redis的删除机制,并不是到期准时全部删除;

    但是. 如果数据大量堆积, 又必须请求一次才能删除, 导致内存一致占用怎么办?

    走内存淘汰机制:

    allkeys-lru: 就是当内存不够用,就删除一些你最近最少未使用(不管设没设置过期);volatile-lru: 区别就是,只去删设置了过期时间的不常使用的key;(不怎么用,不适合);volatile-random: 内存不足时,在设置过期的key中随机删除一些;volatie-ttl: 内存不足,删除即将过期的key;

    手写一个LUR:

    操作系统原理的示例:

    是假设内存是按照栈的方式来表示访问时间的;

    基于hashmap和双向链表:

    用hashmap存kv,能够保证时间复杂度为0(1);用双向链表记录v的插入时间;新插入的放在头部;链表长度表示内存大小,内存满了,就删除链表的尾部;

redis怎么保证高可用的?

ps: 集群相关的,主从复制原理,哨兵原理,cluster原理

redis挂掉数据能恢复吗?redis持久化讲讲:

ps: 持久化方式的比较, 最后是怎么用的, 两种方式的具体流程,会出现哪些问题;

雪崩和穿透怎么解决的:
    雪崩是一个时间段内,缓存集体失效,但是全部压力落在数据库上;过期时间设置上作调整;穿透:是指绕过redis,直接作用数据库,比如访问一个不存在的key;解决方案是,不存在、查出来为null,也存到redis中;
数据库缓存双写一致性:

​ 先更新数据库,再删除缓存

redis并发竞争问题怎么解决:

ps:多个系统客户端连接redis更新key,导致顺序的问题;分布式锁解决;

    用zookeeper做分布式锁来保证;确保同一时间只能有一个实例来操作key,其他不允许读写;
redis6为什么引入多线程:

而 Redis 引入多线程操作也是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。

;

redis6为什么引入多线程:

而 Redis 引入多线程操作也是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。

一句话讲完:之前用单线程是因为基于内存速度快,而且多路复用有多路复用的作用,也就是足够了,现在引入是因为在某些操作要优化,比如删除操作,因此引入了多线程。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778231.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号