スプリング キャッシュの抽象化を使用して、サービス レイヤーにオブジェクトをキャッシュしています。これは、次のような単純な get/put 操作では問題ありません。
static private final String cacheName = "messages";
@CacheEvict(value=cacheName, key="#message.id")
public void deleteMessage(Message message) {
...
}
@Cacheable(value=cacheName, key="#id")
public Message findMessage(Long id) {
...
}
@CachePut(value=cacheName, key="#message.id")
public void saveMessage(Message message) {
...
}
@CachePut(value=cacheName, key="#message.id")
public Message updateMessage(Message message) {
...
}
ただし、次のメソッドに使用する注釈は次のとおりです。
public long countAllMessages() {
...
}
すべてのオブジェクトがキャッシュに格納されるため、キャッシュから応答を取得し、リポジトリ レイヤーに移動する必要がない方法が必要です。
また、キャッシュは次のメソッドに適用されています。
@Cacheable(cacheName)
public List<Message> findAllMessages() {
...
}
次のように、count メソッドで find all メソッドを呼び出すことができます。
public long countAllMessages() {
return findAllMessages().size();
}
ただし、キャッシュが無効になっている場合、呼び出しは SELECT COUNT(*) を実行する代わりにデータベースからすべてのレコードをロードするため、これは効率的ではありません...