1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Spring Boot 中集成Redis

        共 12127字,需瀏覽 25分鐘

         ·

        2021-03-09 15:26

        本來(lái)已收錄到我寫(xiě)的10萬(wàn)字Springboot經(jīng)典學(xué)習(xí)筆記中,筆記在持續(xù)更新……文末有領(lǐng)取方式

        1. Redis 介紹

        Redis 是一種非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL),NoSQL 是以 key-value 的形式存儲(chǔ)的,和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)不一樣,不一定遵循傳統(tǒng)數(shù)據(jù)庫(kù)的一些基本要求,比如說(shuō) SQL 標(biāo)準(zhǔn),ACID 屬性,表結(jié)構(gòu)等等,這類數(shù)據(jù)庫(kù)主要有以下特點(diǎn):非關(guān)系型的、分布式的、開(kāi)源的、水平可擴(kuò)展的。NoSQL 使用場(chǎng)景有:對(duì)數(shù)據(jù)高并發(fā)讀寫(xiě)、對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)、對(duì)數(shù)據(jù)的高可擴(kuò)展性和高可用性等等。Redis 的 key 可以是字符串、哈希、鏈表、集合和有序集合。value 類型很多,包括 String、list、set、zset。這些數(shù)據(jù)類型都支持 push/pop、add/remove、取交集和并集以及更多更豐富的操作,Redis 也支持各種不同方式的排序。為了保證效率,數(shù)據(jù)都是在緩存在內(nèi)存中,它也可以周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件中。有了 redis 有哪些好處呢?舉個(gè)比較簡(jiǎn)單的例子,看下圖:

        Redis使用場(chǎng)景

        Redis 集群和 Mysql 是同步的,首先會(huì)從 redis 中獲取數(shù)據(jù),如果 redis 掛了,再?gòu)?mysql 中獲取數(shù)據(jù),這樣網(wǎng)站就不會(huì)掛掉。更多關(guān)于 redis 的介紹以及使用場(chǎng)景,可以谷歌和百度,在這就不贅述了。

        2. Redis 安裝

        本課程是在 vmvare 虛擬機(jī)中來(lái)安裝的 redis (centos 7),學(xué)習(xí)的時(shí)候如果有自己的阿里云服務(wù)器,也可以在阿里云中來(lái)安裝 redis,都可以。只要能 ping 的通云主機(jī)或者虛擬機(jī)的 ip,然后在虛擬機(jī)或者云主機(jī)中放行對(duì)應(yīng)的端口(或者關(guān)掉防火墻)即可訪問(wèn) redis。下面來(lái)介紹一下 redis 的安裝過(guò)程:

        • 安裝 gcc 編譯

        因?yàn)楹竺姘惭bredis的時(shí)候需要編譯,所以事先得先安裝gcc編譯。阿里云主機(jī)已經(jīng)默認(rèn)安裝了 gcc,如果是自己安裝的虛擬機(jī),那么需要先安裝一下 gcc:

        yum install gcc-c++
        • 下載 redis

        有兩種方式下載安裝包,一種是去官網(wǎng)上下載(https://redis.io),然后將安裝包考到 centos 中,另種方法是直接使用 wget 來(lái)下載:

        wget http://download.redis.io/releases/redis-3.2.8.tar.gz

        如果沒(méi)有安裝過(guò) wget,可以通過(guò)如下命令安裝:

        yum install wget
        • 解壓安裝

        解壓安裝包:

        tar –vzxf redis-3.2.8.tar.gz

        然后將解壓的文件夾 redis-3.2.8 放到 /usr/local/ 下,一般安裝軟件都放在 /usr/local 下。然后進(jìn)入 /usr/local/redis-3.2.8/ 文件夾下,執(zhí)行 make 命令即可完成安裝。【注】如果 make 失敗,可以嘗試如下命令:

        make MALLOC=libc
        make install
        • 修改配置文件

        安裝成功之后,需要修改一下配置文件,包括允許接入的 ip,允許后臺(tái)執(zhí)行,設(shè)置密碼等等。打開(kāi) redis 配置文件:vi redis.conf在命令模式下輸入 /bind 來(lái)查找 bind 配置,按 n 來(lái)查找下一個(gè),找到配置后,將 bind 配置成 0.0.0.0,允許任意服務(wù)器來(lái)訪問(wèn) redis,即:

        bind 0.0.0.0

        使用同樣的方法,將 daemonize 改成 yes (默認(rèn)為 no),允許 redis 在后臺(tái)執(zhí)行。將 requirepass 注釋打開(kāi),并設(shè)置密碼為 123456(密碼自己設(shè)置)。

        • 啟動(dòng) redis

        在 redis-3.2.8 目錄下,指定剛剛修改好的配置文件 redis.conf 來(lái)啟動(dòng) redis:

        redis-server ./redis.conf

        再啟動(dòng) redis 客戶端:

        redis-cli

        由于我們?cè)O(shè)置了密碼,在啟動(dòng)客戶端之后,輸入 auth 123456 即可登錄進(jìn)入客戶端。然后我們來(lái)測(cè)試一下,往 redis 中插入一個(gè)數(shù)據(jù):

        set name CSDN

        然后來(lái)獲取 name

        get name

        如果正常獲取到 CSDN,則說(shuō)明沒(méi)有問(wèn)題。

        3. Spring Boot 集成 Redis

        3.1 依賴導(dǎo)入

        Spring Boot 集成 redis 很方便,只需要導(dǎo)入一個(gè) redis 的 starter 依賴即可。如下:

        <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--阿里巴巴fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.35</version>
        </dependency>

        這里也導(dǎo)入阿里巴巴的 fastjson 是為了在后面我們要存一個(gè)實(shí)體,為了方便把實(shí)體轉(zhuǎn)換成 json 字符串存進(jìn)去。

        3.2 Redis 配置

        導(dǎo)入了依賴之后,我們?cè)?application.yml 文件里配置 redis:

        server:
          port: 8080
        spring:
          #redis相關(guān)配置
          redis:
            database: 5
            # 配置redis的主機(jī)地址,需要修改成自己的
            host: 192.168.48.190
            port: 6379
            password: 123456
            timeout: 5000
            jedis:
              pool:
                # 連接池中的最大空閑連接,默認(rèn)值也是8。
                max-idle: 500
                # 連接池中的最小空閑連接,默認(rèn)值也是0。
                min-idle: 50
                # 如果賦值為-1,則表示不限制;如果pool已經(jīng)分配了maxActive個(gè)jedis實(shí)例,則此時(shí)pool的狀態(tài)為exhausted(耗盡)
                max-active: 1000
                # 等待可用連接的最大時(shí)間,單位毫秒,默認(rèn)值為-1,表示永不超時(shí)。如果超過(guò)等待時(shí)間,則直接拋出JedisConnectionException
                max-wait: 2000

        3.3 常用 api 介紹

        Spring Boot 對(duì) redis 的支持已經(jīng)非常完善了,豐富的 api 已經(jīng)足夠我們?nèi)粘5拈_(kāi)發(fā),這里我介紹幾個(gè)最常用的供大家學(xué)習(xí),其他 api 希望大家自己多學(xué)習(xí),多研究。用到會(huì)去查即可。

        有兩個(gè) redis 模板:RedisTemplate 和 StringRedisTemplate。我們不使用 RedisTemplate,RedisTemplate 提供給我們操作對(duì)象,操作對(duì)象的時(shí)候,我們通常是以 json 格式存儲(chǔ),但在存儲(chǔ)的時(shí)候,會(huì)使用 Redis 默認(rèn)的內(nèi)部序列化器;導(dǎo)致我們存進(jìn)里面的是亂碼之類的東西。當(dāng)然了,我們可以自己定義序列化,但是比較麻煩,所以使用 StringRedisTemplate 模板。StringRedisTemplate 主要給我們提供字符串操作,我們可以將實(shí)體類等轉(zhuǎn)成 json 字符串即可,在取出來(lái)后,也可以轉(zhuǎn)成相應(yīng)的對(duì)象,這就是上面我導(dǎo)入了阿里 fastjson 的原因。

        3.3.1 redis:string 類型

        新建一個(gè) RedisService,注入 StringRedisTemplate,使用 stringRedisTemplate.opsForValue() 可以獲取 ValueOperations<String, String> 對(duì)象,通過(guò)該對(duì)象即可讀寫(xiě) redis 數(shù)據(jù)庫(kù)了。如下:

        public class RedisService {

            @Resource
            private StringRedisTemplate stringRedisTemplate;

            /**
             * set redis: string類型
             * @param key key
             * @param value value
             */

            public void setString(String key, String value){
                ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
                valueOperations.set(key, value);
            }

            /**
             * get redis: string類型
             * @param key key
             * @return
             */

            public String getString(String key){
                return stringRedisTemplate.opsForValue().get(key);
            }

        該對(duì)象操作的是 string,我們也可以存實(shí)體類,只需要將實(shí)體類轉(zhuǎn)換成 json 字符串即可。下面來(lái)測(cè)試一下:

        @RunWith(SpringRunner.class)
        @SpringBootTest
        public class Course14ApplicationTests 
        {

            private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);

         @Resource
         private RedisService redisService;

         @Test
         public void contextLoads() {
                //測(cè)試redis的string類型
                redisService.setString("weichat","程序員私房菜");
                logger.info("我的微信公眾號(hào)為:{}", redisService.getString("weichat"));

                // 如果是個(gè)實(shí)體,我們可以使用json工具轉(zhuǎn)成json字符串,
                User user = new User("CSDN""123456");
                redisService.setString("userInfo", JSON.toJSONString(user));
                logger.info("用戶信息:{}", redisService.getString("userInfo"));
            }
        }

        先啟動(dòng) redis,然后運(yùn)行這個(gè)測(cè)試用例,觀察控制臺(tái)打印的日志如下:

        我的微信公眾號(hào)為:程序員私房菜
        用戶信息:{"password":"123456","username":"CSDN"}

        3.3.2 redis:hash 類型

        hash 類型其實(shí)原理和 string 一樣的,但是有兩個(gè) key,使用 stringRedisTemplate.opsForHash() 可以獲取 HashOperations<String, Object, Object> 對(duì)象。比如我們要存儲(chǔ)訂單信息,所有訂單信息都放在 order 下,針對(duì)不同用戶的訂單實(shí)體,可以通過(guò)用戶的 id 來(lái)區(qū)分,這就相當(dāng)于兩個(gè) key 了。

        @Service
        public class RedisService {

            @Resource
            private StringRedisTemplate stringRedisTemplate;

            /**
             * set redis: hash類型
             * @param key key
             * @param filedKey filedkey
             * @param value value
             */

            public void setHash(String key, String filedKey, String value){
                HashOperations<String, Object, Object> hashOperations = stringRedisTemplate.opsForHash();
                hashOperations.put(key,filedKey, value);
            }

            /**
             * get redis: hash類型
             * @param key key
             * @param filedkey filedkey
             * @return
             */

            public String getHash(String key, String filedkey){
                return (String) stringRedisTemplate.opsForHash().get(key, filedkey);
            }
        }

        可以看出,hash 和 string 沒(méi)啥兩樣,只不過(guò)多了個(gè)參數(shù),Spring Boot 中操作 redis 非常簡(jiǎn)單方便。來(lái)測(cè)試一下:

        @SpringBootTest
        public class Course14ApplicationTests {

            private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);

         @Resource
         private RedisService redisService;

         @Test
         public void contextLoads() {
                //測(cè)試redis的hash類型
                redisService.setHash("user""name", JSON.toJSONString(user));
                logger.info("用戶姓名:{}", redisService.getHash("user","name"));
            }
        }

        3.3.3 redis:list 類型

        使用 stringRedisTemplate.opsForList() 可以獲取 ListOperations<String, String> listOperations  redis 列表對(duì)象,該列表是個(gè)簡(jiǎn)單的字符串列表,可以支持從左側(cè)添加,也可以支持從右側(cè)添加,一個(gè)列表最多包含 2 ^ 32 -1 個(gè)元素。

        @Service
        public class RedisService {

            @Resource
            private StringRedisTemplate stringRedisTemplate;

            /**
             * set redis:list類型
             * @param key key
             * @param value value
             * @return
             */

            public long setList(String key, String value){
                ListOperations<String, String> listOperations = stringRedisTemplate.opsForList();
                return listOperations.leftPush(key, value);
            }

            /**
             * get redis:list類型
             * @param key key
             * @param start start
             * @param end end
             * @return
             */

            public List<String> getList(String key, long start, long end){
                return stringRedisTemplate.opsForList().range(key, start, end);
            }
        }

        可以看出,這些 api 都是一樣的形式,方便記憶也方便使用。具體的 api 細(xì)節(jié)我就不展開(kāi)了,大家可以自己看 api 文檔。其實(shí),這些 api 根據(jù)參數(shù)和返回值也能知道它們是做什么用的。來(lái)測(cè)試一下:

        @RunWith(SpringRunner.class)
        @SpringBootTest
        public class Course14ApplicationTests 
        {

            private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);

         @Resource
         private RedisService redisService;

         @Test
         public void contextLoads() {
                //測(cè)試redis的list類型
                redisService.setList("list""football");
                redisService.setList("list""basketball");
                List<String> valList = redisService.getList("list",0,-1);
                for(String value :valList){
                    logger.info("list中有:{}", value);
                }
            }
        }

        4. 總結(jié)

        本節(jié)主要介紹了 redis 的使用場(chǎng)景、安裝過(guò)程,以及 Spring Boot 中集成 redis 的詳細(xì)步驟。在實(shí)際項(xiàng)目中,通常都用 redis 作為緩存,在查詢數(shù)據(jù)庫(kù)的時(shí)候,會(huì)先從 redis 中查找,如果有信息,則從 redis 中??;如果沒(méi)有,則從數(shù)據(jù)庫(kù)中查,并且同步到 redis 中,下次 redis 中就有了。更新和刪除也是如此,都需要同步到 redis。redis 在高并發(fā)場(chǎng)景下運(yùn)用的很多。


        該文已收錄到我寫(xiě)的《10萬(wàn)字Springboot經(jīng)典學(xué)習(xí)筆記》中,點(diǎn)擊下面小卡片,進(jìn)入【武哥聊編程】,回復(fù):筆記,即可免費(fèi)獲取。

        點(diǎn)贊是最大的支持 

        瀏覽 32
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天操夜夜操天天 | 中文字幕成人无码 | 亚欧成人在钱 | 明星乱淫免费视频欧美 | 97蜜桃狠狠撸 | 大香蕉电影网站 | 人人看人人 | 这里只有精品爱豆视频 | 欧美大鸡巴 | www.欧美色色 |