mysql是关系型数据库,主要用于存放持久化数据,将索引和数据存储在硬盘中,用到才换到内存。读取速度较慢。
redis是NOSQL,即非关系型数据库,也是缓存数据库,将所有数据存储在内存,读取速度快。
mongo支持将部分热数据放到内存里。但是和redis的持久化方式不同
存储在内存中,存储容量肯定要比磁盘少很多。
mysql: 不同引擎上,存储方式不同。
Redis:key-value类型存储,value具体可以是string, hash, set, list, SortedSet
mongo key-value存储,文档形式存储,json直接写入方便。
Redis是KV 存储系统。 redis支持string, list, set, hash, zset(有序集合)。不仅用于缓存还能用于队列。
mysql: 支持事物,保证事物的几个特点。支持复杂的sql
Redis查询复杂的表关系时不如MySQL和mongo。
mongo: 1 业务需求初始阶段,数据具体格式、结构无法明确定义。可以存放xml, json, bson类型
2 数据量特别大,并发行特别高。(因此项目中,对于实时埋点数据存放在mongoDB中,有人用上T的内存)mongo存储方式是二进制Binary json, 适合海量存储。
3 数据结构特别
4 mongo分布式。很容易扩展,字段值可以包含其他文档、数组等。
5 mongo也可以作为缓存:mongo启动后,将数据库中的数据mmap方式映射到内存,因此也可以当做缓存用,比磁盘速度快。
6 但是mongo占用空间很大。
7 支持字段索引,比redis查询功能强。
存放位置不同。读取方式不同。
可以将信息从内存放到磁盘,再次加载时将磁盘里的数据放入内存。
方式:RDB(snapshot), AOF(append only file)
数据全在内存,定期写入磁盘。内存不够时,根据LRU算法删除数据
淘汰策略(LRU策略)
1. 从已经设置过期事件的数据集中,选最近最少使用
2. 从已经设置过期事件的数据集中,选即将过期的
3. 从已经设置过期事件的数据集中,选任意数据淘汰
4. 从已经设置过期事件的数据集中,选择频率最低的
5. 选择最近最少使用的
6. 选择频率最低的
7. 任意数据
8. 禁止驱逐数据,内存不够就报错。
实现方法:(答双向链表,双向链表+HashMap)
快照式的持久化方法。
redis数据持久化时,现将数据写到临时文件,持久化结束后再用临时文件替换上次持久化好的文件。保证完整
是按照一定的策略周期性的将数据保存到磁盘。配置文件中的 save 参数来定义快照的周期
redis主进程进行数据处理,专门folk出一个子进程进行持久化,让主进程不参加IO
只追加,不改写。
将redis执行过的所有写指令记录到AOF文件中,下次redis重新启动时,只要把这些写指令从前到后重复执行一遍就可以数据恢复了。(默认一秒一次)AOF也是先写临时文件,再替换。
日志数据丢失怎么办:redis有redis-check-aof工具,防止追加日志时导致数据丢失。
日志文件太大怎么办:AOF文件大小超过阈值时,redis自动启动AOF文件重写,内容压缩。
aof数据的恢复完整度更高。rdb保存的有些数据可能不是最新的, 可能丢失数据。
AOF文件会越来越大。
AOF方式恢复的很慢。
如果不小心执行了FLUSHALL, 对数据进行了误删,导致数据清空,AOF可以恢复。(删除最后一个flushall命令,重启Redis)
很难保证完全的一致性的。
在更新数据的时候,应该先删除缓存(更新时,先更新数据库,再删除缓存
原因:复杂的场景下,缓存不单单是从mysql中取出来的值。缓存值如果需要复杂计算,则更新频率高,则浪费性能。
写数据多的情况下,数据没读到就被更新了,浪费性能。
当然如果非要一致,可以实现读写串行话,传到一个内存队列中。
个人项目中,验证码用到了string, value-string.使用Captcha生成验证码, 利用Redis存储验证码。redis过期时间可以设置,Key是32位的UUID(随机), Value为Captcha的4位随机字母以及数字的集合(随机)。设定Redis过期时间为1min, 即可实现过期验证码的自动失效。
验证码这里:一个生产者消费者:生产者随机生成32位uuid, value是生成的随机4位字母和数字集合。根据value生成一个image。将key, value存储进redis并设置过期时间。将key-image返回。消费者:判断是否相同。注意的是,每次判断验证码后都失效,是因为拿出来text后,数据就从redis中删除了。
实习中,redsi用作缓存。
1. 静态的商品和用户数据:数据类型是key(user id),value是一个hashMap, key是这个id对应的属性名字,value是相关的属性值。2. 一些结果,比如推荐列表,这个虽然是list类型的数据,但是还是用的String(list->jsonString), 难道之后再反序列化
设置了
Redis 的超时是怎么实现的?(答了下表结构)
维护一个过期字典。
Redis 超时的时候它是怎么操作的,是扫整张表吗?(答 惰性删除和定期删除)
惰性删除:取出来的时候判断是否失效,失效则删除。对内存不好
定期删除:默认每秒10次过期扫描。1 从过期字典中随机抽取20个key, 2 删除这20个key中过期的key,3 过期键的比例超过25%,重复1 & 2。(扫描时间上线:25ms)
加虚拟节点,使增加删除哈希环上节点,对其他节点的哈希操作影响最小。
key-value格式存储。文档类似json对象,是以一种直观文档的方式存储的。
分布式存储是什么:一组节点存储数据,节点之间通过网络进行通信。为了完成更多任务协调工作。
对与有中心控制节点的存储方式:是从namenode获取该文件的位置。
集群中的机器分成两类:namenode(负责管理获取data在哪个机器上), datanode(负责实际的管理数据)
完全无中心架构中的一致性hash
将设备做成一个哈希环,然后根据数据名称计算出的哈希值映射到哈希环的某个位置,从而实现数据的定位
存储在硬盘里,操作的数据通过mmap方式映射到内存区域内。mongo就可以直接在这块区域进行修改。
缺点:mongo在内存中修改数据后,mmap数据flush到硬盘之前,如果系统宕机,数据就丢失了。
Kafka做什么的?
Kafka集群包含多台服务器,一台Kafka服务器就是一个Broker,一个集群由多个broker组成,一个broker可以有多个topic。broker承担着中间缓存和分发的作用
Topic [主题,类别,话题]
可以理解为是一种队列.用户信息类的消息的topic,我们定义为user-topic
producer
向Topic中发送消息的一方
consumer
向Topic中拉取/消费消息的一方
Replications[备份,复制]
分区的备份,以便容错,分布在其他broker上,每个broker上只能有0个或者1个replications
Consumer Group[消费者群组]
消费者群组,是有若干个消费者组成的集体,每个consumer属于一个特定的consumer group
Partition [分区]
Kafka内在就是分布式的,一个broker中可以有多个topic,一个topic可以设置多个partition(分区)。每个partition在物理上对应一个文件夹,文件夹存储所有消息和索引文件。
redis的LRU策略,保留热数据。或者mongo,使用mmap机制映射到内存里。
HTTPS的机制,加密的流程。
多线程安全怎么保证
对于mysql,多线程查询时保证一个时间戳,保证安全
redis: 对用一个key, 多个线程进行改写时,需要设置一个zookeeper实现分布式锁, zookeeper确保一个时间只有一个系统操作key. 别人不允许读写。
接触过 RPC 吗?(了解过,但没实际写过)