Spring Boot环境下dubbo+zookeeper详解教程实战之三
今天我们要在原来搭建的框架基础上集成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 该项目框架我还会继续更新的,未完待续。。。







评论