一、Redis
1、数据类型
string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)
list:可以重复
set:不可以重复
zset:不可以重复且有序(可用于排行榜)
2、优点和缺点
优点
1、操作内存,支持持久化和事务,支持主从复制
2、采用单线程,避免了不必要的上下文切换
3、多路 I/O 复用模型,非阻塞 IO
缺点
受物理内存限制,适合小数据
3、两种持久化(AOF/RDB)
RDB性能好,更新频率低—间隔一段时间持久化,如果持久化间 redis 发生故障,会发生数据丢失。
AOF安全高,更新频率高—执行的每次写命令在单独的日志文件中,重启redis 会去恢复。
4、Redis的过期键的删除策略和内存淘汰策略
定时清理和请求清理—定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key
淘汰策略
随机key,最近最少使用,报错
5、Redis的事务
事务:ACID
原子性、一致性、隔离性、持久性
Redi支持一致性和隔离性,单线程下,他没有回滚,不具备原子性
6、Redis的缓存雪崩、击穿、穿透
穿透: 没这个Redis key
解决方案:接口用布隆过滤器控制
雪崩:请求太多了,redis宕机
解决方案:redis集群+缓存预热+不设置相同的过期时间
击穿: key同时过期了,都去查数据库
解决方案:不设置相同的过期时间+加分布式锁
二、RabbitMQ(解耦、异步、削峰)
1、基本结构
Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的
Producer:消息生产者,即生产方客户端,生产方客户端将消息发送
Consumer:消息消费者,即消费方客户端,接收MQ转发的消息
2、消息模型
直连模式 work queues
直连模式–多个消费者work queues
订阅模式 publish/subscribe fanout
路由模式 direct
高级路由模式 topic
思考:
publish/subscribe与work queues有什么区别。
区别:
1)work queues不用定义交换机,而publish/subscribe需要定义交换机。
2)publish/subscribe的生产方是面向交换机发送消息,work queues的生产方是面向队列发送消息(底层使用默认交换机)。
相同点:
所以两者实现的发布/订阅的效果是一样的,多个消费端监听同一个队列不会重复消费消息。
2、实际工作用 publish/subscribe还是work queues。
建议使用 publish/subscribe,发布订阅模式比工作队列模式更强大(也可以做到同一队列竞争),并且发布订阅模式可以指定自己专用的交换机
3、消息丢失问题
生产者丢失:开启事务(不推荐,性能耗损),开启confirm 模式 异步的
消费者丢失:用 RabbitMQ 提供的ack机制,简单来说,就是你关闭 RabbitMQ 的自动ack
MQ丢失:消息持久化,开启 RabbitMQ 的持久化,就是消息写入之后会持久化到磁盘当然前提是队列必须持久化
4、重复消费问题(幂等性)
在写入消息队列的数据做唯一标示,消费消息时,根据唯一标识判断是否消费过;
三、ES
1、谈谈ES
基于Lucence 搜索引擎\RestFul
索引:–table
文档:–行row
字段:–列
映射:mapping
查询方式
分片 shaping和replices