在Spring中使用缓存操作缓存

时间:2018-04-12 12:01:10

标签: java spring caching concurrency spring-cache

我在互联网上看了很多东西,但我没有找到满足我需求的任何解决方案。

以下示例代码不起作用,但显示了我对更好理解的要求。

@Service
public class FooCachedService {

    @Autowired
    private MyDataRepository dataRepository;

    private static ConcurrentHashMap<Long, Object> cache = new ConcurrentHashMap<>();

    public void save(Data data) {
        Data savedData = dataRepository.save(data);
        if (savedData.getId() != null) {
            cache.put(data.getRecipient(), null);
        }
    }

    public Data load(Long recipient) {
        Data result = null;

        if (!cache.containsKey(recipient)) {
            result = dataRepository.findDataByRecipient(recipient);
            if (result != null) {
                cache.remove(recipient);
                return result;
            }
        }

        while (true) {
            try {
                if (cache.containsKey(recipient)) {
                    result = dataRepository.findDataByRecipient(recipient);
                    break;
                }
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}

和数据对象:

public class Data {
    private Long id;
    private Long recipient;
    private String payload;

    // getters and setters
}

正如您在上面的代码中看到的,我需要实现服务,它将新数据存储到数据库和缓存中。

整个算法看起来应该是这样的:

某些userA向我的控制器创建POST请求以存储数据,并且它会解除我的服务保存方法。

另一个用户B登录系统发送请求GET到我的控制器,我的服务的方法加载。在此方法中,将已发送请求的已记录用户ID与地图中的收件人ID进行比较。如果map包含该用户的数据,则使用存储库提取其他算法每秒检查一次是否存在该用户的一些新数据(此检查将是一些超时,例如30秒,并且在30秒后请求返回空数据,并且用户创建新数据GET请求等等......)

你能告诉我是否有可能以优雅的方式做到这一点以及如何做到这一点?如何使用缓存或什么是最佳实践?我是这方面的新手,所以我将不胜感激任何建议。

0 个答案:

没有答案