• 搭建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
    该项目框架我还会继续更新的,未完待续。。。




  • 相关阅读:
    idea git 操作
    1
    python 迭代器/生成器/迭代对象
    python 中的type
    systemd 配置文件
    python 中类的初始化过程
    mysql主从错误180301
    从零开始搭建k8s-20180301
    kubernetes role
    Java程序员毕业两年自述
  • 原文地址:https://www.cnblogs.com/gaopengfirst/p/9598655.html
Copyright © 2020-2023  润新知