最早了解Hash的用法,是一次分表的经历,公司用户表数据有几千万,查询的效率已经比较低了,需要做拆分处理,之前系统中已经有分表的数据,处理方式比较简单,没有使用中间件,按照商家的ID(32位字符串)做Hash然后取模,算出其落在表的编号,然后加上前缀得到最终表名。
最近在了解zk分布式锁时,为了避免一种实现方式的羊群效应,其改进思路类似一致性哈希算法。于是,便看了下Hash相关的知识,并用Java做了简单实现。
最早了解Hash的用法,是一次分表的经历,公司用户表数据有几千万,查询的效率已经比较低了,需要做拆分处理,之前系统中已经有分表的数据,处理方式比较简单,没有使用中间件,按照商家的ID(32位字符串)做Hash然后取模,算出其落在表的编号,然后加上前缀得到最终表名。
最近在了解zk分布式锁时,为了避免一种实现方式的羊群效应,其改进思路类似一致性哈希算法。于是,便看了下Hash相关的知识,并用Java做了简单实现。
之前探讨过一次JAVA的FinalReference,这次我们来看下java.lang.ref包下对应的其他三种引用。
Reference和ReferenceQueue在使用中一定是结伴出现的,当一个Reference确定要被GC回收,GC便会把Reference加入到与之关联的ReferenceQueue中。注意:在Reference的构造方法中,我们可以传入一个注册队列ReferenceQueue,这个队列我们稍后会具体看,需要主要的是,这个队列需要单独的线程去做消费,否则会存在OOM的隐患。
这些引用可用来实现不同的缓存类型(内存敏感和内存不敏感),大名鼎鼎的Guava cache就是基于引用的这些特性来实现高速本地缓存。
最近项目中发现对Spring中的Autowired和JSR-250 定义的Resource认知还是比较模糊,网上的大多的解释也比较笼统,没能解释清楚我的疑问,于是自己动手,丰衣足食,总结如下。