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>

        SpringBoot集成Redis

        共 39641字,需瀏覽 80分鐘

         ·

        2021-05-11 18:01

        點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

        優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

        76套java從入門到精通實(shí)戰(zhàn)課程分享

        原理分析

        首先,先查看Redis相關(guān)的配置類:

        shift+shift進(jìn)行搜索,查看RedisAutoConfiguration類:

        在我們查看redis的配置類RedisAutoConfiguration時(shí),可以看到RedisAutoConfiguation中封裝了兩個(gè)Bean:

        接下來(lái)查看redis所對(duì)應(yīng)的自動(dòng)配置類:RedisProperties,該類對(duì)應(yīng)一個(gè)properties配置文件,當(dāng)然我們也可以在application中進(jìn)行配置:

        在SpringBoot操作數(shù)據(jù)是封裝在Spring-data中的,jpa、jdbc、mongodb、redis,而在SpringBoot2.x以后與原來(lái)使用的jedis被替換成來(lái)看lettuce,底層已經(jīng)不使用jedis了

        • jedis: 采用的直連,多個(gè)線程操作的話,不安全,要提高安全性要使用jedis pool連接池

        • lettuce: 采用netty,高性能網(wǎng)絡(luò)框架,異步請(qǐng)求,實(shí)例在多線程中可以共享,不存在線程不安全的情況,dubbo底層也是用netty,可以減少線程數(shù)量,更像NIO模式

        整合實(shí)現(xiàn)

        導(dǎo)入依賴pom.xml:

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

        編寫配置文件applacation.yml:

        spring:
            redis:
              host: 127.0.0.1 # Redis服務(wù)器地址
              port: 6379      # Redis服務(wù)器連接端口
              password:    # Redis服務(wù)器連接密碼(默認(rèn)為空)
              database: 0  # Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0)
              jedis:
                pool:
                  max-active: 8   # 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制)
                  max-wait: -1ms  # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制)
                  max-idle: 500   # 連接池中的最大空閑連接
                  min-idle: 0      # 連接池中的最小空閑連接
              lettuce:
                shutdown-timeout: 0ms
              timeout: 1000 # 連接超時(shí)時(shí)間(毫秒)

        測(cè)試:

        @SpringBootTest
        public class SpringbootRedisTest {

            @Autowired
            private RedisTemplate<String,String> redisTemplate;

            @Test
            void contextLoads() {
                redisTemplate.opsForValue().set("key1","value1");
                redisTemplate.opsForValue().set("key2","張三");
                System.out.println("key1="+redisTemplate.opsForValue().get("key1"));
                System.out.println("key2="+redisTemplate.opsForValue().get("key2"));
            }

        }

        運(yùn)行結(jié)果:

        查看RedisTemplate類:

        測(cè)試代碼:

        @Test
        public void test() throws JsonProcessingException {
            //真實(shí)開(kāi)發(fā)一般有使用json傳遞對(duì)象
            User user =new User();
            user.setName("龍?jiān)?);
            user.setAge(10);
            String jsonUser = new ObjectMapper().writeValueAsString(user);
            redisTemplate.opsForValue().set("user",jsonUser);
            System.out.println(redisTemplate.opsForValue().get("user"));
        }

        //新建一個(gè)User類
        @Component
        public class User implements Serializable {//需要序列化Serializable
            private String name;
            private int age;
            
            /**
             * Get,Set,toString
             **/
        }

        運(yùn)行結(jié)果:

        在客戶端進(jìn)行查看:發(fā)現(xiàn)user對(duì)象前面有轉(zhuǎn)義字符

        序列化

        編寫配置類,自定義RedisTemplate,修改默認(rèn)的序列化方式:

        @Configuration
        public class RedisConfig {

          @Bean
          @SuppressWarnings("all")
          public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
              //為了方便開(kāi)發(fā),使用<String,Object>
              RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
              template.setConnectionFactory(factory);
              
              //Json序列化配置
              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);
              
              //String的序列化
              StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

              // key采用String的序列化方式
              template.setKeySerializer(stringRedisSerializer);
              // hash的key也采用String的序列化方式
              template.setHashKeySerializer(stringRedisSerializer);
              // value序列化方式采用jackson
              template.setValueSerializer(jackson2JsonRedisSerializer);
              // hash的value序列化方式采用jackson
              template.setHashValueSerializer(jackson2JsonRedisSerializer);
              template.afterPropertiesSet();

              return template;
          }

        }

        再次測(cè)試:

        //為了方便識(shí)別可以修改:RedisTemplate
        @Autowired
        //private RedisTemplate redisTemplate;
        private RedisTemplate<String,Object> redisTemplate;

        @Test
        public void test() throws JsonProcessingException {
            //真實(shí)開(kāi)發(fā)一般有使用json傳遞對(duì)象
            User user =new User();
            user.setName("龍?jiān)?);
            user.setAge(10);
            String jsonUser = new ObjectMapper().writeValueAsString(user);
            redisTemplate.opsForValue().set("user",jsonUser);
            System.out.println(redisTemplate.opsForValue().get("user"));
        }

        運(yùn)行結(jié)果:

        自定義工具類:

        在真實(shí)開(kāi)發(fā)中,一般不會(huì)使用原生的API而是使用自己封裝的工具類RedisUtil

        @Component
        public final class RedisUtil {

            @Autowired
            private RedisTemplate<String, Object> redisTemplate;

            // =============================common============================
            /**
             * 指定緩存失效時(shí)間
             * @param key  鍵
             * @param time 時(shí)間(秒)
             */
            public boolean expire(String key, long time) {
                try {
                    if (time > 0) {
                        redisTemplate.expire(key, time, TimeUnit.SECONDS);
                    }
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 根據(jù)key 獲取過(guò)期時(shí)間
             * @param key 鍵 不能為null
             * @return 時(shí)間(秒) 返回0代表為永久有效
             */
            public long getExpire(String key) {
                return redisTemplate.getExpire(key, TimeUnit.SECONDS);
            }

            /**
             * 判斷key是否存在
             * @param key 鍵
             * @return true 存在 false不存在
             */
            public boolean hasKey(String key) {
                try {
                    return redisTemplate.hasKey(key);
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 刪除緩存
             * @param key 可以傳一個(gè)值 或多個(gè)
             */
            @SuppressWarnings("unchecked")
            public void del(String... key) {
                if (key != null && key.length > 0) {
                    if (key.length == 1) {
                        redisTemplate.delete(key[0]);
                    } else {
                        redisTemplate.delete(CollectionUtils.arrayToList(key));
                    }
                }
            }

            // ============================String=============================
            /**
             * 普通緩存獲取
             * @param key 鍵
             * @return 值
             */
            public Object get(String key) {
                return key == null ? null : redisTemplate.opsForValue().get(key);
            }

            /**
             * 普通緩存放入
             * @param key   鍵
             * @param value 值
             * @return true成功 false失敗
             */
            public boolean set(String key, Object value) {
                try {
                    redisTemplate.opsForValue().set(key, value);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 普通緩存放入并設(shè)置時(shí)間
             * @param key   鍵
             * @param value 值
             * @param time  時(shí)間(秒) time要大于0 如果time小于等于0 將設(shè)置無(wú)限期
             * @return true成功 false 失敗
             */
            public boolean set(String key, Object value, long time) {
                try {
                    if (time > 0) {
                        redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
                    } else {
                        set(key, value);
                    }
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 遞增
             * @param key   鍵
             * @param delta 要增加幾(大于0)
             */
            public long incr(String key, long delta) {
                if (delta < 0) {
                    throw new RuntimeException("遞增因子必須大于0");
                }
                return redisTemplate.opsForValue().increment(key, delta);
            }

            /**
             * 遞減
             * @param key   鍵
             * @param delta 要減少幾(小于0)
             */
            public long decr(String key, long delta) {
                if (delta < 0) {
                    throw new RuntimeException("遞減因子必須大于0");
                }
                return redisTemplate.opsForValue().increment(key, -delta);
            }

            // ================================Map=================================

            /**
             * HashGet
             * @param key  鍵 不能為null
             * @param item 項(xiàng) 不能為null
             */
            public Object hget(String key, String item) {
                return redisTemplate.opsForHash().get(key, item);
            }

            /**
             * 獲取hashKey對(duì)應(yīng)的所有鍵值
             * @param key 鍵
             * @return 對(duì)應(yīng)的多個(gè)鍵值
             */
            public Map<Object, Object> hmget(String key) {
                return redisTemplate.opsForHash().entries(key);
            }

            /**
             * HashSet
             * @param key 鍵
             * @param map 對(duì)應(yīng)多個(gè)鍵值
             */
            public boolean hmset(String key, Map<String, Object> map) {
                try {
                    redisTemplate.opsForHash().putAll(key, map);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }


            /**
             * HashSet 并設(shè)置時(shí)間
             * @param key  鍵
             * @param map  對(duì)應(yīng)多個(gè)鍵值
             * @param time 時(shí)間(秒)
             * @return true成功 false失敗
             */
            public boolean hmset(String key, Map<String, Object> map, long time) {
                try {
                    redisTemplate.opsForHash().putAll(key, map);
                    if (time > 0) {
                        expire(key, time);
                    }
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }


            /**
             * 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
             * @param key   鍵
             * @param item  項(xiàng)
             * @param value 值
             * @return true 成功 false失敗
             */
            public boolean hset(String key, String item, Object value) {
                try {
                    redisTemplate.opsForHash().put(key, item, value);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
             * @param key   鍵
             * @param item  項(xiàng)
             * @param value 值
             * @param time  時(shí)間(秒) 注意:如果已存在的hash表有時(shí)間,這里將會(huì)替換原有的時(shí)間
             * @return true 成功 false失敗
             */
            public boolean hset(String key, String item, Object value, long time) {
                try {
                    redisTemplate.opsForHash().put(key, item, value);
                    if (time > 0) {
                        expire(key, time);
                    }
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 刪除hash表中的值
             * @param key  鍵 不能為null
             * @param item 項(xiàng) 可以使多個(gè) 不能為null
             */
            public void hdel(String key, Object... item) {
                redisTemplate.opsForHash().delete(key, item);
            }

            /**
             * 判斷hash表中是否有該項(xiàng)的值
             * @param key  鍵 不能為null
             * @param item 項(xiàng) 不能為null
             * @return true 存在 false不存在
             */
            public boolean hHasKey(String key, String item) {
                return redisTemplate.opsForHash().hasKey(key, item);
            }

            /**
             * hash遞增 如果不存在,就會(huì)創(chuàng)建一個(gè) 并把新增后的值返回
             * @param key  鍵
             * @param item 項(xiàng)
             * @param by   要增加幾(大于0)
             */
            public double hincr(String key, String item, double by) {
                return redisTemplate.opsForHash().increment(key, item, by);
            }


            /**
             * hash遞減
             * @param key  鍵
             * @param item 項(xiàng)
             * @param by   要減少記(小于0)
             */
            public double hdecr(String key, String item, double by) {
                return redisTemplate.opsForHash().increment(key, item, -by);
            }

            // ============================set=============================
            /**
             * 根據(jù)key獲取Set中的所有值
             * @param key 鍵
             */
            public Set<Object> sGet(String key) {
                try {
                    return redisTemplate.opsForSet().members(key);
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            /**
             * 根據(jù)value從一個(gè)set中查詢,是否存在
             * @param key   鍵
             * @param value 值
             * @return true 存在 false不存在
             */
            public boolean sHasKey(String key, Object value) {
                try {
                    return redisTemplate.opsForSet().isMember(key, value);
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 將數(shù)據(jù)放入set緩存
             * @param key    鍵
             * @param values 值 可以是多個(gè)
             * @return 成功個(gè)數(shù)
             */
            public long sSet(String key, Object... values) {
                try {
                    return redisTemplate.opsForSet().add(key, values);
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                }
            }

            /**
             * 將set數(shù)據(jù)放入緩存
             * @param key    鍵
             * @param time   時(shí)間(秒)
             * @param values 值 可以是多個(gè)
             * @return 成功個(gè)數(shù)
             */
            public long sSetAndTime(String key, long time, Object... values) {
                try {
                    Long count = redisTemplate.opsForSet().add(key, values);
                    if (time > 0)
                        expire(key, time);
                    return count;
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                }
            }

            /**
             * 獲取set緩存的長(zhǎng)度
             * @param key 鍵
             */
            public long sGetSetSize(String key) {
                try {
                    return redisTemplate.opsForSet().size(key);
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                }
            }


            /**
             * 移除值為value的
             * @param key    鍵
             * @param values 值 可以是多個(gè)
             * @return 移除的個(gè)數(shù)
             */
            public long setRemove(String key, Object... values) {
                try {
                    Long count = redisTemplate.opsForSet().remove(key, values);
                    return count;
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                }
            }

            // ===============================list=================================
            /**
             * 獲取list緩存的內(nèi)容
             *
             * @param key   鍵
             * @param start 開(kāi)始
             * @param end   結(jié)束 0 到 -1代表所有值
             */
            public List<Object> lGet(String key, long start, long end) {
                try {
                    return redisTemplate.opsForList().range(key, start, end);
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            /**
             * 獲取list緩存的長(zhǎng)度
             * @param key 鍵
             */
            public long lGetListSize(String key) {
                try {
                    return redisTemplate.opsForList().size(key);
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                }
            }

            /**
             * 通過(guò)索引 獲取list中的值
             * @param key   鍵
             * @param index 索引 index>=0時(shí), 0 表頭,1 第二個(gè)元素,依次類推;index<0時(shí),-1,表尾,-2倒數(shù)第二個(gè)元素,依次類推
             */
            public Object lGetIndex(String key, long index) {
                try {
                    return redisTemplate.opsForList().index(key, index);
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            /**
             * 將list放入緩存
             *
             * @param key   鍵
             * @param value 值
             */
            public boolean lSet(String key, Object value) {
                try {
                    redisTemplate.opsForList().rightPush(key, value);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 將list放入緩存
             * @param key   鍵
             * @param value 值
             * @param time  時(shí)間(秒)
             */
            public boolean lSet(String key, Object value, long time) {
                try {
                    redisTemplate.opsForList().rightPush(key, value);
                    if (time > 0)
                        expire(key, time);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }

            }

            /**
             * 將list放入緩存
             * @param key   鍵
             * @param value 值
             * @return
             */
            public boolean lSet(String key, List<Object> value) {
                try {
                    redisTemplate.opsForList().rightPushAll(key, value);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }

            }

            /**
             * 將list放入緩存
             * @param key   鍵
             * @param value 值
             * @param time  時(shí)間(秒)
             * @return
             */
            public boolean lSet(String key, List<Object> value, long time) {
                try {
                    redisTemplate.opsForList().rightPushAll(key, value);
                    if (time > 0)
                        expire(key, time);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 根據(jù)索引修改list中的某條數(shù)據(jù)
             * @param key   鍵
             * @param index 索引
             * @param value 值
             * @return
             */
            public boolean lUpdateIndex(String key, long index, Object value) {
                try {
                    redisTemplate.opsForList().set(key, index, value);
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            /**
             * 移除N個(gè)值為value
             * @param key   鍵
             * @param count 移除多少個(gè)
             * @param value 值
             * @return 移除的個(gè)數(shù)
             */
            public long lRemove(String key, long count, Object value) {
                try {
                    Long remove = redisTemplate.opsForList().remove(key, count, value);
                    return remove;
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                }
            }

        }




        版權(quán)聲明本文為CSDN博主「龍?jiān)磍ll」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

        原文鏈接

        https://blog.csdn.net/Lzy410992/article/details/116129636







        粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

        ??????

        ??長(zhǎng)按上方微信二維碼 2 秒


        感謝點(diǎn)贊支持下哈 

        瀏覽 64
        點(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碰碰久久人人九色 | 狂野欧美xxxx韩国少妇 | 美女做爱网站免费视频 |