<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          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í)開發(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) {
                //為了方便開發(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í)開發(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í)開發(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 開始
               * @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)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费一区二区三区四区 | 国产日韩一区二区三免费高清 | 毛片网站在线看 | 久久天天射一射 | 日韩有码一区 |