hashmapJava
冲突链表:数组+链表
java8:数组+链表+红黑树(链表元素大于8个时会转变为红黑树)
扩容:每次扩大一倍容量,一次性扩容
Go
冲突链表:数组+链表+溢出桶(也是链表,每个哈希桶只能装8个元素,超过8个就放到溢出桶中,每个溢出桶也是8个元素)
扩容:
翻倍扩容:装载因子超过6.5
等量扩容:溢出桶太多
增量扩容:每次对 hashmap 进行写操作会迁移一到两个哈希桶
线程安全的hashmapJava
ConcurrentHashMap
java5到java7:
采用分段锁的机制实现:segment(默认16个) + 哈希桶
扩容:segme...
记录一下一些关于zk的思考和总结
异常场景
Zk客户端连接节点1,watch了某个节点,节点1挂掉之后,zk客户端重新连接别的节点(比如节点2),watch事件还会生效吗
Zk客户端会在本地保存watch事件
Zk客户端重新连接节点之后,都会根据本地保存的watch事件重新发送一次watch请求给新连接的节点
Zk客户端连接节点1,创建了临时znode,如果节点1挂掉了,创建的临时znode会被删除吗
Zk客户端给节点1发送请求或者心跳,发现节点1挂掉了,会进行重连
重连时,会使用之前的session id进行认证,认证成功就能继续保持之前的会话,创建的临时znode不会被删除
...
1select * from person_tab where age = 10 limit 40000, 10;
mysql 在执行以上语句时(假设在age字段上设置了索引),会在 age 索引上找到 age=10 的数据,然后把前面的 40010 个 id 都回表把记录行数据查出来之后,再筛选出第 40000~40010 条数据,因此当 offset 越大,查询就会越慢,这个就是 mysql 的深翻页问题。
两种解决方法对于深翻页问题,一般有以下两种解决方法:
利用二级索引先查询满足条件的 id 集合,再利用 where id in (xxx, xxx) 来的方式来查询记录行数据...
Mysql中有两种比较重要的日志,一个 Mysql Server 实现的 归档日志(binlog),另外一个是 InnoDB 引擎特有的 重做日志(redo log)。
redo logredo log 是 InnoDB 中用来实现崩溃恢复的日志。
InnoDB 会将更新操作的内容保存到内存缓冲区中,在合适的时机或不得已的情况下再把缓冲区的数据更新到磁盘中,这样可以减少磁盘的随机读写,提高更新操作的性能。但是一旦程序崩溃,缓冲区中的数据就会丢失,为了实现崩溃恢复,InnoDB引入 redo log,执行更新语句的时候不但需要把更新的数据保存到内存缓冲区,还需要把更新的数据写到redo l...
读写锁从锁的粒度分,mysql的锁分为表锁和行锁,而无论表锁还是行锁,都有读写锁之分,读锁又称共享锁,写锁又称排它锁。
一般来说,读锁与读锁兼容,与写锁冲突;而写锁与写锁、读锁冲突。
表锁表锁是由Mysql服务器实现的。
表锁的类型有以下三种:
读写锁:LOCK_S(读锁),LOCK_X(写锁)
读写意向锁: LOCK_IS(读意向锁),LOCK_IX(写意向锁)
自增锁:LOCK_AUTO_INC
读写锁读写锁使用一次封锁技术,某个会话使用lock tables命令对要用到的表加锁以后,在释放这些锁之前,该会话只能访问那些加锁的表,不能访问其他表。
12345LOCK TABLES...
原文:https://www.aneasystone.com/archives/2017/12/solving-dead-locks-three.html
一、基本的加锁规则虽然 MySQL 的锁各式各样,但是有些基本的加锁原则是保持不变的,譬如:快照读是不加锁的,更新语句肯定是加排它锁的,RC 隔离级别是没有间隙锁的等等。这些规则整理如下,后面就不再重复介绍了:
常见语句的加锁
SELECT … 语句正常情况下为快照读,不加锁;
SELECT … LOCK IN SHARE MODE 语句为当前读,加 S 锁;
SELECT … FOR UPDATE 语句为当前读,加 X ...
数据结构哈希表检索复杂度为O(1),但是范围查询、排序等功能,只适用于等值查询的场景。
B树 和 B+树B树和B+树的检索复杂度为O(log n),支持范围查询和排序。
B树和B+树的区别在于,B树在非叶子节点存储数据;而B+树在叶子节点按索引顺序存储数据,非叶子节点存储的都是索引值,在范围查询时能利用磁盘顺序读(叶子节点按索引顺序存储数据)来提高性能。
索引类型根据叶子节点的内容,分为主键索引和非主键索引:
主键索引:叶子节点存的是整行数据;在InnoDB里,主键索引也被称为聚簇索引(clustered index)。
非主键索引:叶子节点内容是主键的值。在InnnoDB里,非主键索...
事务并发存在的问题
更新丢失
第一类更新丢失, 回滚覆盖:撤消一个事务时,在该事务内的写操作要回滚,把其它已提交的事务写入的数据覆盖了。
第二类更新丢失, 提交覆盖:提交一个事务时,写操作依赖于事务内读到的数据,读发生在其他事务提交前,写发生在其他事务提交后,把其他已提交的事务写入的数据覆盖了。这是不可重复读的特例。
脏读一个事务读取了另一个事务未提交的数据。
不可重复读一个事务中,重复读取同一条记录,获取到不一样的数据。
幻读一个事务中,重复读取一个范围内的记录,获取到不一样的结果集。
不可重复读和幻读问题的本质都是事务读取了在事务期间其他事务提交的数据,不同的是不可重复...
driver.goconnector.go123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126// Con...
偶然看见golang之database/sql与go-sql-driver这篇博客,让我有了阅读学习go数据库访问接口和mysql驱动实现的源码的想法和动力。
因为刚好工作负责的组件中就是需要使用mysql,之前就出现过一些问题,但是因为当时对go database/sql和go-sql-driver/mysql的源码一点都不熟悉,只会用几个api,对于问题出现的原因一头雾水,希望通过阅读学习源码提升能力的同时,以后出现问题可以更加清楚应该怎么解决。
前言database/sql主要是提供了对数据库的读写操作的接口和数据库连接池功能,需要向其注册相应的数据库驱动才能工作。
go-s...