1. 程式人生 > 實用技巧 >《redis實戰》之redis文章投票

《redis實戰》之redis文章投票

前言

最近幾年,越來越多的網站開始提供部分對網頁連結、文章或問題進行投票的功能,這些網站會根據文章的釋出時間和文章獲得的投票數量計算出一個評分,然後按照這個評分來決定如何排序和展示文章。

一、Springboot整合redis

https://www.cnblogs.com/minmin123/p/13595734.html

二、對文章進行投票

要構建一個文章投票網站,我們首先要做的就是為了這個網站設定一些數值和限制條件:如果文章獲得至少200張支援票,那麼網站就認為這篇文章是一篇有趣的文章; 加入這個網站每天釋出1000篇文章,而其中的50篇符合網站對有趣文章的要求,那麼網站要做的就是把50篇文章放到文章列表前100位至少一天;

為了產生一個能夠隨著時間流逝而不斷減少的評分,程式需要根據文章的釋出時間和當前時間來計算文章的評分,具體計算方法為:將文章得到的支援票數量乘以一個常量,然後加上文章的釋出時間,得出的結果就是文章的評分。

計算評分與支援票數量相乘的常量是432 (一天的秒數【86400】除以一天所需的支援票數量200)文章每獲得一張支援票,程式就需要將文章的評分增加432分

1、準備資料

把文章標題,網址,釋出文章的使用者、文章的釋出時間、文章的投票數量存入一個雜湊中

time:存時間戳

poster: 存使用者的id

參考程式碼:

@Autowired
private RedisUtil redisUtil;

@Test
public void test1(){ List<ActiveBO> list = new ArrayList<>(); ActiveBO activeBO = new ActiveBO(); activeBO.setId(1L); activeBO.setTitle("肖申克的救贖"); activeBO.setLink("https://www.cnblogs.com/minmin123/p/13595734.html"); activeBO.setPoster("user01"); activeBO.setVotes(0); ActiveBO activeBO1
= new ActiveBO(); activeBO1.setId(1L); activeBO1.setTitle("如何提升工作效率"); activeBO1.setLink("https://www.baidu.com"); activeBO1.setPoster("user02"); activeBO1.setVotes(0); list.add(activeBO); list.add(activeBO1); Integer i = 0; for (ActiveBO activeBO0 :list) {    redisUtil.hset("active:"+i, "title", activeBO0.getTitle()); redisUtil.hset("active:"+i, "link", activeBO0.getLink()); redisUtil.hset("active:"+i, "poster", activeBO0.getPoster()); redisUtil.hset("active:"+i, "time",System.currentTimeMillis()); redisUtil.hset("active:"+i, "votes", activeBO0.getVotes()); i++; } }

我們的文章投票網站使用兩個有序集合來有序地儲存文章;

釋出時間:用時間戳

注意:這個用的redis的有序集合zset

參考程式碼:

 1   @Test
 2     public void test3(){
 3         redisUtil.zset("time","active:0",1598945519501D);
 4         redisUtil.zset("time","active:1",1598945519511D);
 5     }
 6     @Test
 7     public void test4(){
 8         redisUtil.zset("score","active:0",0D);
 9         redisUtil.zset("score","active:1",0D);
10     }

為了防止使用者對同一篇文章進行多次投票,網站需要為每篇文章記錄一個已投票使用者名稱單。建立一個集合來儲存。

參考程式碼:

1     public void test5(){
2         redisUtil.sSet("voted:0","user03");
3         redisUtil.sSet("voted:0","user04");
4     }

為了節約記憶體,我們規定當一篇文章釋出期滿一週後,使用者將不能再對他進行投票,文章的評分將被固定下來,而記錄文章已經投票使用者名稱單的集合也會被刪除。