上次說了商品,商品分類,品牌,分類的屬性,規格。很多電商網站例如:京東,國美,蘇寧他們的商品都是存儲在redis中的,通過請求獲取到的redis進行js的渲染動態的展示商品的信息。
源碼:https://github.com/limingIOS/netFuture/tree/master//源碼/『互聯網架構』軟件架構-解密電商系統營銷-會員模塊業務(72)/
(一)營銷模塊
- 營銷工具
- 營銷活動
商品的ID,營銷工具的ID,營銷工具的編號,營銷工具的類型(商品級別的,訂單級別的,全站級別的),渠道(PC端的,IOS端的,Android端的)
- 營銷活動對應的訂單數據
針對營銷活動產生的訂單
- 營銷技術方案
1個用戶或者一個商品對應1-3個營銷活動,1萬個商品(購物車)就有3萬個營銷活動如果持久化到MySQL上,mysql肯定是受不了的。如果是100個用戶,雙十一必須掛了服務。
優化方案(緩存,redis也會有問題。redis里面存3萬多條數據,浪費了大量的網絡資源)
解決方案是:類似新華字典一樣,redis里面針對某個活動只存儲key值,內容保存在JVM cache中。因為目前都是存在JVM中,如果是分布式同步下,需要使用zookeeper。
(二)會員模塊
電商里面最復雜的就是商品,最簡單的業務就是會員。
- 業務
會員模塊用戶注冊、登錄、找回密碼、積分業務
- 技術點:會員SSO、分庫分表
單點登錄。1.session如何存儲的(redis)
單點登錄。2、服務端如何獲取你信息?Token(客戶端跟服務端 包含登錄)
sale.jd.com登錄 item.jd.com(我不知道你登錄)
登錄后把token放入redis中作為key,token的信息保存在cookies中,當訪問在item.jd.com后,通過cookies里面的token來確認用戶是否登錄。
分庫分表。hash取模、list預定義、range范圍,具體都是通過shardingjdbc處理的
說說之前的公司關于會員表一共8個庫,后來變成了16個庫。這個是如何處理的。
1.當時8個庫的分庫思路是通過hash取模的方式。(每個庫800萬數據)
2.如果改成16個庫,凌晨進行處理,先將數據進行處理分為:待遷移%8、 (服務可用)遷移中(%8) 、遷移完(%16),通過copy的方式。2個小時搞定的。
3.遷移完后進行取模改成16。停機2個小時。
4.當時同事提出不停機,如果在這個期間會員信息發生修改,通過binlog的方式在新遷移的信息通過binlog的方式在新遷移的庫中執行,因為比較麻煩后來放棄了。
5.直接停機2個小時。前提這些都是在測試環境測試過了。遷移完后等于2份,一個在0庫,一個在16庫,刪除原來0庫中的數據。
- 表設計
t_account會員表
t_accountRank會員級別表
t_address配送地址信息表
(三)權限模塊
很多系統的權限這塊 公共。權限系統一般有:賬號、角色、權限、資源。
權限可以分為三種:頁面權限,操作權限,數據權限。
在互聯網公司有個專業術語:權限這塊防小人(不懂電腦的),防君子(IT人員)
- 頁面權限
控制你可以看到哪個頁面,看不到哪個頁面。
很多系統都只做到了控制頁面這一層級,它實現起來比較簡單,一些系統會這樣設計,但是比較古板,控制的權限不精細,難以在頁面上對權限進行更下一層級的劃分。
- 操作權限
則控制你可以在頁面上操作哪些按妞。
延伸:當我們進入一個頁面,我們的目的無非是在這個頁面上進行增刪改查,那在頁面上對應的操作可能是:查詢,刪除,編輯,新增四個按鈕。
可能你在某個頁面上,只能查詢數據,而不能修改數據。
- 數據權限
數據權限則是控制你可以看到哪些數據,比如市場A部的人只能看到或者修改A部創建的數據,他看不到或者不能修改B部的數據。
延伸:數據的控制我們一般通過部門去實現,每條記錄都有一個創建人,而每一個創建人都屬于某個部門,因此部門分的越細,數據的控制層級也就越精細,這里是否有其他好的方式除了部門這個維度還有其他什么方式可以控制數據權限。
- t_user用戶表
- t_role角色表
- t_privilege權限表
- t_menu資源表
(四)黑科技動態執行aop里面的方法
大型網絡公司內部使用的,建議內部粉絲專用,這里不做演示,詳細使用建議聯系我。
源碼:https://github.com/limingios/netFuture/tree/master//源碼/『互聯網架構』軟件架構-解密電商系統營銷-會員模塊業務(72)/
1、存儲在jvm的對象可視化 可以操作
2、調試bug比較有用 查看最新代碼
3、給系統留后門(生產 不需要重啟機器可以改配置 )
- 在pom.xml 同級目錄放入dynamo.jar
- pom.xml 中的配置,先將jar包放入web-info
<dependency> <groupId>com.gome.spring.compents</groupId> <artifactId>dynamo</artifactId> <scope>system</scope> <systemPath>${basedir}..dynamo.jar</systemPath> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.Apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency>
- web.xml中加入
<servlet>
<servlet-name>springdyn</servlet-name>
<servlet-class>com.gome.spring.compents.servlet.DynServlet
</servlet-class>
</servlet>
<servlet-mApping>
<servlet-name>springdyn</servlet-name>
<url-pattern>/dyn/admin/*</url-pattern>
</servlet-mapping>
- 訪問方式
http://ip:端口/項目名稱/dyn/admin
用戶名:admin
密碼: admin
PS:今天說了營銷的設計思路:營銷工具,營銷活動,營銷活動訂單。 會員管理:單點問題,會員信息session共享問題。權限問題:頁面權限,操作權限,數據權限。黑科技:動態aop控制工具。