@红薯 你好,我把代码下载下来可以运行,但是我在redis服务器无法查询到我设置的key和value,对于二级缓存,region代表的是什么?我这里看不懂,麻烦你了
package net.oschina.j2cache.util; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * @author Vincent Zhao * @version 1.0.0 * @Time 2015/4/13 10:19 */ public class LockMapUtil { private final static ConcurrentMap<Integer,Object> lockMap=new ConcurrentHashMap<Integer, Object>(); /** * 添加锁到锁集合中 * @param key hash键值 */ public static Object addLock(int key){ return lockMap.putIfAbsent(key,new Object()); } /** * 根据键值获取锁对象 * @param key * @return */ public static Object getLock(int key){ return lockMap.get(key); } }
public CacheObject get(String region, Object key) { int keyCode = (region + key).hashCode(); Object lock = LockMapUtil.addLock(keyCode); if (lock == null) { lock = LockMapUtil.getLock(keyCode); } CacheObject obj = new CacheObject(); obj.setRegion(region); obj.setKey(key); if ((region != null) && (key != null)) { Object value1 = CacheManager.get(LEVEL_1, region, key); if (value1 == null) { synchronized (lock) { value1 = CacheManager.get(LEVEL_1, region, key); if (value1 != null) { obj.setLevel(LEVEL_1); obj.setValue(value1); return obj; } Object value2 = CacheManager.get(LEVEL_2, region, key); if (value2 != null) { obj.setValue(value2); obj.setLevel(LEVEL_2); CacheManager.set(LEVEL_1, region, key, obj.getValue()); } } } else { obj.setValue(value1); obj.setLevel(LEVEL_1); } } return obj; }
我刚从重新看了 是region和key的组合 然后转为byte字节数组组成的key
回复嗯
回复我刚从测试了下,出现一个问题:10000个线程同时从缓存取,大约前面10个左右都是从L2取得,后面都是从L1取得;我把get方法添加锁,只有第一个从L2取,剩下的都是从L1取,测试效率差距不大
二级缓存里没有 region 的东西哦
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(6)
我刚从重新看了 是region和key的组合 然后转为byte字节数组组成的key
回复
嗯
回复
我刚从测试了下,出现一个问题:10000个线程同时从缓存取,大约前面10个左右都是从L2取得,后面都是从L1取得;我把get方法添加锁,只有第一个从L2取,剩下的都是从L1取,测试效率差距不大
二级缓存里没有 region 的东西哦