- 深入實踐Spring Boot
- 陳韶健
- 1591字
- 2019-01-04 03:26:53
2.2 使用Redis
關系型數據庫在性能上總是存在一些這樣那樣的缺陷,所以大家有時候在使用傳統關系型數據庫時,會與具有高效存取功能的緩存系統結合使用,以提高系統的訪問性能。在很多流行的緩存系統中,Redis是一個不錯的選擇。Redis是一種可以持久存儲的緩存系統,是一個高性能的key-value數據庫,它使用鍵-值對的方式來存儲數據。
2.2.1 Redis依賴配置
需要使用Redis,可在工程的Maven配置中加入spring-boot-starter-redis依賴,如代碼清單2-9所示。其中gson是用來轉換Json數據格式的工具,mysql是引用了上一節的模塊,這里使用2.1節定義的實體對象來存取數據,演示在Redis中的存取操作。
代碼清單2-9 Redis模塊的Maven依賴配置
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.2.4</version> </dependency> <dependency> <groupId>springboot.db</groupId> <artifactId>mysql</artifactId> <version>${project.version}</version> </dependency> </dependencies>
2.2.2 創建Redis服務類
Redis提供了下列幾種數據類型可供存取:
·string;
·hash;
·list;
·set及zset。
在實例中,將使用string即字符串的類型來演示數據的存取操作。對于Redis,Spring Boot沒有提供像JPA那樣相應的資源庫接口,所以只能仿照上一節中Repository的定義編寫一個實體User的服務類,如代碼清單2-10所示。這個服務類可以存取對象User以及由User組成的列表List,同時還提供了一個刪除的方法。所有這些方法都是使用RedisTemplate來實現的。
代碼清單2-10 用戶實體的Redis服務類
@Repository public class UserRedis { @Autowired private RedisTemplate<String, String> redisTemplate; public void add(String key, Long time,User user) { Gson gson = new Gson(); redisTemplate.opsForValue().set(key, gson.toJson(user), time, TimeUnit. MINUTES); } public void add(String key, Long time, List<User> users) { Gson gson = new Gson(); redisTemplate.opsForValue().set(key, gson.toJson(users), time, TimeUnit. MINUTES); } public User get(String key) { Gson gson = new Gson(); User user = null; String userJson = redisTemplate.opsForValue().get(key); if(!StringUtils.isEmpty(userJson)) user = gson.fromJson(userJson, User.class); return user; } public List<User> getList(String key) { Gson gson = new Gson(); List<User> ts = null; String listJson = redisTemplate.opsForValue().get(key); if(!StringUtils.isEmpty(listJson)) ts = gson.fromJson(listJson, new TypeToken<List<User>>(){}.getType()); return ts; } public void delete(String key){ redisTemplate.opsForValue().getOperations().delete(key); } }
Redis沒有表結構的概念,所以要實現MySQL數據庫中表的數據(即普通Java對象映射的實體數據)在Redis中存取,必須做一些轉換,使用JSON格式的文本作為Redis與Java普通對象互相交換數據的存儲格式。這里使用Gson工具將類對象轉換為JSON格式的文本進行存儲,要取出數據時,再將JSON文本數據轉化為Java對象。
因為Redis使用了key-value的方式存儲數據,所以存入時要生成一個唯一的key,而要查詢或者刪除數據時,就可以使用這個唯一的key進行相應的操作。
保存在Redis數據庫中的數據默認是永久存儲的,可以指定一個時限來確定數據的生命周期,超過指定時限的數據將被Redis自動清除。在代碼清單2-10中我們以分鐘為單位設定了數據的存儲期限。
另外,為了能正確調用RedisTemplate,必須對其進行一些初始化工作,即主要對它存取的字符串進行一個JSON格式的系列化初始配置,如代碼清單2-11所示。
代碼清單2-11 RedisTemplate初始化
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, String> redisTemplate( RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
2.2.3 Redis測試
如果還沒有安裝Redis服務器,可以參照本書附錄C提供的方法安裝,然后在工程的配置文件application.yml中配置連接Redis服務器等參數,如代碼清單2-12所示。其中host和port分別表示Redis數據庫服務器的IP地址和開放端口,database可以不用指定,由Redis根據存儲情況自動選定(注:測試時這些配置是集成在一個配置類中實現的)。
代碼清單2-12 Redis配置
spring: redis: # database: 1 host: 192.168.1.214 port: 6379 pool: max-idle: 8 min-idle: 0 max-active: 8 max-wait: -1
現在編寫一個JUint測試程序,來演示如何在Redis服務器中存取數據,如代碼清單2-13所示。測試程序創建一個部門對象并將其命名為“開發部”,創建一個角色對象并把它命名為admin,創建一個用戶對象并把它命名為user,同時設定這個用戶屬于“開發部”,并把admin這個角色分配給這個用戶。接著測試程序使用類名等參數生成一個key,并使用這個key清空原來的數據,然后用這個key存儲現在這個用戶的數據,最后使用這個key查詢用戶,并將查到的信息打印出來。
代碼清單2-13 Redis測試程序
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {RedisConfig.class, UserRedis.class}) public class RedisTest { private static Logger logger = LoggerFactory.getLogger(RedisTest.class); @Autowired UserRedis userRedis; @Before public void setup(){ Deparment deparment = new Deparment(); deparment.setName("開發部"); Role role = new Role(); role.setName("admin"); User user = new User(); user.setName("user"); user.setCreatedate(new Date()); user.setDeparment(deparment); List<Role> roles = new ArrayList<>(); roles.add(role); user.setRoles(roles); userRedis.delete(this.getClass().getName()+":userByname:"+user.getName()); userRedis.add(this.getClass().getName()+":userByname:"+user.getName(), 10L, user); } @Test public void get(){ User user = userRedis.get(this.getClass().getName()+":userByname: user"); Assert.notNull(user); logger.info("======user====== name:{}, deparment:{}, role:{}", user.getName(), user.getDeparment().getName(), user.getRoles().get(0). getName()); } }
要運行這個測試程序,可以在IDEA的Run/Debug Configuration配置中增加一個JUint配置項目,模塊選擇redis,工作目錄選擇模塊所在的根目錄,類選擇這個測試程序即dbdemo.redis.test.RedisTest,并將配置保存為redistest。
使用Debug方式運行測試項目redistest。如果測試通過,會輸出一個用戶的用戶名、所屬部門和擁有角色等簡要信息,如下所示:
dbdemo.redis.test.RedisTest - ======user====== name:user, deparment:開發部, role:admin
對于Redis的使用,還可以將注解方式與調用數據庫的方法相結合,那樣就不用再編寫像上面那樣的服務類,并且使用起來更加簡單,這將在后面的章節中介紹。
- 流量的秘密:Google Analytics網站分析與優化技巧(第2版)
- 玩轉Scratch少兒趣味編程
- 自制編譯器
- PaaS程序設計
- Python編程完全入門教程
- 零基礎入門學習Python
- Getting Started with React Native
- Learning Docker Networking
- Mastering VMware Horizon 7(Second Edition)
- 分布式架構原理與實踐
- 深度學習程序設計實戰
- 數據科學中的實用統計學(第2版)
- TypeScript圖形渲染實戰:2D架構設計與實現
- INSTANT Premium Drupal Themes
- Java 7 Concurrency Cookbook