Redis點贊業務設計與實現(Redis鍵值設計)

      網友投稿 814 2022-05-29

      【辰兮要努力】:hello你好我是辰兮,很高興你能來閱讀,昵稱是希望自己能不斷精進,向著優秀程序員前行!

      博客來源于項目以及編程中遇到的問題總結,偶爾會有讀書分享,我會陸續更新Java前端、后臺、數據庫、項目案例等相關知識點總結,感謝你的閱讀和關注,希望我的博客能幫助到更多的人,分享獲取新知,大家一起進步!

      吾等采石之人,應懷大教堂之心,愿你們奔赴在各自的熱愛中…

      文章目錄

      一、Redis序言

      二、Redis

      一、Redis序言

      一年前就已經接觸了Redis的相關知識,了解了這個強大的Redis緩存數據庫,接下來會陸續抽時間整理Redis的相關具體應用在電影購票,等相關場景的實現和Redis鍵值的設計思路,希望自己努力成為一名合格的開發工程師!

      Redis簡介

      Redis 是開源免費的,遵守BSD協議,是一個高性能的key-value非關系型數據庫。

      Redis特點:

      3、Redis支持數據的備份,即master-slave模式的數據備份。

      4、性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。

      5、原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執行。

      6、豐富的特性 – Redis還支持 publish/subscribe, 通知, 設置key有效期等等特性。

      二、Redis

      先說一下自己項目遇到的真實場景,就是給一個社交圈平臺帖子和評論的Redis鍵值設計!

      當我給 當前帖子(post)后這個接口會有兩個邏輯

      第一:當前帖子總贊數+1 ,然后將新的總數存儲在redis中;

      第二:用Redis記錄用戶 給這個帖子

      當我給 當前帖子某一條評論(review)后這個接口會有兩個邏輯

      第一:當前評論總贊數+1 ,然后將新的總數存儲在redis中;

      第二:用Redis記錄用戶 給這個該評論

      用戶給帖子這里的用戶ID(userId)是從后臺直接獲取的,這里有一個邏輯就是:判斷如果用戶未登錄是無法進行的;

      服務器開啟postman測試

      正常postman測試 傳入帖子ID(postId)和狀態likeStatus

      測試數據給id為65的帖子,傳入1代表 0代表取消贊

      測試數據 給帖子Id為66號的帖子 ,傳入1代表 0代表取消贊

      這里我們登陸Redis的桌面工具查看我們存儲redis鍵值的情況!

      來看看顯示一下存儲效果,POSTID是存儲總數的,POST_USERID是記錄用戶的,綁定的是用戶id和帖子id

      如上顯示的是記錄了65,66號帖子的數,同時記錄了34號用戶了65和66號帖子;

      如上我們要設計兩個鍵值:一個存儲總數目的鍵,一個記錄具體用戶的鍵

      //單獨記錄帖子本身的鍵的設計 String key = "POSTID:" + postId; //記錄用戶具體帖子的鍵值設計 String userKey = "POST_USERID:" + postId + "-" + userId;

      1

      2

      3

      4

      鍵值這里是可以靈活設計的,但是你要確保唯一且自己能看懂

      相關代碼:,要傳入的是帖子id(postId) ,用戶id (userId),用戶狀態likeStatus 0代表取消,1代表

      簡單邏輯就是先判斷Redis中有無我們需要的鍵

      1.如果有我們要的鍵,我們直接從鍵中取出對應的值 即(總數 +用戶情況)

      2.如果沒有我們要的鍵,我們先從數據庫中取總數的情況,如果數據庫中取出總數為0,那么代表是第一次,我們給他設置為1,并存儲在對應的Redis中

      3.針對具體的情況,再看看用戶是1還是取消贊0,再對應的+ -和增加刪除

      //,要傳入的是帖子id,用戶id,用戶狀態0代表取消,1代表 public void updateLike(Long postId, Long userId, Integer likeStatus) { //單獨記錄帖子本身的鍵的設計 String key = "POSTID:" + postId; //記錄用戶具體帖子的鍵值設計 String userKey = "POST_USERID:" + postId + "-" + userId; //如果redis中有這個鍵 if (redisTemplate.hasKey(key)) { //我們將相關的值取出來,這個值就是該帖子的總數 Object o = redisTemplate.opsForValue().get(key); if (o != null) { //取出總數值,轉換成int類型進行總數加減 int likeNum = Integer.parseInt(o.toString()); //如果用戶 if (likeStatus == 1) { try { //邏輯1:帖子總數+1,存儲對應的鍵值,key為鍵,后總數加一存儲 redisTemplate.opsForValue().set(key, likeNum + 1, 10L, TimeUnit.MINUTES); //邏輯2:記錄對用戶的情況,將用戶和對應帖子綁定,在redis中存儲對應的鍵 redisTemplate.opsForValue().set(userKey, 1, 1L, TimeUnit.DAYS); } catch (Exception e) { logger.error("redis error:{}", e); } // 寫入數據庫post_like,其實也可以在數據庫中記錄對應情況,這樣是防止redis過期,具體業務具體分析; //postLikeService.save(postId, userId); } else { try { redisTemplate.opsForValue().set(key, likeNum - 1, 10L, TimeUnit.MINUTES); redisTemplate.delete(userKey); } catch (Exception e) { logger.error("redis error:{}", e); } postLikeService.delete(postId, userId); //總贊數 postMapper.updatePostCountLike(postId, (long) (likeNum - 1)); } } } else { /** 這里是判斷Redis中沒有相關鍵值記錄,即Redis中沒有記錄具體的帖子總數和某一個用戶的情況。 這里一般是兩個情況 1.該帖子從來沒有被過 這是第一次,第一次的時候就會設置鍵值 2.Redis中相關鍵值對過期 **/ // 首先我們查詢數據庫,拿取數據庫的該帖子的總數,這兩步具體看業務需求 Post post = postMapper.selectByPrimaryKey(postId); int likeCount = post.getLikeCount(); //當用戶的時候 if (likeStatus == 1) { try { //邏輯一:首先帖子總數的存儲在Redis中 redisTemplate.opsForValue().set(key, likeCount + 1, 10L, TimeUnit.MINUTES); //邏輯二:在Redis中記錄某一個具體用戶的情況 redisTemplate.opsForValue().set(userKey, 1, 1L, TimeUnit.DAYS); //這個likecount是數據庫取出來的,如果總數為0,代表沒有人過,帖子總數設置1 if (likeCount == 0) { post.setLikeCount(1); //同時同步更新到數據庫數據表中 這一步更加你自己的業務需求走 簡單的demo不需要 postMapper.updateByPrimaryKey(post); } } catch (Exception e) { logger.error("redis error:{}", e); } // 寫入數據庫post_like 按需求看自己是否要同步到數據庫 //postLikeService.save(postId, userId); } else { //如果取出來的總數為0,總數無法 -1 ,出現這樣的情況是我postman測試直接傳入likestatus為0的情況,真實頁面如果沒有是無法傳入0進來的; if (likeCount == 0) { logger.error("總數為0,無法取消"); } else { try { // redisTemplate.opsForValue().set(key, likeCount - 1, 10L, TimeUnit.MINUTES); redisTemplate.delete(userKey); } catch (Exception e) { logger.error("redis error:{}", e); } } } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      Redis點贊業務的設計與實現(Redis鍵值設計)

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      79

      80

      81

      82

      83

      84

      85

      86

      87

      88

      89

      90

      如上的每一行我都寫了注釋,具體你應用到你的Redis中要根據項目具體的業務邏輯來,代碼可以適當刪減;

      核心邏輯不變:設計一個存儲總數目的鍵,設計一個記錄具體用戶的鍵,鍵值保持唯一且和具體的帖子對應

      //單獨記錄帖子本身的鍵的設計 String key = "POSTID:" + postId; //記錄用戶具體帖子的鍵值設計 String userKey = "POST_USERID:" + postId + "-" + userId;

      1

      2

      3

      4

      所以我們一般采用帖子ID (postId)來拼接一個字符串保持此鍵的唯一

      如上是存儲,你如果要顯示給前端頁面就用如下方式再取出來即可,Redis中也可以去除總數;

      String userKey = "POST_USERID:" + postId + "-" + userId; boolean likeStatus = redisTemplate.hasKey(userKey); //從redis中判斷用戶是否喜歡帖子 postVo.setLikeStatus(likeStatus);

      1

      2

      3

      4

      想必你一定有了更深入的了解,我們下期Redis文章見……

      The best investment is to invest in yourself.

      2020.10.18 愿你們奔赴在自己的熱愛里!

      Redis 數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:兩所大學中的智能車競賽校內賽
      下一篇:Python 爬蟲實戰五之模擬登錄淘寶并獲取所有訂單
      相關文章
      亚洲美女又黄又爽在线观看| 国产精品亚洲综合五月天| 亚洲av永久无码精品天堂久久| 亚洲毛片在线观看| 亚洲欧洲精品无码AV| 亚洲色大成网站www永久一区 | 亚洲日本香蕉视频观看视频| 久久久久亚洲AV无码专区体验| 国产亚洲精品一品区99热| 国产av天堂亚洲国产av天堂| 国产精品亚洲精品日韩已满| 亚洲精品中文字幕乱码三区 | 中文字幕亚洲乱码熟女一区二区| 亚洲伊人久久综合影院| 久久99亚洲综合精品首页| 国产午夜亚洲精品国产成人小说| 国产成人综合亚洲亚洲国产第一页| 亚洲一区二区三区乱码A| 中文字幕亚洲不卡在线亚瑟| 亚洲综合网站色欲色欲| 国产亚洲免费的视频看| 午夜影视日本亚洲欧洲精品一区| 久久久影院亚洲精品| 亚洲一本综合久久| 亚洲av无码久久忘忧草| 日韩亚洲产在线观看| 亚洲日本一线产区和二线产区对比| 亚洲高清毛片一区二区| 亚洲精品无码99在线观看| 在线观看亚洲av每日更新| 亚洲AV无码成人精品区天堂| 久久精品国产亚洲av影院| 亚洲乱码中文字幕小综合| 亚洲色成人网站WWW永久四虎 | 亚洲第一福利网站在线观看| 永久亚洲成a人片777777| 久久久综合亚洲色一区二区三区| 亚洲福利一区二区精品秒拍| 亚洲国产日韩精品| 夜色阁亚洲一区二区三区| 亚洲中文字幕在线乱码|