今天我們要在原來搭建的框架基礎上集成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
該項目框架我還會繼續更新的,未完待續。。。