<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、mybatis實戰(zhàn),封裝RedisUtils工具類,redis緩存mybatis數(shù)據(jù) 附源碼

          共 39906字,需瀏覽 80分鐘

           ·

          2021-07-10 09:52

          點擊上方藍色字體,選擇“標(biāo)星公眾號”

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

            作者 |  陳彥斌

          來源 |  urlify.cn/UZFbAf


          導(dǎo)讀

            Redis不了解的小伙伴,先去腦補下Redis從入門到精通,點我直達。在看下面的東西喲~

          創(chuàng)建SpringBoot項目

          在線創(chuàng)建方式

          網(wǎng)址:https://start.spring.io/

          然后創(chuàng)建Controller、Mapper、Service包

          SpringBoot整合Redis

          引入Redis依賴

                  <!--SpringBoot與Redis整合依賴-->
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-data-redis</artifactId>
                  </dependency>

          完整pom.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
              <modelVersion>4.0.0</modelVersion>
              <parent>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-parent</artifactId>
                  <version>2.3.3.RELEASE</version>
                  <relativePath/> <!-- lookup parent from repository -->
              </parent>
              <groupId>com.cyb</groupId>
              <artifactId>chenyb-mobile-redis</artifactId>
              <version>0.0.1-SNAPSHOT</version>
              <name>chenyb-mobile-redis</name>
              <description>Demo project for Spring Boot</description>

              <properties>
                  <java.version>1.8</java.version>
              </properties>

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

                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-test</artifactId>
                      <scope>test</scope>
                      <exclusions>
                          <exclusion>
                              <groupId>org.junit.vintage</groupId>
                              <artifactId>junit-vintage-engine</artifactId>
                          </exclusion>
                      </exclusions>
                  </dependency>
                  <dependency>
                      <groupId>io.projectreactor</groupId>
                      <artifactId>reactor-test</artifactId>
                      <scope>test</scope>
                  </dependency>
                  <!--SpringBoot與Redis整合依賴-->
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-data-redis</artifactId>
                  </dependency>
              </dependencies>

              <build>
                  <plugins>
                      <plugin>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-maven-plugin</artifactId>
                      </plugin>
                  </plugins>
              </build>

          </project>

          設(shè)置Redis的Template

          RedisConfig.java

          package com.cyb.mobile.config;

          import org.springframework.context.annotation.Bean;
          import org.springframework.context.annotation.Configuration;
          import org.springframework.data.redis.connection.RedisConnectionFactory;
          import org.springframework.data.redis.core.RedisTemplate;
          import org.springframework.data.redis.serializer.RedisSerializer;
          import org.springframework.data.redis.serializer.StringRedisSerializer;

          /**
           * @ClassName:RedisConfig
           * @Description:Redis配置類
           * @Author:chenyb
           * @Date:2020/8/16 11:48 下午
           * @Versiion:1.0
           */
          @Configuration //當(dāng)前類為配置類
          public class RedisConfig {
              @Bean //redisTemplate注入到Spring容器
              public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory factory){
                  RedisTemplate<String,String> redisTemplate=new RedisTemplate<>();
                  RedisSerializer<String> redisSerializer = new StringRedisSerializer();
                  redisTemplate.setConnectionFactory(factory);
                  //key序列化
                  redisTemplate.setKeySerializer(redisSerializer);
                  //value序列化
                  redisTemplate.setValueSerializer(redisSerializer);
                  //value hashmap序列化
                  redisTemplate.setHashKeySerializer(redisSerializer);
                  //key hashmap序列化
                  redisTemplate.setHashValueSerializer(redisSerializer);
                  return redisTemplate;
              }
          }

          設(shè)置Redis連接信息

          # 連接的那個數(shù)據(jù)庫
          spring.redis.database=0
          # redis服務(wù)的ip地址
          spring.redis.host=192.168.199.142
          # redis端口號
          spring.redis.port=6379
          # redis的密碼,沒設(shè)置過密碼,可為空
          spring.redis.password=12345678

          Redis工具類

          redisTemplate API

          1. opsForValue ==》String

          2. opsForSet ==》Set

          3. opsForHash ==》hash

          4. opsForZset ==》SortSet

          5. opsForList ==》list隊列

          RedisUtils.java

          package com.cyb.mobile.utils;

          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.data.redis.core.*;
          import org.springframework.stereotype.Service;

          import java.io.Serializable;
          import java.util.List;
          import java.util.Set;
          import java.util.concurrent.TimeUnit;

          /**
           * @ClassName:RedisUtils
           * @Description:Redis工具類
           * @Author:chenyb
           * @Date:2020/8/17 12:05 上午
           * @Versiion:1.0
           */
          @Service
          public class RedisUtils {
              @Autowired
              private RedisTemplate redisTemplate;

              private static double size = Math.pow(2, 32);


              /**
               * 寫入緩存
               *
               * @param key
               * @param offset   位 8Bit=1Byte
               * @return
               */
              public boolean setBit(String key, long offset, boolean isShow) {
                  boolean result = false;
                  try {
                      ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
                      operations.setBit(key, offset, isShow);
                      result = true;
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  return result;
              }

              /**
               * 寫入緩存
               *
               * @param key
               * @param offset
               * @return
               */
              public boolean getBit(String key, long offset) {
                  boolean result = false;
                  try {
                      ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
                      result = operations.getBit(key, offset);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  return result;
              }


              /**
               * 寫入緩存
               *
               * @param key
               * @param value
               * @return
               */
              public boolean set(final String key, Object value) {
                  boolean result = false;
                  try {
                      ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
                      operations.set(key, value);
                      result = true;
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  return result;
              }

              /**
               * 寫入緩存設(shè)置時效時間
               *
               * @param key
               * @param value
               * @return
               */
              public boolean set(final String key, Object value, Long expireTime) {
                  boolean result = false;
                  try {
                      ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
                      operations.set(key, value);
                      redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
                      result = true;
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  return result;
              }

              /**
               * 批量刪除對應(yīng)的value
               *
               * @param keys
               */
              public void remove(final String... keys) {
                  for (String key : keys) {
                      remove(key);
                  }
              }


              /**
               * 刪除對應(yīng)的value
               *
               * @param key
               */
              public void remove(final String key) {
                  if (exists(key)) {
                      redisTemplate.delete(key);
                  }
              }

              /**
               * 判斷緩存中是否有對應(yīng)的value
               *
               * @param key
               * @return
               */
              public boolean exists(final String key) {
                  return redisTemplate.hasKey(key);
              }

              /**
               * 讀取緩存
               *
               * @param key
               * @return
               */
              public Object get(final String key) {
                  Object result = null;
                  ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
                  result = operations.get(key);
                  return result;
              }

              /**
               * 哈希 添加
               *
               * @param key
               * @param hashKey
               * @param value
               */
              public void hmSet(String key, Object hashKey, Object value) {
                  HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
                  hash.put(key, hashKey, value);
              }

              /**
               * 哈希獲取數(shù)據(jù)
               *
               * @param key
               * @param hashKey
               * @return
               */
              public Object hmGet(String key, Object hashKey) {
                  HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
                  return hash.get(key, hashKey);
              }

              /**
               * 列表添加
               *
               * @param k
               * @param v
               */
              public void lPush(String k, Object v) {
                  ListOperations<String, Object> list = redisTemplate.opsForList();
                  list.rightPush(k, v);
              }

              /**
               * 列表獲取
               *
               * @param k
               * @param l
               * @param l1
               * @return
               */
              public List<Object> lRange(String k, long l, long l1) {
                  ListOperations<String, Object> list = redisTemplate.opsForList();
                  return list.range(k, l, l1);
              }

              /**
               * 集合添加
               *
               * @param key
               * @param value
               */
              public void add(String key, Object value) {
                  SetOperations<String, Object> set = redisTemplate.opsForSet();
                  set.add(key, value);
              }

              /**
               * 集合獲取
               *
               * @param key
               * @return
               */
              public Set<Object> setMembers(String key) {
                  SetOperations<String, Object> set = redisTemplate.opsForSet();
                  return set.members(key);
              }

              /**
               * 有序集合添加
               *
               * @param key
               * @param value
               * @param scoure
               */
              public void zAdd(String key, Object value, double scoure) {
                  ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
                  zset.add(key, value, scoure);
              }

              /**
               * 有序集合獲取
               *
               * @param key
               * @param scoure
               * @param scoure1
               * @return
               */
              public Set<Object> rangeByScore(String key, double scoure, double scoure1) {
                  ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
                  redisTemplate.opsForValue();
                  return zset.rangeByScore(key, scoure, scoure1);
              }


              //第一次加載的時候?qū)?shù)據(jù)加載到redis中
              public void saveDataToRedis(String name) {
                  double index = Math.abs(name.hashCode() % size);
                  long indexLong = new Double(index).longValue();
                  boolean availableUsers = setBit("availableUsers", indexLong, true);
              }

              //第一次加載的時候?qū)?shù)據(jù)加載到redis中
              public boolean getDataToRedis(String name) {

                  double index = Math.abs(name.hashCode() % size);
                  long indexLong = new Double(index).longValue();
                  return getBit("availableUsers", indexLong);
              }

              /**
               * 有序集合獲取排名
               *
               * @param key 集合名稱
               * @param value 值
               */
              public Long zRank(String key, Object value) {
                  ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
                  return zset.rank(key,value);
              }


              /**
               * 有序集合獲取排名
               *
               * @param key
               */
              public Set<ZSetOperations.TypedTuple<Object>> zRankWithScore(String key, long start,long end) {
                  ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
                  Set<ZSetOperations.TypedTuple<Object>> ret = zset.rangeWithScores(key,start,end);
                  return ret;
              }

              /**
               * 有序集合添加
               *
               * @param key
               * @param value
               */
              public Double zSetScore(String key, Object value) {
                  ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
                  return zset.score(key,value);
              }


              /**
               * 有序集合添加分數(shù)
               *
               * @param key
               * @param value
               * @param scoure
               */
              public void incrementScore(String key, Object value, double scoure) {
                  ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
                  zset.incrementScore(key, value, scoure);
              }


              /**
               * 有序集合獲取排名
               *
               * @param key
               */
              public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithScore(String key, long start,long end) {
                  ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
                  Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeByScoreWithScores(key,start,end);
                  return ret;
              }

              /**
               * 有序集合獲取排名
               *
               * @param key
               */
              public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithRank(String key, long start, long end) {
                  ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
                  Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeWithScores(key, start, end);
                  return ret;
              }
          }

          控制層

          RedisController.java

          package com.cyb.mobile.controller;

          import com.cyb.mobile.utils.RedisUtils;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;

          /**
           * @ClassName:TestController
           * @Description:Redis控制器
           * @Author:chenyb
           * @Date:2020/8/17 12:07 上午
           * @Versiion:1.0
           */
          @RestController
          public class RedisController {
              @Autowired
              private RedisUtils redisUtils;
              @RequestMapping("setAndGet")
              public String test(String k,String v){
                  redisUtils.set(k,v);
                  return (String) redisUtils.get(k);
              }
          }

          測試

          SpringBoot整合Mybatis

          添加依賴

                  <!--mybatis依賴-->
                  <dependency>
                      <groupId>org.mybatis.spring.boot</groupId>
                      <artifactId>mybatis-spring-boot-starter</artifactId>
                      <version>2.1.3</version>
                  </dependency>
                  <!--mysql驅(qū)動-->
                  <dependency>
                      <groupId>mysql</groupId>
                      <artifactId>mysql-connector-java</artifactId>
                  </dependency>
                  <!--druid-->
                  <dependency>
                      <groupId>com.alibaba</groupId>
                      <artifactId>druid</artifactId>
                      <version>1.1.23</version>
                  </dependency>

          完整pom.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
              <modelVersion>4.0.0</modelVersion>
              <parent>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-parent</artifactId>
                  <version>2.3.3.RELEASE</version>
                  <relativePath/> <!-- lookup parent from repository -->
              </parent>
              <groupId>com.cyb</groupId>
              <artifactId>chenyb-mobile-redis</artifactId>
              <version>0.0.1-SNAPSHOT</version>
              <name>chenyb-mobile-redis</name>
              <description>Demo project for Spring Boot</description>

              <properties>
                  <java.version>1.8</java.version>
              </properties>

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

                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-test</artifactId>
                      <scope>test</scope>
                      <exclusions>
                          <exclusion>
                              <groupId>org.junit.vintage</groupId>
                              <artifactId>junit-vintage-engine</artifactId>
                          </exclusion>
                      </exclusions>
                  </dependency>
                  <dependency>
                      <groupId>io.projectreactor</groupId>
                      <artifactId>reactor-test</artifactId>
                      <scope>test</scope>
                  </dependency>
                  <!--SpringBoot與Redis整合依賴-->
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-data-redis</artifactId>
                  </dependency>
                  <!--mybatis依賴-->
                  <dependency>
                      <groupId>org.mybatis.spring.boot</groupId>
                      <artifactId>mybatis-spring-boot-starter</artifactId>
                      <version>2.1.3</version>
                  </dependency>
                  <!--mysql驅(qū)動-->
                  <dependency>
                      <groupId>mysql</groupId>
                      <artifactId>mysql-connector-java</artifactId>
                  </dependency>
                  <!--druid-->
                  <dependency>
                      <groupId>com.alibaba</groupId>
                      <artifactId>druid</artifactId>
                      <version>1.1.23</version>
                  </dependency>
              </dependencies>

              <build>
                  <plugins>
                      <plugin>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-maven-plugin</artifactId>
                      </plugin>
                  </plugins>
              </build>

          </project>

          設(shè)置配置文件

          application.properties

          # 連接的那個數(shù)據(jù)庫
          spring.redis.database=0
          # redis服務(wù)的ip地址
          spring.redis.host=192.168.199.142
          # redis端口號
          spring.redis.port=6379
          # redis的密碼,沒設(shè)置過密碼,可為空
          spring.redis.password=12345678
          # 端口號
          server.port=8081
          # ========================數(shù)據(jù)庫相關(guān)配置=====================
          spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
          spring.datasource.url=jdbc:mysql://localhost:3306/nba?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
          spring.datasource.username=root
          spring.datasource.password=root
          # 使用阿里巴巴druid數(shù)據(jù)源,默認使用自帶
          spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
          #開啟控制臺打印sql
          mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
          # mybatis 下劃線轉(zhuǎn)駝峰配置,兩者都可以
          # mybatis.configuration.mapUnderscoreToCamelCase=true
          mybatis.configuration.map-underscore-to-camel-case=true
          # 配置掃描
          mybatis.mapper-locations=classpath:mapper/*.xml
          # 實體類所在的包別名
          mybatis.type-aliases-package=com.cyb.mobile.domain

          啟動類上添加掃描路徑

          NbaPlayer.java(實體類

          NbaPlayerMapper.xml

          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE mapper
                  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
          <mapper namespace="com.cyb.mobile.mapper.NbaPlayerMapper">
              <select id="ListNbaPlayer" resultType="NbaPlayer">
                  SELECT * FROM nba_player
              </select>
          </mapper>

          NbaPlayerMapper.java

          NbaPlayerService.java

          NbaPlayerServiceImpl.java

          控制器(Controller)

          測試

          redis作為mybatis緩存

          1. 用戶第一次訪問的時候獲取數(shù)據(jù)庫的值,再次訪問時直接從緩存中獲取數(shù)據(jù)

          2. 設(shè)置緩存過期時間

          代碼演示

          添加FastJSON依賴

                  <!--fastjson依賴-->
                  <dependency>
                      <groupId>com.alibaba</groupId>
                      <artifactId>fastjson</artifactId>
                      <version>1.2.73</version>
                  </dependency>
              @RequestMapping("test")
              public Object test(){
                  //step1 先從redis中取
                  String strJson=(String) redisUtils.get("nbaPlayerCache");
                  if (strJson==null){
                      System.out.println("從db取值");
                      // step2如果拿不到則從DB取值
                     List<NbaPlayer> listNbaPlayer=nbaPlayerService.ListNbaPlayer();
                     // step3 DB非空情況刷新redis值
                     if (listNbaPlayer!=null){
                         redisUtils.set("nbaPlayerCache", JSON.toJSONString(listNbaPlayer));
                         return listNbaPlayer;
                     }
                     return null;
                  }else
                  {
                      System.out.println("從redis緩存取值");
                      return JSONObject.parseArray(strJson,NbaPlayer.class);
                  }
              }

          注意

            項目8080是對外端口(向外部暴露的端口),區(qū)別于內(nèi)部進程號,查內(nèi)部端口用ps -ef|grep port,查外部端口用lsof -i:port

           

          壓測工具

            上面我們已經(jīng)SpringBoot整合Redis和Mybatis,但是無法知道具體QPS多少,此時我們可以使用壓測工具來測壓,點我直達










          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  国产在线观看999 | 极品人妻超碰在线 | 蜜芽亚洲无码 | 欧美性爱视频一区二区 | 欧美撸一撸 |