搭建SpringBoot+dubbo+zookeeper+maven框架(三)


今天我們要在原來搭建的框架基礎上集成redis數據庫。

redis是Nosql數據庫中使用較為廣泛的非關系型內存數據庫,redis內部是一個key-value存儲系統。它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型,類似於Java中的map)。Redis基於內存運行並支持持久化的NoSQL數據庫,是當前最熱門的NoSql數據庫之一,也被人們稱為數據結構服務器。 

首先我們要在本地下載並安裝redis數據庫,redis數據庫的安裝網上有太多的例子,這里我就不再贅述了,那么怎么把本地安裝好了的redis數據庫集成到現有的框架中呢?

1.在provider模塊下的pom.xml中添加redis數據庫的依賴:

<spring-boot-starter-redis-version>1.4.7.RELEASE</spring-boot-starter-redis-version>

  <!-- Spring Boot Redis 依賴 -->
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-redis</artifactId>
     <version>${spring-boot-starter-redis-version}</version>
  </dependency>

   <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
   <dependency>
       <groupId>org.springframework.data</groupId>
       <artifactId>spring-data-redis</artifactId>
       <version>2.0.9.RELEASE</version>
   </dependency>

 

這里要注意的是版本的兼容問題,我剛開始org.springframework.data的版本不是2.0.9,而是1.8.0,這個版本和我現在原有的框架不兼容,報錯信息如下:

網上找了好久,說的五花八門,后面我把org.springframework.data的版本改為比較新的2.0.9,錯誤沒了,所以有時候遇到這種兼容問題是最頭痛的,你也可以在我的框架中試一下,把版本改為1.8.0。 [/調皮]

 

2.在項目的provider模塊下的application.properties配置文件中添加redis的配置,配置內容如下: 

## Redis 配置
## Redis數據庫索引(默認為0)
spring.redis.database=0
## Redis服務器地址
spring.redis.host=127.0.0.1
## Redis服務器連接端口
spring.redis.port=6379
## Redis服務器連接密碼(默認為空)
spring.redis.password=123456
## 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=8
## 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1
## 連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=8
## 連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=0
## 連接超時時間(毫秒)
spring.redis.timeout=0

 



如果不在application.properties配置文件中配置,也可以在application.yml配置文件中配置,配置內容如下:
server:
  port: 8082
  servlet:
    context-path: /
spring:
 datasource:
        name: test
        url: jdbc:mysql://127.0.0.1:3306/springdb?useUnicode=true&characterEncoding=utf8
        username: root
        password: root
        # 使用druid數據源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        filters: stat
        maxActive: 20
        initialSize: 1
        maxWait: 60000
        minIdle: 1
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxOpenPreparedStatements: 20

     ## Redis 配置
     ## Redis數據庫索引(默認為0)
 redis:
       #數據庫索引
       database: 0
       host: 127.0.0.1
       port: 6379
       password: 123456
       jedis:
         pool:
           #最大連接數
           max-active: 8
           #最大阻塞等待時間(負數表示沒限制)
           max-wait: -1
           #最大空閑
           max-idle: 8
           #最小空閑ap
           min-idle: 0
       #連接超時時間(毫秒)
       timeout: 10000



#        mybatis:
#          type-aliases-package:  com.lj.common.domin

## 該配置節點為獨立的節點,有很多同學容易將這個配置放在spring的節點下,導致配置無法被識別
mybatis:
  mapper-locations: classpath:mapping/*.xml  #注意:一定要對應mapper映射xml文件的所在路徑
  type-aliases-package: com.lj.common.domin  #注意:對應實體類的路徑

 



但是這里要注意前面已經在application.yml中配置了mysql數據庫,而spring只能有一個,不能重復,所以這次的redis配置要和mysql並齊配置,否則會報錯。關於redis數據庫的密碼,你可以在本地的redis數據庫源文件中有一個名字叫redis.windows.conf的配置文件中查看,如下:

這個也就是你的密碼了。

接下來就是分別在controller層、service層、mapper層編寫邏輯代碼了:

UserController中添加增刪改查方法:

@GetMapping("getUserById")
public User getUserById(){
    System.out.println("進來了!!!!!!!!!!!!!!!!");
    System.out.println(userService.hashCode()+"!!!!!!!!!!!!!!!!");
    int id = 3;
    return userService.getUserById(id);
}

@GetMapping("saveUser")
public void saveUser(){
    System.out.println("進來了!!!!!!!!!!!!!!!!");
    System.out.println(userService.hashCode()+"!!!!!!!!!!!!!!!!");
    User user = new User();
    user.setName("趙洋");
    user.setAge(12);
    user.setSex("女");
    int i = userService.saveUser(user);
    System.out.println("是否保存成功?-------------"+i);
}

@GetMapping("updateUser")
public void updateUser(){
    System.out.println("進來了!!!!!!!!!!!!!!!!");
    System.out.println(userService.hashCode()+"!!!!!!!!!!!!!!!!");
    User user = new User();
    user.setUserId(1);
    user.setName("趙洋");
    user.setAge(13);
    user.setSex("男");
    int i = userService.updateUser(user);
    System.out.println("是否保存成功?-------------"+i);
}

@GetMapping("deleteUser")
public void deleteUser(){
    System.out.println("進來了!!!!!!!!!!!!!!!!");
    System.out.println(userService.hashCode()+"!!!!!!!!!!!!!!!!");
    int id = 3;
    int i = userService.deleteUser(id);
    System.out.println("是否保存成功?-------------"+i);
}

 

UserService中添加增刪改查接口:
User getUserById(int id);
int saveUser(User user);
int updateUser(User user);
int deleteUser(int id);

 

在UserImpl中添加接口的實現類:

 /**
     * 獲取user邏輯:
     * 如果緩存存在,從緩存中獲取user信息
     * 如果緩存不存在,從 DB 中獲取user信息,然后插入緩存
     */
    @Override
    public User getUserById(int id) {
        //從緩存中獲取城市信息
        String key = "user_"+id;
        ValueOperations<String,User> operations = redisTemplate.opsForValue();

        //緩存存在
        boolean hasKey = redisTemplate.hasKey(key);
        User u = operations.get(key);
        System.out.println("是否有緩存:"+hasKey+"  緩存中的值是:"+u);
        if(hasKey){
            User user = operations.get(key);
            LOGGER.info("UserImpl.updateUser() : 從緩存中獲取了user >> " + user.toString());
            return user;
        }
        //從數據庫中獲取user數據
        User user = userMapper.getUserById(id);

        //插入緩存
        operations.set(key, user, 4, TimeUnit.HOURS);
        LOGGER.info("UserImpl.findUserById() :user插入緩存 >> " + user.toString());
        return user;
    }

    public int saveUser(User user){
        return userMapper.saveUser(user);
    }

    /**
     * 更新user邏輯:
     * 如果緩存存在,從緩存中刪除user信息
     * 如果緩存不存在,不操作
     */
    public int updateUser(User user){
        int ret = userMapper.updateUser(user);

        //緩存存在,刪除緩存
        String key = "user_" + user.getUserId();
        boolean haskey = redisTemplate.hasKey(key);
        if (haskey){
            redisTemplate.delete(key);
            LOGGER.info("UserImmpl.updateUser() : 從緩存中刪除user >> " + user.toString());
        }
        return ret;
    }

    /**
     * 刪除user邏輯:
     * 如果緩存存在,從緩存中刪除user信息
     * 如果緩存不存在,不操作
     */
    public int deleteUser(int id){
        int ret = userMapper.deleteUser(id);

        //緩存存在,刪除緩存
        String key = "user_" + id;
        System.out.println("key的值為: " +key);
        boolean haskey = redisTemplate.hasKey(key);
        ValueOperations<String,User> operations = redisTemplate.opsForValue();
        User u = operations.get(key);
        System.out.println("是否有緩存:"+haskey+"  緩存中的值是:"+u);
        if (haskey){
            LOGGER.info("UserImmpl.updateUser() : 從緩存中刪除user >> " + operations.get(key));
            redisTemplate.delete(key);
        }
        return ret;
    }

 

 
然后是在UserMapper中添加接口:
User getUserById(int id);

int saveUser(User user);

int updateUser(User user);

int deleteUser(int id);

 

最后是在UserMapper.xml中添加sql語句:

<select id="getUserById" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select
    <include refid="Base_Column_List" />
    from u_user t
    where t.userId = #{userId,jdbcType=INTEGER}
</select>

<insert id="saveUser" parameterType="com.lj.common.domin.User" >
    insert into u_user
    <trim prefix="(" suffix=")" suffixOverrides="," >
        <if test="userId != null" >
            userId,
        </if>
        <if test="name != null" >
            name,
        </if>
        <if test="age != null" >
            age,
        </if>
        <if test="sex != null" >
            sex,
        </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
        <if test="userId != null" >
            #{userId,jdbcType=INTEGER},
        </if>
        <if test="name != null" >
            #{name,jdbcType=VARCHAR},
        </if>
        <if test="age != null" >
            #{age,jdbcType=INTEGER},
        </if>
        <if test="sex != null" >
            #{sex,jdbcType=VARCHAR},
        </if>
    </trim>
</insert>

<update id="updateUser" parameterType="com.lj.common.domin.User" >
    UPDATE u_user
    SET
    <if test="name != null" >
        name = #{name},
    </if>
    <if test="age != null" >
        age = #{age},
    </if>
    <if test="sex != null" >
        sex = #{sex}
    </if>
    WHERE
    userId = #{userId}
</update>


<delete id="deleteUser" parameterType="java.lang.Integer">
    delete from
    u_user
    where
    userId = #{userId}
</delete>

 

現在所有的配置和邏輯代碼都寫完了,來測試一下吧:
先查詢,輸入網址:http://localhost:8081/getUserById

 

這時緩存已經存進redis數據庫,再次訪問該網址,顯示如下:

 

說明這次是直接從redis數據庫中撈取數據的,
剩下還有增刪改的測試都是可以的,這里就不一一進行展示了。
至此,redis集成到該框架成功!!!
該項目框架我已經上傳到了CSDN上,網址如下:https://download.csdn.net/download/weixin_38340967/10649806
該項目框架我還會繼續更新的,未完待續。。。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM