如何使用spring boot在redis中使用@cacheable

ymdaylpp  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(494)

我试图用redis实现hashmap,但是我想自己控制这个键,所以我实现了以下服务类。

@Slf4j
@Service
public class RedisService {
    Map<Long, Student> studentMap = new HashMap<>();
    @Cacheable(cacheNames = "studentCache")
    public Map<Long, Student> getStudentCache(){
        return studentMap;
    }
}

我的pojo课是

@Data
public class Student implements Serializable {
    private static final long serialVersionUID = -2722504679276149008L;
    public enum Gender {
        MALE, FEMALE
    }
    private Long id;
    private String name;
    private Gender gender;
    private int grade;

}

和数据加载器

@Slf4j
@Component
public class DataLoader implements CommandLineRunner {

    @Autowired
    RedisService redisService;

    @Override
    public void run(String... args) {
      log.info("================ loading data now ========================");
        Student student = getStudent();
        redisService.getStudentCache().put(student.getId(), student);
        System.out.println("student is "+redisService.getStudentCache().get(student.getId()));
        log.info("================= program ends ==============");
    }

    private Student getStudent() {
        Student student = new Student();
        student.setId(ThreadLocalRandom.current().nextLong());
        student.setName("first last");
        student.setGender(Student.Gender.MALE);
        student.setGrade(85);
        return student;
    }
}

主要类别

@EnableCaching
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

我已经成功地连接到redis,但它似乎没有把任何东西放在缓存中。当我运行程序时,我得到以下消息作为结果。

2020-09-10 15:26:37.605  INFO 28540 --- [           main] c.w.s.components.DataLoader              : ================ loading data now ========================
student is null
2020-09-10 15:26:38.295  INFO 28540 --- [           main] c.w.s.components.DataLoader              : ================= program ends ==============

所以,我不知道为什么学生会返回空任何帮助将不胜感激。

wh6knrhe

wh6knrhe1#

当您第一次访问缓存数据时,缓存正在初始化(具体地说,是特定缓存键的数据,在本例中是常量)。在你的情况下,这是发生在第一次通话结束时 redisService.getStudentCache() . 当时 studentMap 是空Map,因此正在缓存空Map。事实上,不久之后你添加了一些条目(通过 .put(student.getId(), student); )这无关紧要,因为缓存系统使用自己的缓存Map副本,因此从该Map获取值时为空。

相关问题