提及電商,確定離不開商品,而附帶商品有各類計數(喜歡數,評論數,鑑定數,瀏覽數,etc),Redis的命令都是原子性的,你能夠輕鬆地利用INCR,DECR等命令來計數。java
商品維度計數(喜歡數,評論數,鑑定數,瀏覽數,etc)redis
採用Redis 的類型: Hash
. 若是你對redis數據類型不太熟悉,能夠參考 http://redis.io/topics/data-types-intro緩存
爲product定義個key product:
,爲每種數值定義hashkey, 譬如喜歡數xihuan
數據結構
redis> HSET product:1231233 xihuan 5 (integer) 1 redis> HINCRBY product:1231233 xihuan 1 //喜歡數+1 (integer) 6 redis> HGETALL product:1231233 //獲取這key hashkey 和value 1) "xihuan" 2) "6"
用戶維度計數(動態數、關注數、粉絲數、喜歡商品數、發帖數 等)分佈式
用戶維度計數同商品維度計數都採用 Hash
. 爲User定義個key user:
,爲每種數值定義hashkey, 譬如關注數follow
memcached
redis> HSET user:100000 follow 5 (integer) 1 redis> HINCRBY user:100000 follow 1 //關注數+1 (integer) 6 redis> HGETALL user:100000 //獲取這key hashkey 和value 1) "follow" 2) "6"
譬如將用戶的好友/粉絲/關注,能夠存在一個sorted set
中,score能夠是timestamp,這樣求兩我的的共同好友的操做,可能就只須要用求交集命令便可。oop
redis> ZADD user:100000:follow 61307510400000 "100001" //score 爲timestamp (integer) 1 redis> ZADD user:100000:follow 61307510402300 "100002" (integer) 1 redis> ZADD user:100000:follow 61307510405600 "100003" (integer) 1 redis> ZADD user:200000:follow 61307510400000 "100001" (integer) 1 redis> ZADD user:200000:follow 61307510402300 "100005" (integer) 1 redis> ZADD user:200000:follow 61307510405600 "100004" (integer) 1 redis> ZINTERSTORE out:100000:200000 1 user:100000:follow user:200000:follow //交集命令,得到共同關注 (integer) 2 redis> ZRANGE out:100000:200000 0 -1 1) "100001"
相對memcached 簡單的key-value存儲來講,redis衆多的數據結構(list,set,sorted set,hash, etc)能夠更方便cache各類業務數據,性能也不亞於memcached。性能
NOTE: RPUSH pagewviews.user: EXPIRE pagewviews.user: 60 //注意要update timeout網站
做爲一個電商網站被各類spam攻擊是少難免(垃圾評論、發佈垃圾商品、廣告、刷自家商品排名等),針對這些spam制定一系列anti-spam規則,其中有些規則能夠利用redis作實時分析,譬如:1分鐘評論不得超過2次、5分鐘評論少於5次等(更多機制/規則須要結合drools )。 採用sorted set
將最近一天用戶操做記錄起來(爲何不所有記錄?節省memory,所有操做會記錄到log,後續利用hadoop進行更全面分析統計),經過ZRANGEBYSCORE user:200000:operation:comment 61307510405600 +inf
得到1分鐘內的操做記錄, redis> ZADD user:200000:operation:comment 61307510402300 "這是一條評論" //score 爲timestamp (integer) 1 redis> ZRANGEBYSCORE user:200000:operation:comment 61307510405600 +inf//得到1分鐘內的操做記錄 1) "這是一條評論"spa
BTW, 更復雜一點的實時計算能夠採用Storm。
在逛 有個相似微博的欄目我關注,裏面包括關注的人、主題、品牌的動態。redis在這邊主要看成cache使用。
redis> ZADD user:100000:feed:topic 61307510400000 <feedId> //score 爲timestamp (integer) 1 redis> EXPIRE user:100000:feed:topic 24*60*60 //set timeout to one day (integer) 1 redis> ZADD user:100000:feed:friend 61307510400000 <feedId> //不一樣類型feed (integer) 1 redis> EXPIRE user:100000:feed:friend 24*60*60 //set timeout (integer) 1
這裏採用Redis的List
數據結構或sorted set
結構, 方便實現最新列表or排行榜 等業務場景。
其實這業務場景也能夠算在計數上,也是採用Hash
。以下:
redis> HSET user:<userId>:message:ur system 1//1條未讀系統消息 (integer) 1 redis> HINCRBY user:<userId>:message:ur system 1 //未讀系統消息+1 (integer) 2 redis> HINCRBY user:<userId>:message:ur comment 1 //未讀評論消息+1 (integer) 1 redis> HSET user:<userId>:message:ur system 0//設爲系統消息已讀 (integer) 1 redis> HGETALL user:<userId>:message:ur //獲取這key hashkey 和value 1) "system" 2) "0" 3) "comment" 4) "1"
當在集羣環境時候,java ConcurrentLinkedQueue
就沒法知足咱們需求,此時能夠採用Redis的List數據結構實現分佈式的消息隊列。