专栏首页earthchen的专栏java面试知识要点汇总(缓存和消息队列)

java面试知识要点汇总(缓存和消息队列)

网上的常规与经典面试题汇总与答案—–缓存和消息队列

面试常考知识点

缓存

redis有哪些类型

String(Key-Value)

String是最常用的一种数据类型,普通的key/value存储都可以归为此类。

一个Key对应一个Value,string类型是二进制安全的。

Redis的string可以包含任何数据,比如jpg图片(生成二进制)或者序列化的对象。

Hash(Key-Value)

hash是一个string 类型的field和value的映射表。

hash特别适合存储对象。相对于将对象的每个字段存成单个string 类型。一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。

Redis的Hash数据类型的value内部是一个HashMap,如果该Map的成员比较少,则会采用一维数组的方式来紧凑存储该MAP,省去了大量指针的内存开销

采用string类型的存储对象,需要将对象进行序列化 使用hash数据类型不需要

List

list是一个链表结构,主要功能是push, pop, 获取一个范围的所有的值等。操作中key理解为链表名字。

Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列(栈就是insertFirst+deleteFirst,队列就是insertLast+deleteFirst)。可以支持反向查找和遍历,方便操作,不过带来了部分额外的内存开销。

Set

是string类型的无序集合。set是通过hash table实现的,可以进行添加、删除和查找。对集合我们可以取并集,交集,差集.

zset

Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。

Redis 内部结构

https://www.cnblogs.com/chenpingzhao/archive/2017/06/10/6965164.html

Redis 使用场景

  1. 缓存——热数据
  2. 计数器
  3. 队列
  4. 位操作(大数据处理)
  5. 分布式锁与单线程机制
  6. 最新列表
  7. 排行榜

Redis 持久化机制

RDB持久化

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。

也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb

可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照

RDB文件保存过程
  1. redis调用fork,现在有了子进程和父进程。
  2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据是fork时刻整个数据库的一个快照。
  3. 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。

client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用

AOF

AOF文件保存过程
  1. redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。
  2. 当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。

https://www.cnblogs.com/xingzc/p/5988080.html

Redis 集群方案与实现

实现基础——分区

  • 分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集
  • 通过利用多台计算机内存的和值,允许我们构造更大的数据库
  • 通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽

客户端分片

  • 由客户端决定key写入或者读取的节点
  • 包括jedis在内的一些客户端,实现了客户端分片机制

基于代理的分片

  • 客户端发送请求到一个代理,代理解析客户端的数据,将请求转发至正确的节点,然后将结果回复给客户端。
  • 开源方案
    • Twemproxy
    • codis

路由查询

  • 将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行。
  • 开源方案:Redis-cluster

Redis 为什么是单线程的

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了

单线程只是在处理我们的网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的

Redis为什么这么快

  • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
  • 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的
  • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  • 使用多路I/O复用模型,非阻塞IO
  • 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求

https://blog.csdn.net/chenyao1994/article/details/79491337

缓存常见的问题

https://blog.csdn.net/zzh920625/article/details/78173099?foxhandler=RssReadRenderProcessHandler

消息队列

消息队列的使用场景

异步处理

应用解耦

流量削锋

日志处理

https://blog.csdn.net/seven__________7/article/details/70225830

消息的顺序性和重复问题

https://www.sohu.com/a/129521820_487514

消息的幂等性解决思路

https://www.jianshu.com/p/8b77d4583bab?utm_campaign

消息的堆积解决思路

处理消息堆积的方法就是把它存下来。只是这个存储可以做成很多方式。比如存储在内存里,存储在分布式KV里,存储在磁盘里,存储在数据库里等等。但归结起来,主要有持久化和非持久化两种。 持久化的形式能更大程度地保证消息的可靠性(如断电等不可抗外力),并且理论上能承载更大限度的消息堆积(外存的空间远大于内存)。 但并不是每种消息都需要持久化存储。很多消息对于投递性能的要求大于可靠性的要求,且数量极大(如日志)。这时候,消息不落地直接暂存内存,尝试几次failover,最终投递出去也未尝不可

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java面试知识要点汇总(线程和锁)

    实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,因此可以把这两种方式...

    earthchen
  • java面试知识要点汇总(框架)

    https://www.cnblogs.com/ITtangtang/p/3978349.html

    earthchen
  • java面试知识要点汇总(基础和集合)

    反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部成员进行操作。反射机制提供的功能主要有:得到一个对象所属的类;获取...

    earthchen
  • java面试知识要点汇总(web和数据库)

    https://my.oschina.net/u/1774673/blog/871912

    earthchen
  • java面试知识要点汇总(分布式和微服务)

    https://www.cnblogs.com/LBSer/p/4853234.html

    earthchen
  • 强烈推荐!Github 顶级 Java 教程类开源项目推荐!

    大家好,我是 Guide 哥!今天给大家推荐 15 个新手也能看懂的 Java 教程方向的开源项目。这些项目无论是对于你学习 Java 还是准备 Java 方向...

    Guide哥
  • 2021金三银四想进大厂的要开始准备了,字节跳动Android高频面试题解析!

    今年Android开发的整体招聘趋势可以概括为几句话:赛道中的公司在蒙眼狂奔,成熟业务借机补强,更多公司在观望。

    Android技术干货分享
  • Java面试 32个核心必考点完全解析

    1~3年内从工程师到高级工程师发展,夯实基础,重点提高工作基础能力,培养技术的深度和广度,对不同方向的新技术保持强烈的好奇心和学习心

    本人秃顶程序员
  • 面试现场:小伙伴的美团一面分享和分析[含答案]

    虽然技术的知识点是固定的,但不同大厂不同面试官的提问方式却不一样。一方面是你的简历的内容影响,另外一方面是受面试官的个人经历导致。最终就看你们是否对脾气了,如果...

    小傅哥
  • 解决 idea 使用过程中让你觉得不爽的一些问题

    来源:https://juejin.im/post/6854573211779579918

    java进阶架构师
  • 金九银十结束了,各大公司Java后端开发真题汇总,明年再战

    一年一度的跳槽季又结束了,还有很多想跳槽的朋友都没能成功,还有一些正在复习准备来年再战的,有很多粉丝问有没有今年的一些面试真题、八股文、算法等.....最近抽时...

    Java程序猿
  • 架构师必备词汇和知识点

    01 高可用 负载均衡(负载均衡算法) 反向代理 服务隔离 服务限流 服务降级(自动优雅降级) 失效转移 超时重试(代理超时、容器超时、前端超时、中间件超时、...

    Java高级架构
  • 28张图带你搞懂 Kafka~!

    公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。

    java进阶架构师
  • 2020涨薪15K?搞懂这份大厂Java面试知识点笔记汇总,你也没问题

    疫情信息仍在不断刷屏,开工日期一再延迟,相信不少朋友都会担心今年春招是否受影响。其实很多企业,比如腾讯、字节跳动,为了保证春招的顺利进行,尽可能的提高招聘效率,...

    用户5546570
  • 签到功能,用 MySQL 还是 Redis ?

    redis实现方案,使用bitmap来实现,bitmap是redis 2.2版本开始支持的功能,一般用于标识状态,

    java进阶架构师
  • 在工作中常用到的集合有哪些?

    Java集合是我认为在Java基础中最最重要的知识点了,Java集合是必须掌握的。我在实习/秋招面试的时候,只要是面到Java,那一定是少不了Java集合。

    Java3y
  • 监控、链路追踪、日志这三者有何区别?

    对于一个系统来说,监控、链路追踪、日志的这三者需求都是必然存在的,而有的时候我们会搞不清楚这三者相互之间是什么关系。我之前在做系统设计的时候也考虑过,是不是有必...

    java进阶架构师
  • 面试官问:MySQL 的自增 ID 用完了,怎么办?

    公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。

    java进阶架构师
  • RabbitMQ高级面试题

    在生产者投递消息时指定mandatory或者imrnediate参数设为 true 时,RabbitMQ 会把无法投递的消息通过Basic.Return 命令将...

    Java学习录

扫码关注云+社区

领取腾讯云代金券