解决hash冲突的方法
- 线性探测法
- 平方探测法
- 伪随机列法
- 拉链法
Redis和mysql数据怎么保持数据一致的
主要是解决读数据从Redis缓存,一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。
不管先删数据库还是先删redis都会出现问题:
解决方案:1.采用延时双删策略
在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。
先删除缓存,再写数据库,休眠500毫秒,再次删除缓存
- 异步更新缓存
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 执行慢排查都有哪些手段?
- 使用 show processlist 命令查看当前所有连接信息。
- 使用 explain 命令查询 SQL 语句执行计划。
- 开启慢查询日志,查看慢查询的 SQL。
开启慢查询的方法有:
- 修改配置文件
[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
- 通过命令开启慢查询
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 区别?
- Jedis 和 Redisson 都是Java中对Redis操作的封装。Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。
- Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。但Jedis相比于Redisson 更原生一些,更灵活。
redis 实现分布式锁的原理和缺点
在超时时间内获取锁,执行setnx , 并设置超时时间,否则休眠一段时间继续请求拿锁;
redis 实现分布式锁的缺点:
- 单点故障,主从切换可能丢失锁信息;
- 缓存易失性假如第一个线程设置了锁,但是之后触发内存淘汰机制很不幸淘汰了设置的锁字段,接下来的线程在第一个线程没有释放锁的情况下,也是重新设置锁字段的,这样并不能保证锁的安全性。
redis 如何进行内存优化?
- 优化的key大小
- 尽可能使用Hash,hash占用空间少;
- 选择内存占用和效率更好的数据结构zipList
kafka 有几种数据保存策略
Kafka Broker默认的消息保留策略是:要么保留一定时间,要么保留到消息达到一定大小的字节数。
https://www.jianshu.com/p/7008d2a1e320
时间和大小不论那个满足条件,都会清空数据。