Java面试题—实际应用篇

1. Redis缓存系统

  • Redis支持的五种数据类型
    string(字符串)
    hash(哈希)
    list(列表)
    set(集合)
    zset(sorted set:有序集合)

  • Redis为什么这么快?
    Redis将数据存储在内存里面,读写数据的时候不受硬盘I/O速度限制;数据结构简单,对数据操作也简单。
    采用单线程,避免了不必要的数据切换和竞争条件;使用多路I/O复用模型,非阻塞IO。
    拥有自己的VM机制,不需要花时间去请求调用系统函数。

多路I/O复用:利用select、poll、epoll同时监测多个流的IO事件能力,空闲时阻塞,当有一个或多个流有I/O事件时,会从阻塞态中唤醒,一次处理就绪的流,避免大量无用操作。

  • Redis为什么是单线程的?
    因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最可能是机器内存的大小或者网络带宽。既然单线程容易实现而且CPU不会成为瓶颈,那么就顺理成章地采用单线程的方案了,毕竟采用多线程会有很多麻烦。可以通过在单机开多个Redis实例来发挥多核CPU性能。

  • Redis的三种集群方式
    主从复制:主机会自动将数据同步到从机
    哨兵模式:监视主服务器和从服务器是否正常运行;主服务器出故障时自动将从服务器转换成主服务器。
    集群:实现Redis的分布式存储,每台节点上存储不同的内容。

  • Redis持久化的几种方式
    RDB:将Redis在内存中的数据库记录定时dump到磁盘上的RDB持久化。
    AOF:将Redis的操作日志以追加的方式写入aof文件,重启时重新执行aof中的命令来恢复数据。
    二者区别:如果数据集很大,RDB启动效率会更高,AOF数据安全性更高。

  • mysql和redis区别

    1. 类型上:mysql是关系型数据库,redis是非关系型缓存数据库
    2. 作用上:mysql用于持久化的存储数据到硬盘,功能强大但速度较慢;redis用于存取较为频繁的数据到缓存中,速度快。
    3. 需求上:mysql和redis因为需求不同,一般都是配合使用

2. Redis的CRUD操作

  • 字符串CRUD
    set str_key "val" #增加一个key为str_key的值val
    del str_key   #删除str_key
    set str_key "new_val" #修改str_key的值
    rename str_key new_str_key    #修改str_key键名称
    get str_key   #查询str_key的值
    
  • List集合CRUD
    lpush list_key "A" "B" "C"    #增加key为list_key的list集合
    lrem list_key 1 "A"   #删除index为1的值(Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。)
    rpush list_key "D"    #往list_key集合尾部添加元素
    lpush list_key "a"    #往list_key集合头部添加元素
    lset list_key 0 "first"   #更新index为0的值            
    lrange list_key 0 -1  #查询key为list_key的集合所有元素
    
  • Hash集合CRUD
    hset hash_key "uuid_1" "1111" #生成hash集合,添加uuid_1的值为"1111"
    hset hash_key "uuid_2" "2222" #往hash_key集合添加
    hdel hash_key uuid_1  #删除key为uuid_1的值
    hset hash_key uuid_2 "22222"  #更新key为uuid_2的值
    hget hash_key uuid_2  #查询key为uuid_2的值
    hlen hash_key     #查询hash_key集合点长度
    hkeys hash_key    #查询hash_key集合所有的key
    hvals hash_key    #查询hash_key集合所有的value
    hgetall hash_key  #获得hash_key所有的key和value
    
  • Set集合CRUD
    sadd set_key "A" "B" "C"  #生成set集合,并添加3个数据
    sadd set_key "D"  #添加value为"D"
    sadd set_key "A"  #返回0,添加不进去,但也不报错,set不允许重复
    srem set_key "A"  #删除value为"A",返回1,没有该值返回0
    smembers set_key  #查新set里面所有的值
    
  • SortedSet集合CRUD
    SortedSet是有序的set集合
    zadd zset_key 1 "A"   #生成zset集合,并添加序号为1的A
    zadd zset_key 2 "B"   #添加序号为2的B,或更新已存在B的序号
    zrem zset_key [A B]   #移除zset中的一个或多个成员
    zremrangebysocre zset_key 1 5 #移除zset中给定序号范围1-5之间的所有成员
    zrange zset_key 1 5 [withscores]  #查询zset_key序号范围1-5之间的成员
    

Redis 官方教程
基于Spring-Data-Redis存储JavaBean对象


3. 什么是 MapReduce

从零开始学Hadoop——浅析MapReduce(一)
MapReduce是分布式数据处理编程模型。主要分为两个阶段:map阶段和reduce阶段

  • MapReduce工作流程:

    1. 在正式执行map函数前,需要对输入进行“分片”(就是将海量数据分成大概相等的块,Hadoop中一个分片的大小默认是64M),以便用于多个map同时工作,每个map任务处理一个分片。
    2. 分片完成后,多台机器就可以同时进行map工作了,读取分片内容解析成<key, value>对,根据map函数处理转换成新的<key, value>输出。
    3. 在进入reduce之前,需要对<key, value>进行分区,按照key进行排序、分组,相同key的value发往一个reduce,该过程叫shuffle(洗牌)
    4. reduce函数对输入的<key, value>处理,转换成新的<key, value>

4. 分布式、集群、微服务、SOA 之间的区别

分布式:不同模块部署在不同服务器上。作用:解决网站高并发带来的问题
集群:相同应用部署在多台服务器上,构成一个集群。作用:通过负载均设备共同对外提供服务
SOA:业务系统分解为多个组件,让每个组件都独立提供离散、自治、可复用的服务能力,通过服务的组合和编排来实现上层的业务流程。作用:简化维护,降低整体风险,伸缩灵活
微服务:架构设计概念,各服务间隔离、自治,其他特性包括单一职责、边界、异步通信、独立部署是分布式概念的更严格执行SOA到微服务架构的演进过程。作用:各服务可独立应用,组合服务也可系统应用


5. 软件开发流程,敏捷开发和瀑布开发

软件开发模式介绍和对比(瀑布、迭代、敏捷等)
传统瀑布模型开发:从需求到设计,从设计到编码,从编码到测试,从测试到提交大概这样的流程,要求每一个阶段都要做到最好。特别是前期设计阶段,设计的越好后面成本损失越少
迭代式开发:不要求每一个阶段的任务做的都是最完美的,先以最短时间把主要功能搭建起来,最少的损失先完成一个半成品直至提交。然后根据客户反馈信息,在该基础上逐步完善,进而逐轮迭代。
敏捷开发:相比迭代式开发两者都强调在较短的开发周期提交软件,但是敏捷开发的周期可能更短,并且更加强调队伍中的高度协助。敏捷方法强调适用性而非预见性,适用性的方法集中在快速适应现实的变化。当项目需求起了变化团队应迅速适应。这个团队可能很难确切描述未来将会如何变化。


6. 大量数据找出最大的k个

1. 全部排序,使用快排,时间复杂度为O(nlogn)
2. 局部淘汰,设置一个k大小的容器,将剩余的所有数字与k中的最小数字比较,大则插入并删除容器中最小数字。时间复杂度O(n+k^2)
3. 多线程处理,假设分为100份,对每份开启线程,在每份中找出最大的k个,然后在100*k个数据中找出最大的k个。
4. 最小堆,首先读入前k个数创建最小堆,然后遍历剩余数字与堆顶(最小)进行比较,如果比堆顶大则替换堆顶并调整堆,直到全部遍历完。算法时间复杂度为O(nklogk),空间复杂度k
5. Hash法,如果存在很多重复数,使用Hash进行去重,在通过分治或者最小堆查找最大k个数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Redis是啥 Redis是一个开源的key-value存储系统,由于拥有丰富的数据结构,又被其作者戏称为数据结构...
    一凡呀阅读 1,237评论 0 5
  • 企业级redis集群架构的特点 海量数据 高并发 高可用 要达到高可用,持久化是不可减少的,持久化主要是做灾难恢复...
    lucode阅读 2,283评论 0 7
  • 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。 我们知道,在w...
    空语阅读 1,681评论 0 2
  • 吃水不忘挖坑人 感谢寻梦的原作,让我这个Android小白能成功的完成这次操作. 写在这里的话 大体的都是来自原作...
    爱喝粥的西瓜阅读 2,010评论 0 1
  • 1. Android手机与BLE终端设备通信结果都是以回调的形式返回: 2. 连接蓝牙BLE终端设备两种方式: ...
    dong_hui阅读 1,171评论 1 0

友情链接更多精彩内容