前言
这篇来讲解java各种各样组件,例如数据库mysql、缓存redis、分布式搜索等等的题目

一、redis篇

1、redis和ehcache区别
答:1.ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。2.redis可缓存共享、分布式部署,可持久化

2、redis应用场景
答:1.热点数据。2.计数器。3.排行榜。4.分布式锁。5.队列。6.点赞。7.token令牌。8.延时操作

3、为啥效率那么高
答::1.完全基于内存,持久化。
    2.单线程。
    3.redis使用多路复用技术。
    4.基于跳跃表数据增删改,效率高

4、redis线程安全吗?为啥效率那么高?
答:采用NIO多路复用,一个线程处理多个请求,线程安全类似无锁机制

5、redis分为多少个库,为啥有这么多个
答:16个库,没个库不准许出现相同key,不同业务连接同一个redis,所以区分

6、redis五种类型:
答:1.String(常规key-value缓存应用,最大512M。常规计数: 微博数, 粉丝数。)
   2.List(双向链表,字符串列表。最新消息排行,消息队列)
   3.Hash(键值(key => value)对集合。场景:存储部分变更数据,如用户信息、存储、读取、修改用户属性等。)
   4.set(string类型的无序集合。场景:共同好友、交集)
   5.zset(sorted set:有序集合。场景:1.排行榜 2.带权重的消息队列)

7、redis如何存放数据
答:1.基于json序列化。2.基于String二进制存放对象

8、mysql和redis保证数据唯一性
答:1.手动清除缓存。2.订阅mysql的binlog日志通过MQ推送

9、全量和增量区别
答:1.全量:每天定时对所有数据数据同步。2.增量:发生操作同步数据,效率低,低延迟

10、内存满了如何处理?
答:1.扩展内存,治标不治本。2.采用redis淘汰机制。3.设置过期key

11、redis宕机会丢失?
答:不会,因为会持久化

12、redis持久化有哪些方案?
答:RDB增量同步。存放文件格式,恢复速度快。AOF增量同步,日志存放

13、redis支持回滚吗?
答:没有回滚。mysql开启事务,其他线程不能做写操作,回滚相当于对该行锁释放。redis开启对key的事务,其他线程还是可以对key做操作

14、redis主从复制
答:单台redis情况下,如果redis宕机会导致数据丢失,故使用复制备份数据
多台分为主从关系,请求会转发主节点。在同步到每子字节点负责读,哨兵会重启节点,单机要手动

15、redis主从实现
答:1.数据备份。2.集群。3.读写分离

16、redis分布式锁思路
答:采用setn。2.redis框架

17、redis的set和setnx区别
setnx可以返回key是否存在。存在返回0,不能修改,不存在返回1

18、分布式锁超时如何处理
答:1.续时。2.回滚当前事务,同时释放锁

19、redis缓存穿透,缓存穿击、缓存雪崩原因及解决方案
答:缓存穿透
   缓存穿击
   缓存雪崩

二、Mysql

2.1、Mysql数据库优化层面

  • 1、需求优化(需求无用功能,不合理。论坛实时更新)
  • 2、系统架构(二进制多媒体功能、流水、活跃缓存数据)
  • 3、SQL以及索引
  • 4、数据库表结构(表规范、分表分库)
  • 5、系统配置优化(Tcp连接、打开文件限制、安全性优化)
  • 6、硬件(IO、CPU、网络)

2.2、SQL查询慢如何优化

  • 1、慢查询日志是否打开
set global slow_query_log=on;
  • 2、检查慢日志路径
show variables like '%slow_query_log%';
  • 3、慢日志判断标准(默认大于10秒)
show variables like 'slong_query_time';

2.3、Explain执行计划

idselect_typetablepartitionstypepossible_keyskey_lenrefrowsfilteredExtra
越大越先执行表示查询的类型,什么语句查询的表匹配的分区表的连接类型可能使用索引实际使用索引索引长度列与索引比较估算的行数条件过滤的百分比

2.4、慢查询优化思路

  • 优化更需要优化的SQL
  • 了解性能瓶颈
  • 明确优化目标
  • explan执行计划
  • 小结果集驱动大结果集
  • 尽可能在索引中完成排序
  • *禁用所有列查询,使用需要的列
  • 只使用最有效的过滤条件
  • *尽可能避免使用复杂的join和子查询
  • 尽可能使用三张以内表
  • 小心使用order by、group by、distinct函数
  • **合理使用索引

2.5、索引种类

  • B-tree索引(mysql中最频繁的索引类型)
    • B树:三个节点,三次IO,键值、指针、数据组合
    • B+树:1、数据全部在第三节点。2、第三节点双向
  • Hash索引(检索效率高于B-tree索引,可以一次定位)
  • Fulltext索引(目前仅支持char、varchar、text)
  • R-tree索引(少见,主要用于空间数据检索)

2.6、什么时候需要创建索引

  • 字段查询比较频繁
  • 字段更改不是很频繁
  • where里面的字段才可以创建索引

2.7、索引失效与优化

  • 复合索引尽量写全
  • 最佳前缀法则(中间索引不能断)
  • 不要在索引上做任何操作(计算、函数等)
  • mysql存储引擎不能继续使用索引中范围条件(bettween、in等)右边列
  • 尽量使用覆盖索引(只查询索引的列)
  • is null 或者 is not nul也会失效
  • !=或 > <判断时,也会失效
  • like通配符也会失效
  • 索引字段是字符串,查询时候不加单引号也会失效
  • or也会导致失效

2.8、优化终极奥义

  • 针对百万数据,放弃join操作。推荐分别根据索引单表取数据,然后在java代码里面操作
  • 解决IO问题,读IO尽量使用nosql来防控热点数据。写IO使用消息中间件来抗压