面试简答题day03
1.redis的过期策略:
1.定时删除:为key设置了一个定时器,结束则删除
2.定期删除:Redis 默认会每秒进行十次过期扫描,将设置了过期时间的key放到过期字典中,从过期字典中随机n个key,删除其中过期的,如果过期的大于1/4,重复该操作,否则继续遍历下一个区间
3.惰性删除:过期不删除,使用的时候检查到过期再删除
redis采用惰性+定期
2.redis内存淘汰策略
1.默认:noeviction:超过配置会报错,不会驱逐任何键
2.所有的key采用lru移除
3.设置了过期时间的key采用lru移除
4.所有的key采用lfu移除
5.设置了过期时间的key采用了lfu移除
6.所有的key采用随机移除
7.设置了过期时间的key采用了随机移除
8.设置了过期时间的key移除即将过期的key
ps:
? lru:移除最久未使用
? lfu:移除使用频率最少的
3.ConcurrentHashMap
1.7采用的是分段锁的技术,Map包含了16个Segment,Segment继承了重入锁ReentrantLock内部是一个segment数组来进行细分,每个segment通过hashEntry进行组装,在进行写操作时,只需要对key对应的segment进行加锁,同时,读的操作并没有进行加锁
ps:size操作请求两次count的数量,如果有变化,加锁put(),remove(),clean(),统计完在解锁,
修改:hashEntry里的value是被volatile修饰的
新增:如果刚好new一个对象,然后此对象是一个没有完全构造好的对象引用,此时get如果是空,则加锁再获取一次
ConcurrentHashMap通过两次hash定位元素,低依次定位到segment,第二次定位到元素所在的链表头部
1.8CAS+Synchronized来保证并发更新的安全,底层采用数组+链表+红黑树的存储结构。
put:采用CAS+synchronized实现并发插入或更新操作
扩容:构建一个nextTable,大小为table的两倍。 把table的数据复制到nextTable中。
为什么不用reenatrantlock而用synchronized?
A:减少内存开销,reentrantlock需要节点继承AQS,jvm能对synchronized进行锁粗化,锁自旋,锁消除
|