你应该为你的查询做缓存。为此构建一个内存数据结构,具有级联结构(一次一个字母)。
限制特定查询的返回对象的数量(例如,最多返回 10 个)。显然,您不想返回所有Song
以 letter 开头的 s A
。此外,此列表可能基于重要性(或选择频率) - 您也可以存储它。
对于缓存的内部表示,我推荐这样的东西:
public class SongCacheNode {
private String selector;
private Map<Character, SongCacheNode> subCaches =
new HashMap<Character, SongCacheNode>();
private List<Song> selection = new ArrayList<Song>(10);
private boolean leafNode = false;
private boolean containsAll = false;
}
您可以构建一个树状结构。
- 将
selector
存储该节点的字符串选择器(例如歌曲标题的前缀)。
- 可以为下
subCaches
一个字母存储下一个缓存。
- 可以存储选择的
selection
歌曲标题
- 会
leafNode
说没有更多数据存储在缓存中,您可以使用selection
,或者您必须这样做SQL
- 存储在containsAll
- 如果
containsAll
是真的,那么所有可能的歌曲都存储在 中selection
,如果不是,你仍然需要做 SQL
此结构允许您根据歌曲标题分布构建可变深度缓存。此外,对于选择,您可以选择任何匹配,不仅是前缀匹配(例如许多歌曲标题以“The”开头),进行不区分大小写的查询等。您也可以进行部分缓存,以限制内存使用(例如,最多存储 5 个字符,或者即使有大量歌曲也不存储不常见的查询) - 只需设置containsAll
为false
.