首先说一下缓存著名的开源框架:
最出名的当属 Redis 和 Memcached 了,它们因为使用简便、高性能而成为事实上的标准。还有一些是比较有名的Java开源缓存框架,例如Ehcache、GuavaCache 和 Caffeine
静态缓存和动态缓存:
所谓静态缓存包括两种形式,一种是在网站产生新的内容时就立刻生成相应内容的静态页面,下次用户访问这些内容时就不用通过数据库查询获得;另一种是静态资源缓存,也就是将网站中经常用的资源,如图片、图标、CSS 样式表、JavaScript 文件、音频、视频等内容单独保存到带宽高、性能好的服务器中,这样可以提升系统整体的性能。
动态缓存则是在网站产生内容后,并不立即产生内容,而是在第一次访问时,如果缓存服务器找不到相应缓存,那么就生成相应的静态内容,否则就直接返回缓存中的静态内容。因此,用户第一次访问页面时可能会慢一点,但是以后就会很快了,因为是直接访问的缓存。
进程内缓存和进程外缓存:依赖于应用而存在
进程内缓存:
利 用ConcurrentHashMap 保存一些经常需要用到的数值或对象
开源的进程内缓存框架来实现,如 Ehcache、Guava 和 Caffeine
进程外缓存:不依赖于应用而可以独立存在
ConcurrentHashMap学习:
首先我们在说ConcurrentHashMap之前一定要谈的就是Map中的HashMap:
HashMap: HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk1.7 和 1.8 中具体实现稍有不同
开始先说哈希表:
举个例子说明就是假如有一个数字:20048157这个数字然后要存入一个大小为16的数组中去,我们就可以通过用20048157 mod(模运算->取余) 16,最后肯定会得到一个0-16范围的数字。算出来的这个结果就是这个20048157存放在数组的对应结果下标位置,数组一半设置为质数,应为需要均匀散步不要被整除
遇到冲突怎么办:两种方法
1:链表式解决:
上面我们可以看到15和22对7进行模运算都是1,所以22就跟在15的后面
2:开放地址:
顾名思义就是将数组的其他地方地址都开放开来
线性探测法:
说白了就是倘若你的地址已经被占了的话就直接去下一个地址,+1这样直到出现空地址,要是最后一个地址+1那就回到第一个地址形成一个循环!
平方探测法:
其实区别就是找位置的时候的不同,上面的线性探测法是+1,这里是平方,第一次是1的平方,位置加一后要是没有数据就放到这里。要是位置+1的地方已经有了数据那就加4,也就是2的平方以此类推:9,16…
双哈希: