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区别
- 类型上:mysql是关系型数据库,redis是非关系型缓存数据库
- 作用上:mysql用于持久化的存储数据到硬盘,功能强大但速度较慢;redis用于存取较为频繁的数据到缓存中,速度快。
- 需求上: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之间的成员
3. 什么是 MapReduce
从零开始学Hadoop——浅析MapReduce(一)
MapReduce是分布式数据处理编程模型。主要分为两个阶段:map阶段和reduce阶段
-
MapReduce工作流程:
- 在正式执行map函数前,需要对输入进行“分片”(就是将海量数据分成大概相等的块,Hadoop中一个分片的大小默认是64M),以便用于多个map同时工作,每个map任务处理一个分片。
- 分片完成后,多台机器就可以同时进行map工作了,读取分片内容解析成<key, value>对,根据map函数处理转换成新的<key, value>输出。
- 在进入reduce之前,需要对<key, value>进行分区,按照key进行排序、分组,相同key的value发往一个reduce,该过程叫shuffle(洗牌)
- 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个数
