SpringCloud+Redis
redis①是一種nosql資料庫,以鍵值對<key,value>的形式儲存資料,其速度相比於MySQL之類的資料庫,相當於記憶體讀寫與硬碟讀寫的差別,所以常常用作快取,用於少寫多讀的場景下,直接從快取拿資料比從資料庫(資料庫要I/O操作)拿要快得多。
話不多說,接下來緊接上一章《SpringCloud+MyBatis+Redis整合—— 超詳細例項(一)》搭建SpringCloud+MyBatis+Redis環境:
- 第一步:在pom.xml檔案中新增
1 <!-- Redis快取整合開始 --> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-data-redis</artifactId> 5 </dependency> 6 <!-- Redis快取整合結束 -->
- 第二步:下載Windows版Redis https://github.com/MSOpenTech/redis/releases
開啟一個 cmd 視窗 使用cd命令切換目錄到 F:\dev-space\workspaces\newPlatform-2018\RedisForWindow 執行 redis-server.exe redis.windows.conf 。(放檔案的實際路徑)
- 第三步:建立RedisConfig配置類,相當於在xml檔案中的bean
1 @Configuration②
2 @EnableCaching③
3 public class RedisConfig extends CachingConfigurerSupport { 4 5 @Bean 6 public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) { 7 RedisCacheManager rm = new RedisCacheManager(redisTemplate); 8 rm.setDefaultExpiration(30l);// 設定快取時間 9 return rm; 10 } 11 12 @Bean 13 public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { 14 StringRedisTemplate template = new StringRedisTemplate(factory); 15 @SuppressWarnings({ "rawtypes", "unchecked" }) 16 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); 17 ObjectMapper om = new ObjectMapper(); 18 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 19 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 20 jackson2JsonRedisSerializer.setObjectMapper(om); 21 template.setValueSerializer(jackson2JsonRedisSerializer); 22 template.afterPropertiesSet(); 23 return template; 24 } 25 // @Bean 26 // public JedisConnectionFactory redisConnectionFactory() { 27 // JedisConnectionFactory factory = new JedisConnectionFactory(); 28 // factory.setHostName(host); 29 // factory.setPort(port); 30 // factory.setPassword(password); 31 // factory.setTimeout(timeout); //設定連線超時時間 32 // return factory; 33 // } 不配置埠預設為6379 34 }
- 第四步:改造controller類,新增Service類讓方法擁有Redis快取
1 @Service 2 public class UserService { 3 @Autowired 4 private UserMapper userMapper; 5 6 @Cacheable(value="user", key="'user'")④
7 public User selectByPrimaryKey(Integer id) { 8 System.out.println("開始查詢....."); 9 try { 10 Thread.sleep(3 * 1000l); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 System.out.println("查詢結束......"); 15 User user=userMapper.selectByPrimaryKey(id); 16 17 return user; 18 } 19 20 }
1 @RestController 2 public class HelloController { 3 @Autowired 4 private UserService userService; 5 6 @RequestMapping("/hello") 7 public String index() { 8 long beginTime=System.currentTimeMillis(); 9 User user = userService.selectByPrimaryKey(1); 10 long time=System.currentTimeMillis()-beginTime; 11 return "Hello SpringBoot"+user.getName()+",消耗查詢時間:"+time; 12 13 } 14 15 16 }
- 第五步:在頁面輸入http://127.0.0.1:1111/hello,第一次可以看到通過查詢並延遲三秒
當第二次輸入後,該查詢會從Redis快取中獲取,所以時間沒有延遲三秒,並且非常迅速
從cmd中 該目錄下輸入 redis-cli get user得到:
說明該物件以存入Redis快取當中。
至此,SpringCloud+MyBats+Redis搭建成功!
專案完整程式碼見https://github.com/Adosker/hello
註釋一:Redis:屬於獨立的執行程式,需要單獨安裝後,使用Java中的Jedis來操縱。因為它是獨立,所以如果你寫個單元測試程式,放一些資料在Redis中,然後又寫一個程式去拿資料,那麼是可以拿到這個資料的。
ehcache:與Redis明顯不同,它與java程式是綁在一起的,java程式活著,它就活著。譬如,寫一個獨立程式放資料,再寫一個獨立程式拿資料,那麼是拿不到資料的。只能在獨立程式中才能拿到資料。
註釋二:從Spring3.x開始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,現在我們就處於這個時代,並且Spring4.x和Spring boot都推薦使用java配置的方式。
Spring的Java配置方式是通過 @Configuration 和 @Bean 這兩個註解實現的:
1、@Configuration 作用於類上,相當於一個xml配置檔案;
2、@Bean 作用於方法上,相當於xml配置中的<bean>;
註釋三:@EnableCaching註解是spring framework中的註解驅動的快取管理功能。自spring版本3.1起加入了該註解。
當你在配置類(@Configuration)上使用@EnableCaching註解時,會觸發一個post processor,這會掃描每一個spring bean,檢視是否已經存在註解對應的快取。如果找到了,就會自動建立一個代理攔截方法呼叫,使用快取的bean執行處理,等同於XML檔案中配置<cache:annotation-driven/>。
註釋四:@Cacheable可以標記在一個方法上,也可以標記在一個類上。當標記在一個方法上時表示該方法是支援快取的,當標記在一個類上時則表示該類所有的方法都是支援快取的。對於一個支援快取的方法,Spring會在其被呼叫後將其返回值快取起來,以保證下次利用同樣的引數來執行該方法時可以直接從快取中獲取結果,而不需要再次執行該方法。