标签:知识点 缓存 hash 请求 常识 链表 key HashMap
ArraryList 和 Vector区别
Vector有synchronized保证线程安全
HashMap
1.8后 数组+链表+红黑树(链表长度超过八之后改红黑树)
线程不安全 并发环境最好不要使用ConcurrentHashMap代替
预估大小 避免频繁扩容 消耗内存
size一定为2的n次幂 这样可以使产生的hashCode值与运算后产生的index值分布更加均匀(2的n次幂&hash 全一与运算 减少了很多hash碰撞)
put
1.对key的hashCode()做hash运算,计算index;
2.如果没碰撞直接放到bucket⾥;
3.如果碰撞了,以链表的形式存在buckets后;
4.如果碰撞导致链表过⻓(⼤于等于TREEIFY_THRESHOLD),就把链表转换成红⿊树(JDK1.8中的改动);
5.如果节点已经存在就替换old value(保证key的唯⼀性)
6.如果bucket满了(超过load factor*current capacity),就要resize
get
1.对key的hashCode()做hash运算,计算index;
2.如果在bucket⾥的第⼀个节点⾥直接命中,则直接返回
3.如果有冲突,则通过key.equals(k)去查找对应的Entry
4.若为树,则在树中通过key.equals(k)查找O(logn);
5.若为链表,则在链表中通过key.equals(k)查找,O(n)。
HashMap,HashTable,ConcurrentHashMap
HashMap key和value都可以为null
HashTable key和value都不可以不为null
ConcurrernHsahMap 添加了synchronized锁
缓存穿透
请求非法数据:缓存中没有数据 数据区也没有数据
解决方法:前后端校验 空值缓存(时间较短) 哈希校验 布龙过滤器
缓存击穿
大量请求(同一个key) 同时请求数据库
解决方法:保证当缓存失效时候 不让大量请求访问到数据库 分布式锁 只放一个请求进去 热点数据不过去 二级缓存
缓存雪崩
缓存失效(不同的key) 大量请求到数据库
缓存时间随机(避免不同缓存同时失效) 上锁
标签:知识点,缓存,hash,请求,常识,链表,key,HashMap 来源: https://blog.csdn.net/qq_44407005/article/details/120783554
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。