package com.cwa.qiji; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * ActiveUserCachePage缓存某几个等级的玩家。 */ class ActiveUserCachePage { private final int capacity; private final Cache<Integer, Integer> cache; // guava cache public ActiveUserCachePage(int capacity) { this.capacity = capacity; cache = CacheBuilder.newBuilder().maximumSize(capacity).build(); } /** * 将活跃玩家放入缓存。 */ public void update(int uid) { cache.put(uid, Integer.MAX_VALUE); } /** * 返回n个随机ID。 */ public List<Integer> getRandomUsers(int n) { ArrayList<Integer> users = new ArrayList<Integer>(cache.asMap().keySet()); int size = users.size(); if (size <= n || n >= capacity) { // 缓存中的ID不够n个 return users; } else { int startIdx = new Random().nextInt(size - n); int endIdx = startIdx + n; return users.subList(startIdx, endIdx); } } /** * 返回全部ID。 */ public List<Integer> getAllUsers() { return new ArrayList<Integer>(cache.asMap().keySet()); } }