Redis中防止缓冲穿透时候,如果从数据库查询到一个null集合,我在设置redis缓冲时候Vaule应该设置为什么?

一蓑烟雨任平生
  • 2
新手上路,请多包涵

Redis中防止缓冲穿透时候,如果从数据库查询到一个null集合,我在设置redis缓冲时候Vaule应该设置为什么?

相关代码

GameDTO gameDTO = getGameDTO2(gameId);
List<GameBoxRoundDTO> gameBoxRoundDTOS = (List<GameBoxRoundDTO>) redisTemplate.boundHashOps("boxLogs").get(restSession.getUserId());
if (Misc.isNull(gameBoxRoundDTOS)){
    MongoClient mongoClient = new MongoClient(new MongoClientURI(uri));
    MongoTemplate mongoTemplate = getMongoTemplate(mongoClient, gameDTO.getMongodbDbName());
    Query query = new Query();
    query.addCriteria(Criteria.where("players.user_id").is(restSession.getUserId()));
    query.addCriteria(Criteria.where("end_time").gt(date));
    query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "end_time")));
    query.limit(20);
    gameBoxRoundDTOS = mongoTemplate.find(query, GameBoxRoundDTO.class);
    if (gameBoxRoundDTOS.size()==0){
        redisTemplate.boundHashOps("boxLogs").put(restSession.getUserId(),???????);
        redisTemplate.expire("boxLogs",60,TimeUnit.SECONDS);
    }else {
        redisTemplate.boundHashOps("boxLogs").put(restSession.getUserId(),gameBoxRoundDTOS);
        redisTemplate.expire("boxLogs",60,TimeUnit.SECONDS);
    }
    System.out.println("集合来自数据库");
}else {
    System.out.println("集合来自Redis缓冲");
}

你期待的结果是什么?实际看到的错误信息又是什么?

在以上代码中问号处,我应该设置为什么?保证下次查询不再重复查询数据库。

回复
阅读 1.7k
3 个回答

user_id应该不会为0或者负数吧;你可以设置成0或者某个特殊的负数。查询数据库之前查询缓存,如果该user_id查询的值是负数,则直接返回。
核心思想:和数据库中的真实数据要有区分。

基于缓存更新的频率,设置Redis的key的过期时间吧。Value设置的数据和真实数据不相干就行

设置一个不会混淆你数据库中的值并设置过期时间,然后你只要判断到这个值就直接return了。

宣传栏