官术网_书友最值得收藏!

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的使用,還可以將注解方式與調用數據庫的方法相結合,那樣就不用再編寫像上面那樣的服務類,并且使用起來更加簡單,這將在后面的章節中介紹。

主站蜘蛛池模板: 古交市| 澎湖县| 疏附县| 大竹县| 吉安市| 黎平县| 巴彦县| 庆云县| 福泉市| 津市市| 确山县| 汕尾市| 衡阳县| 湖南省| 衡南县| 屏南县| 寿宁县| 如皋市| 东海县| 平顶山市| 利川市| 山东省| 吉安县| 哈巴河县| 天水市| 金阳县| 西吉县| 昌宁县| 驻马店市| 和林格尔县| 肇州县| 石屏县| 肇源县| 安乡县| 墨脱县| 嘉定区| 高安市| 安康市| 明溪县| 城市| 安顺市|