SpringBoot系列—Redis(十七)

個人博客:haichenyi.com。感謝關注

  前面一篇說到了spring boot自帶的緩存SimpleCache,我們也聊到了他的底層實際上就是HashMap,並且這個緩存是放在內存當中的,這樣弊端也是有的,比如:內存大小,當服務器關閉之後,緩存就沒了等等。

簡介

  實際開發中,一般使用緩存中間件:Redis,EHCache,MemCache等等,今天,我們就來聊聊,經常聽到的——Redis。

  Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)——來自官方介紹

  不去追究原理,我們可以這樣理解Redis:

  • 支持多種數據類型,redis支持set,zset,list,hash,string這五種數據類型,操作方便。
  • 作爲一個內存數據庫,最擔心的,就是萬一機器死機宕機,數據就會消失掉。redis使用RDB和AOF做數據的持久化存儲。主從數據同時,生成rdb文件,並利用緩衝區添加新的數據更新操作做對應的同步。
  • 與服務器解耦,緩存是一個單獨的服務器,當我們項目重啓的時候,緩存依然存在。
  • 我們只用的話,它就是給我們提供了一系列方法的接口,我們只用調用它的API即可。

用法

  第一步,添加啓動器:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

  第二步,配置你的服務器地址,不配置的話,默認是本地:配置信息一樣在 自動配置類——data包——redis包——RedisProperties類 裏面去找

#指定redis服務器地址,指定的是本地
spring.redis.host=127.0.0.1

  第三步,添加了redis的配置類,當數據庫添加複雜數據的時候,也能以Json的格式正常顯示。

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        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.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }
}

  第四步,正常寫接口,在service層裏面,自己去把數據寫進緩存裏面,

package com.haichenyi.springboottask.service;

import com.haichenyi.springboottask.Provider;
import com.haichenyi.springboottask.mapper.ProviderMapper;
import com.haichenyi.springboottask.utils.RedisClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Desc
 * @Auther 海晨憶
 * @Time 2019/11/6
 */
@Service
public class ProviderService {
    @Autowired
    ProviderMapper providerMapper;

    @Autowired
    RedisClient redisClient;

    public Provider getProviderById(Integer pid) {
        Provider provider = (Provider) redisClient.get(pid);
        if (provider != null) {
            return provider;
        }
        Provider provider1 = providerMapper.getProviderByPid(pid);
        redisClient.set(pid, provider1);
        return provider1;
    }
}

  如上代碼,我們通過id獲取一個Provider,我們先從緩存去取,如果,取不到,說明緩存沒有,那麼,我們就去從數據庫去取,取到之後,再把這條數據放進緩存裏面。

  就是上一篇講默認緩存的註解的功能,redis裏面需要我們自己去實現。

  這裏的 RedisClient 類,是自己封裝的redis使用的類,至於redis怎麼使用,redis的中文官網的命令頁面寫的很清楚。

  記得本地電腦裝一個Redis服務。然後再本地裝一個redis可視化工具。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章