1 package org.oxerr.spring.cache.redis.scored.example.spring.data.redis.cache;
2
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
5 import org.springframework.boot.CommandLineRunner;
6 import org.springframework.cache.Cache;
7 import org.springframework.cache.CacheManager;
8 import org.springframework.stereotype.Component;
9
10 @Component
11 public class AppRunner implements CommandLineRunner {
12
13 private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);
14
15 private final Cache cache;
16
17 private final BookRepository bookRepository;
18
19 public AppRunner(CacheManager cacheManager, BookRepository bookRepository) {
20 this.bookRepository = bookRepository;
21
22 this.cache = cacheManager.getCache("books");
23 }
24
25 @Override
26 public void run(String... args) throws Exception {
27
28 cache.clear();
29
30 logger.info(".... Testing");
31 logger.info("Cache type: {}", cache.getClass());
32
33 final String isbn = "isbn-1234";
34 final String key = isbn;
35
36 final Book book = bookRepository.saveBook(new Book(isbn, "version 1"));
37 logger.info("Book: {}", book);
38
39
40
41 logger.info("1. The cached data is expired.");
42 cache.clear();
43
44
45 final Thread threadA = new Thread(() -> {
46
47
48 logger.info("2. Request A queries data from persistence layer, got old data(version 1).");
49 Book oldData = bookRepository.getByIsbn(isbn);
50 logger.info("2. Request A queries data from persistence layer, got old data(version 1). Old data: {}", oldData);
51
52
53 logger.info("5. Request A puts old data(version 1) into cache.");
54 Cache.ValueWrapper cachedData = cache.get(key);
55 logger.info("5. Request A puts old data(version 1) into cache. Cached data is stale: {}", cachedData.get());
56
57 }, "Request A");
58
59
60 final Thread threadB = new Thread(() -> {
61
62
63 logger.info("3. Request B writes new data(version 2) into persistence layer.");
64 Book newData = bookRepository.saveBook(new Book(isbn, "version 2"));
65 logger.info("3. Request B writes new data(version 2) into persistence layer. New data: {}", newData);
66
67
68 logger.info("4. Request B evicts old data from cache.");
69 Cache.ValueWrapper cachedData = cache.get(key);
70 logger.info("4. Request B evicts old data from cache. Cached data is null: {}", cachedData);
71
72 }, "Request B");
73
74 threadA.start();
75 Thread.sleep(1000);
76 threadB.start();
77
78 threadA.join();
79 threadB.join();
80
81
82 logger.info(".... Now we have the old data(version 1) in cache.");
83 logger.info("Stale data returned: {}", bookRepository.getByIsbn(isbn));
84 }
85
86 }