View Javadoc
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  		// Clear cache before test.
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  		// 1. The cached data is expired.
40  		// Clear cache to mock the cached data is expired.
41  		logger.info("1. The cached data is expired.");
42  		cache.clear();
43  
44  		// Request A querying data.
45  		final Thread threadA = new Thread(() -> {
46  
47  			// 2. Request A queries data from persistence layer, got old data(version 1).
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  			// 5. Request A puts old data(version 1) into cache.
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  		// Request B updating data.
60  		final Thread threadB = new Thread(() -> {
61  
62  			// 3. Request B writes new data(version 2) into persistence layer.
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  			// 4. Request B evicts old data from cache.
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  		// Now we have the old data(version 1) in cache.
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  }