2、SpringCloud+MyBatis+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會在其被調用后將其返回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果,而不需要再次執行該方法。另外這里運用到了springBoot的自動配置原理。springBoot默認是以ConcurrentHashMap作為底層存儲數據結構,當引入redis啟動器后,它的自動配置會掃描到redis的存在,從將CacheManager實現類改為使用redis實現。這就是springBoot“開箱即用”的關鍵所在,根據當前項目環境,做出最合適的配置。