面试:集合:redis:kafka

作者: Tim在路上 | 来源:发表于2020-05-29 09:27 被阅读0次

解决hash冲突的方法

  1. 线性探测法
  2. 平方探测法
  3. 伪随机列法
  4. 拉链法

Redis和mysql数据怎么保持数据一致的

主要是解决读数据从Redis缓存,一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。

不管先删数据库还是先删redis都会出现问题:

解决方案:1.采用延时双删策略

在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。

先删除缓存,再写数据库,休眠500毫秒,再次删除缓存
  1. 异步更新缓存

MySQL binlog增量订阅消费+消息队列+增量数据更新到redis

这里说的是增量,指的是mysql的update、insert、delate变更数据。(2)读取binlog后分析 ,利用消息队列,推送更新各台的redis缓存数据。这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。

kafka、rabbitMQ等来实现推送更新Redis!

一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?

一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(文中提到的)MySQL的话,这条记录的ID是6。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。

但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是8。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。

怎么确保一个集合不能被修改?

可以使用Collections.unmodifiableMap(map)定义;
或者使用 ImmutableList<Integer> guava定义

Iterator 和 ListIterator 的区别?

一.相同点

都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。

二.不同点

1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。

2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。

3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。

4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

Queue 的 poll() 和 remove()

共同点:他们都是删除一个元素;

不同点:如果队列为空,poll() 返回 null, 但是remove() 报 NoSuchElementException();

MySQL 执行慢排查都有哪些手段?

  1. 使用 show processlist 命令查看当前所有连接信息。
  2. 使用 explain 命令查询 SQL 语句执行计划。
  3. 开启慢查询日志,查看慢查询的 SQL。

开启慢查询的方法有:

  1. 修改配置文件
[mysqld]  
long_query_time=2  

#5.5以前版本配置如下选项  
log-slow-queries="mysql_slow_query.log"  
#5.5及以上版本配置如下选项  
slow-query-log=On  
slow_query_log_file="mysql_slow_query.log"  

log-query-not-using-indexes  

第一句:定义超过多少秒的查询算是慢查询,这里定义的是2秒
第二句:定义慢查询日志的路径(注意如果是 Linux 或 Mac 系统要考虑权限问题)
第三句:记录下没有使用索引的query

  1. 通过命令开启慢查询
mysql>set global slow_query_log=ON

mysql>set global long_query_time = 3600;
mysql>set global log_querise_not_using_indexes = ON;

// 写一条慢查询
SELECT SLEEP(10);

分析慢查询:

MySQL 自带了 mysqldumpslow 工具用来分析 slow query 日志

-s,表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序(从大到小),ac、at、al、ar表示相应的倒序。
-t,是top n的意思,即为返回前面多少条数据。
-g,后边可以写一个正则匹配模式,大小写不敏感。

mysqldumpslow -s c -t 10 host-slow.log

按照时间返回前10条里面含有左连接的sql语句
mysqldumpslow -s t -t 10 -g "left join" host-slow.log

jedis 和 redission 区别?

  1. Jedis 和 Redisson 都是Java中对Redis操作的封装。Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。
  2. Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。但Jedis相比于Redisson 更原生一些,更灵活。

redis 实现分布式锁的原理和缺点

image.png

在超时时间内获取锁,执行setnx , 并设置超时时间,否则休眠一段时间继续请求拿锁;

redis 实现分布式锁的缺点:

  1. 单点故障,主从切换可能丢失锁信息;
  2. 缓存易失性假如第一个线程设置了锁,但是之后触发内存淘汰机制很不幸淘汰了设置的锁字段,接下来的线程在第一个线程没有释放锁的情况下,也是重新设置锁字段的,这样并不能保证锁的安全性。

redis 如何进行内存优化?

  1. 优化的key大小
  2. 尽可能使用Hash,hash占用空间少;
  3. 选择内存占用和效率更好的数据结构zipList

kafka 有几种数据保存策略

Kafka Broker默认的消息保留策略是:要么保留一定时间,要么保留到消息达到一定大小的字节数。

https://www.jianshu.com/p/7008d2a1e320

时间和大小不论那个满足条件,都会清空数据。

相关文章

网友评论

    本文标题:面试:集合:redis:kafka

    本文链接:https://www.haomeiwen.com/subject/ntztzhtx.html