ConcurrentHashMap缓存

如果只是要实现一个简单的缓存,使用redis、memecache又太重,也不需要将数据持久化,可以使用ConcurrentHashMap实现一个简单的缓存,避免多次操作数据库,提升效率。
ConcurrentHashMap的get(Object key)不加锁,只有在put、remove操作时才加锁,但是也可能不会有锁争用,因为ConcurrentHashMap将缓存变量分到多个segment,分段加锁,每个segment一个锁,只要多个线程不操作同一个segment,就不会产生锁争用,缺省情况下ConcurrentHashMap生成16个segment,每个segment上有一个锁,最多可以允许16个线程并发的更新而不产生锁争用。
缓存需要考虑的点有:
1、缓存大小
2、缓存过期时间
3、缓存淘汰策略
4、清理缓存
对于淘汰策略可以使用linkedList记录缓存使用的最后一次的记录,最近使用的在最前面,淘汰的时候优先淘汰最久没有使用的缓存。

public static Map cacheMap = new ConcurrentHashMap();
如果定义成:
pubic static ConcurrentHashMap cacheMap = new ConcurrentHashMap();
则不能与HashMap直接赋值。只能遍历后取出key、value放在HashMap里。

工作中用到的是将每个应用生成的最新的流水号放在ConcurrentHashMap里,保证每个应用都是递增生成新的流水号,程序关闭时保存在redis里,重启时取出。StringRedisTemplate只能操作String类型的数据,对于Map格式的数据可以使用RedisTemplate。

你可能感兴趣的:(java)