游戏中为了提高系统运行速度和游戏承载量,使用缓存是一个必要的手段。本文中的缓存是在guava缓存的基础上增加了数据的持久化状态和异步同步数据的功能,同时对调用API做了封装,以达到简化操作、屏蔽内部实现的目的。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public
class TmpListMultikeyMapCache
extends CacheDefiniens<MapReference<Integer, TmpListMultikey>> {
public TmpListMultikeyMapCache() { } public TmpListMultikeyMapCache( int playerId) { super(playerId); } @Override public MapReference<Integer, TmpListMultikey> load( String... params) { Preconditions.checkArgument(params.length == 1); HibernateDao<TmpListMultikey, Integer> hibernate = ServiceManager.getInstance().getSpringBean( "hibernateDao"); hibernate.setPersistentClass(TmpListMultikey. class); String hql = "from TmpListMultikey where id.NPlayerId = ?"; List<TmpListMultikey> all = hibernate.findAll(hql, NumberUtils.toInt(params[ 0])); Map<Integer, TmpListMultikey> map = new HashMap<Integer, TmpListMultikey>(); for (TmpListMultikey tmpListMultikey : all) { map.put(tmpListMultikey.getId().getNType(), tmpListMultikey); } return new MapReference<Integer, TmpListMultikey>(map); } } |
1
2 3 4 5 6 7 |
public enum PrefixMappping {
$1(TmpFhhdCache. class), $2(TmpListMultikeyListCache. class), $3(TmpListMultikeyMapCache. class); // 部分代码省略 } |
1
2 3 4 5 6 7 8 9 10 11 12 13 |
@Test
public void getTest() { // Single格式缓存获取 SingleReference<TmpFhhd> singleRef = ConcurrentCache.getInstance().get( new TmpFhhdCache( 50769)); TmpFhhd fhhd = singleRef.get(); TmpFhhd fhhd2 = new TmpFhhdCache( 50769).ref().get(); Assert.assertTrue(fhhd == fhhd2); // List格式缓存获取 List<TmpListMultikey> list = ConcurrentCache.getInstance().get( new TmpListMultikeyListCache( 50705)).get(); // Map格式缓存获取 Map<Integer, TmpListMultikey> map = new TmpListMultikeyMapCache( 1001).ref().get(); } |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@Test
public void updateTest() { SingleReference<TmpFhhd> singleRef = new TmpFhhdCache( 50769).ref(); TmpFhhd tmpFhhd = singleRef.get(); if (tmpFhhd == null) { // 新增 tmpFhhd = new TmpFhhd( 50769, 10, 10, ""); } else { // 修改 tmpFhhd.setNCurToken( 10); } // 新增或修改都可以调用update singleRef.update(tmpFhhd); Assert.assertTrue( new TmpFhhdCache( 50769).ref().get().getNCurToken() == 10); // 删除 singleRef.delete(); Assert.assertNull( new TmpFhhdCache( 50769).ref().get()); // 立即保存缓存到DB singleRef.persist(); } |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@Test
public void update2Test() { MapReference<Integer, TmpListMultikey> mapRef = new TmpListMultikeyMapCache( 1001).ref(); TmpListMultikey value = mapRef.get( 1); if (value == null) { mapRef.put( 1, new TmpListMultikey( new TmpListMultikeyPK( 1001, 1), 99)); } TmpListMultikey newValue = new TmpListMultikeyMapCache( 1001).ref().get( 1); newValue.setNValue( 2); // 对于已经存在于缓存中的对象 // 我们可以直接调用update()进行修改 newValue.update(); Assert.assertTrue( new TmpListMultikeyMapCache( 1001).ref().get( 1).getNValue() == 2); // 也可以直接调用delete()进行删除 newValue.delete(); Assert.assertNull( new TmpListMultikeyMapCache( 1001).ref().get( 1)); } |