Redis在電商中的實際應用-Java

來源:互聯網
上載者:User

標籤:head   動態   data   drools   使用   論壇   res   規則   操作記錄   

範例程式碼用Jedis編寫。1. 各種計數,商品維度計數和使用者維度計數

  說起電商,肯定離不開商品,而附帶商品有各種計數(喜歡數,評論數,評鑑數,瀏覽數,etc),Redis的命令都是原子性的,你可以輕鬆地利用INCR,DECR等命令來計數。

  • 商品維度計數(喜歡數,評論數,評鑑數,瀏覽數,etc)

    採用Redis 的類型: Hash. 如果你對redis資料類型不太熟悉,可以參考 http://redis.io/topics/data-types-intro。為product定義個key product:,為每種數值定義hashkey, 譬如喜歡數like

   jedis.hset("product:1", "like", "5");   jedis.hincrBy("product:1", "like", 1);//喜歡加一   System.out.print(jedis.hget("product:1", "like"));
  • 使用者維度計數(動態數、關注數、粉絲數、喜歡商品數、發帖數 等)

     使用者維度計數同商品維度計數都採用 Hash. 為User定義個key user:,為每種數值定義hashkey, 譬如關注數follow

   jedis.hset("user:1", "follow", "5");   jedis.hincrBy("user:1", "follow", 1);//關注數加一   System.out.print(jedis.hget("user:1", "follow")); 
2. 儲存社交關係

     譬如將用戶的好友/粉絲/關注,可以存在一個sorted set中,score可以是timestamp,這樣求兩個人的共同好友的操作,可能就只需要用求交集命令即可。

   jedis.zadd("user:1000:friends", System.currentTimeMillis(), "user:1001");                             //uid為1000使用者和uid為1001是朋友 , score值設定時間戳記   jedis.zadd("user:1000:friends", System.currentTimeMillis(), "user:1002");                            //uid為1000使用者和uid為1002是朋友 , score值設定時間戳記           jedis.zadd("user:2000:friends", System.currentTimeMillis(), "user:1001");   jedis.zadd("user:2000:friends", System.currentTimeMillis(), "user:1003");   jedis.zinterstore("com_friends:1000:2000", "user:1000:friends", "user:2000:friends");   System.out.println(jedis.zrange("com_friends:1000:2000", 0, -1));
3. 用作緩衝代替memcached(商品列表,評論列表,@提示列表,etc)

       相對memcached 簡單的key-value儲存來說,redis眾多的資料結構(list,set,sorted set,hash, etc)可以更方便cache各種業務資料,效能也不亞於memcached。

4. 反spam系統(評論,發布商品,論壇發貼,etc)

    作為一個電商網站被各種spam攻擊是少不免(垃圾評論、發布垃圾商品、廣告、刷自家商品排名等),針對這些spam制定一系列anti-spam規則,其中有些規則可以利用redis做即時分

析,譬如:1分鐘評論不得超過2次、5分鐘評論少於5次等(更多機制/規則需要結合drools )。

    採用sorted set將最近一天使用者操作記錄起來(為什麼不全部記錄?節省memory,全部操作會記錄到log,後續利用hadoop進行更全面分析統計)

    if(!jedis.exists("user:1000:comment")){//還沒有評論        jedis.zadd("user:1000:comment", System.currentTimeMillis(), "uid為1000的評論內容");                System.out.println(jedis.zrange("user:1000:comment", 0, -1));    }else{        //擷取一分鐘內的評論記錄        Set<String> result = jedis.zrangeByScore("user:1000:comment", System.currentTimeMillis() - 60 * 1000, System.currentTimeMillis());        if(!result.isEmpty()){            System.out.println("1分鐘內不能評論兩次");        }else{            jedis.zadd("user:1000:comment", System.currentTimeMillis(), "uid為1000的評論內容"+System.currentTimeMillis());            System.out.println(jedis.zrange("user:1000:comment", 0, -1));        }    }
5. 使用者Timeline/Feeds

  應用於關注的人、主題、品牌及專欄,redis在這邊主要當作cache使用

    jedis.zadd("user:2000:feed:topic", System.currentTimeMillis(), "13topic" + System.currentTimeMillis());    //score為timestamp uid為2000的使用者關注tid為13的topic    jedis.expire("user:2000:feed:topic", 10);    //關注有效期間為10秒    System.out.println(jedis.zrange("user:2000:feed:topic", 0, -1));    
6. 最新列表&熱門排行榜

  用於記錄使用者剛剛喜歡的商品最新列表or熱門排行榜 等業務情境

    jedis.zadd("user:1000:product:like", System.currentTimeMillis(), "003");    Thread.currentThread();    Thread.sleep(10);      jedis.zadd("user:1000:product:like", System.currentTimeMillis(), "001");    Thread.sleep(10);     jedis.zadd("user:1000:product:like", System.currentTimeMillis(), "004");    Thread.sleep(10);     jedis.zadd("user:1000:product:like", System.currentTimeMillis(), "002");    Thread.sleep(10);         //預設喜歡時間升序排列        Set<String> result = jedis.zrange("user:1000:product:like", 0, -1);     System.out.println(result);        //按喜歡時間降序排列        result = jedis.zrevrange("user:1000:product:like", 0, -1);    System.out.println(result);
[003, 001, 004, 002][002, 004, 001, 003]
7. 訊息通知

  採用Hash結構對訊息通知業務情境計數

    //設定1條未讀系統訊息    jedis.hset("user:1000:message:num", "sysmessagenum", "1");    jedis.sadd("user:1000:message:content",  "第一條未讀資訊");    //未讀系統訊息+1    jedis.hincrBy("user:1000:message:num", "sysmessagenum", 1);    jedis.sadd("user:1000:message:content", "第二條未讀資訊");    //查看所有訊息通知數量    System.out.println(jedis.hgetAll("user:1000:message:num"));    //查看所有訊息通知內容    System.out.println(jedis.smembers("user:1000:message:content"));
{sysmessagenum=2}[第二條未讀資訊, 第一條未讀資訊]

 

Redis在電商中的實際應用-Java

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.