網(wǎng)站建設(shè)網(wǎng)站軟件有哪些方面深圳網(wǎng)站建設(shè)公司
redis只管存不管刪除 讓失效時間刪除的問題
- 一:背景介紹
- 二:思路&方案
- 三:代碼模擬
- 1.錯誤示范
- 通過班級id查詢課程名稱
- 執(zhí)行結(jié)果
- 通過班級id修改課程名稱(并沒有刪除對應(yīng)緩存)
- 執(zhí)行結(jié)果
- 2.正確示范
- 在錯誤示范的更新接口上添加刪除緩存的代碼
- 四:總結(jié)
- 五:升華
一:背景介紹
本篇博客是對項目開發(fā)中出現(xiàn)的redis只管存不管刪除 讓失效時間刪除的問題進(jìn)行的總結(jié)和改進(jìn)。目的是將經(jīng)歷轉(zhuǎn)變?yōu)樽约旱慕?jīng)驗。通過博客的方式分享給大家,大家一起共同進(jìn)步和提高。
代碼邏輯
- 通過redis查詢該課程下所有班級的信息
- 如果沒有從redis中查詢到數(shù)據(jù)就從數(shù)據(jù)庫中查詢并存入到redis中一份
存在的問題
3. 并沒有在更新課程下班級數(shù)據(jù)的時候刪除緩存,會導(dǎo)致如果我更新了該課程下的班級數(shù)據(jù),會導(dǎo)致緩存中的數(shù)據(jù)與數(shù)據(jù)中的數(shù)據(jù)不一致,當(dāng)我再次查詢數(shù)據(jù)的時候,如果我的key鍵沒有過期會直接從redis中查詢數(shù)據(jù),但是查詢的數(shù)據(jù)是沒有更新之前的數(shù)據(jù)。如果我key鍵正好過期了才會從數(shù)據(jù)庫中查詢最新的數(shù)據(jù),并更新到緩存中。
二:思路&方案
保證緩存數(shù)據(jù)與數(shù)據(jù)庫中數(shù)據(jù)同步的方案。
- 查詢的時候如果緩存存在則從緩存中獲取,如果緩存不存在則從數(shù)據(jù)庫中獲取數(shù)據(jù),并將獲取到的數(shù)據(jù)存儲在緩存中。
- 更新數(shù)據(jù)的時候刪除緩存。
三:代碼模擬
通過java maven項目模擬redis只管存不管刪除 讓失效時間刪除的問題 進(jìn)行錯誤示范和正確示范
代碼環(huán)境:java maven項目、mysql,redis
pom.xml文件
<dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>compile</scope></dependency></dependencies>
1.錯誤示范
通過班級id查詢課程名稱
package org.example.controller;import org.example.dao.UserInfoDao;
import org.example.entity.CourseConfiguration;
import redis.clients.jedis.Jedis;/*** @author : [WangWei]* @version : [v1.0]* @className : UserInfoController* @description : [描述說明該類的功能]* @createTime : [2022/11/30 11:43]* @updateUser : [WangWei]* @updateTime : [2022/11/30 11:43]* @updateRemark : [描述說明本次修改內(nèi)容]*/
public class SelectCourseNameByClassId {/** @description:通過班級id查詢課程名稱* @author: wangwei* @date: 2023/3/4 14:24* @param: [args]* @return: void**/public static void main(String[] args) {//構(gòu)造jedis,連接redis 并設(shè)置超時時間為100秒,在jedis的默認(rèn)構(gòu)造方法中,超時的時間一般被默認(rèn)設(shè)置為2000毫秒,也就是2秒。Jedis jedis=new Jedis("ip",端口號,100000);jedis.auth("密碼");CourseConfiguration courseConfiguration=null;//查詢redisString courseName = jedis.get("WangWei:ClassId");if(courseName==""||courseName==null){//從數(shù)據(jù)庫中查詢UserInfoDao userInfoDao=new UserInfoDao();courseConfiguration = userInfoDao.selectCourseNameByClassId(55801751);//存入redis 并設(shè)置過期時間60秒jedis.set("WangWei:ClassId",courseConfiguration.getCourse_name());jedis.expire("WangWei:ClassId",60);System.out.println(courseConfiguration.getCourse_name());}else {System.out.println(courseName);}}}
執(zhí)行結(jié)果
通過班級id修改課程名稱(并沒有刪除對應(yīng)緩存)
package org.example.controller;import org.example.dao.UserInfoDao;
import org.example.entity.CourseConfiguration;
import org.example.utils.RedisConfig;
import redis.clients.jedis.Jedis;/*** @author : [WangWei]* @version : [v1.0]* @className : UpdateCourseNameByClassId* @description : [描述說明該類的功能]* @createTime : [2023/3/4 14:26]* @updateUser : [WangWei]* @updateTime : [2023/3/4 14:26]* @updateRemark : [描述說明本次修改內(nèi)容]*/
public class UpdateCourseNameByClassId {/** @description:通過通過班級id修改班級名稱* @author: wangwei* @date: 2023/3/4 14:27* @param: [args]* @return: void**/public static void main(String[] args) {//修改班級名稱UserInfoDao userInfoDao=new UserInfoDao();userInfoDao.updateCourseNameByClassId(55801751,"ARPro計算機(jī)思維課程-開發(fā)班課");// //連接redis
// Jedis jedis=new Jedis("82.157.199.3",6379,100000);
// jedis.auth("000415");
// //刪除key鍵
// jedis.del("WangWei:ClassId");System.out.println("修改成功!");}
}
執(zhí)行結(jié)果
這個時候我們再執(zhí)行 通過班級id查詢課程名稱的接口由于WangWei:ClassId這個key鍵還沒有過期,會發(fā)現(xiàn)查詢的還是之前沒有修改的課程名稱。數(shù)據(jù)出現(xiàn)不一致。
當(dāng)key鍵WangWei:ClassId過期時由于查詢的是數(shù)據(jù)庫中的數(shù)據(jù),所以數(shù)據(jù)是一致的。
2.正確示范
- 查詢的時候如果緩存存在則從緩存中獲取,如果緩存不存在則從數(shù)據(jù)庫中獲取數(shù)據(jù),并將獲取到的數(shù)據(jù)存儲在緩存中。
- 更新數(shù)據(jù)的時候刪除緩存。
在錯誤示范的更新接口上添加刪除緩存的代碼
package org.example.controller;import org.example.dao.UserInfoDao;
import redis.clients.jedis.Jedis;/*** @author : [WangWei]* @version : [v1.0]* @className : UpdateCourseNameByClassId* @description : [描述說明該類的功能]* @createTime : [2023/3/4 14:26]* @updateUser : [WangWei]* @updateTime : [2023/3/4 14:26]* @updateRemark : [描述說明本次修改內(nèi)容]*/
public class UpdateCourseNameByClassId {/** @description:通過通過班級id修改班級名稱* @author: wangwei* @date: 2023/3/4 14:27* @param: [args]* @return: void**/public static void main(String[] args) {//修改班級名稱UserInfoDao userInfoDao=new UserInfoDao();userInfoDao.updateCourseNameByClassId(55801751,"ARPro計算機(jī)思維課程-開發(fā)班課");//連接redisJedis jedis=new Jedis("82.157.199.3",6379,100000);jedis.auth("000415");//刪除key鍵jedis.del("WangWei:ClassId");System.out.println("修改成功!");}
}
通過以上的緩存同步測試,就可以保證緩存中的數(shù)據(jù)與實際數(shù)據(jù)庫中的數(shù)據(jù)保持一致。
四:總結(jié)
1.出現(xiàn)這次redis只管存不管刪除的問題,在于對于redis在實際項目中的使用不夠熟悉了解,不清楚緩存同步的策略。推薦需要對redis參照官網(wǎng)進(jìn)行系統(tǒng)性的學(xué)習(xí),以及與其他高人進(jìn)行討論交流。
2.其實對于此次問題,如果沒有遇到這個案例,自己也很有可能會同樣的獲取,由于自己本身對于redis的使用沒有涉及到,以及考慮到redis緩存同步。
五:升華
通過這次的案例分析,對于認(rèn)知上需要提升的點,自己也有了針對性提升對于知識認(rèn)知上的方式方法。如思維導(dǎo)圖,三篇讀數(shù)法,參照官網(wǎng)對例如redis進(jìn)行快速瀏覽,通過思維導(dǎo)圖宏觀了解,提升認(rèn)知,不怕不知道就怕不知道。