資料庫壓力大,如何用redis作緩存?
一個手游,弱聯網,負載均衡 + 應用伺服器 + Mysql + Redis。計劃將所有數據存在一個Session,Session包括Token、消息序列號、玩家所有信息、上次請求的處理結果,然後將Session緩存在Redis,初次登陸的時候,將玩家信息存在Session中,以後每次處理請求,都從Redis中獲取Session,有數據修改則直接修改資料庫和Session(幾乎每個客戶端請求都會修改資料庫),然後將修改後的Session緩存回Redis。問,為了適應高並發,這樣的架構Redis有沒有起到作用?有什麼問題?怎麼樣改進現有的架構?
修改資料庫的放到隊列,非同步修改
處理經過可以和你說的一樣,區別在於修改時候對MySQL和redis操作分開了。修改操作肯定是直接修改MySQL,然後寫個任務隊列,再根據隊列修改redis
提高並發 從提高MySQL吞吐 和 redis去考慮。
Redis當memcache用?沒啥不可以,何必呢?
既然每次都修改,多存一層也是沒有意義的,直接給mysql開大一點兒內存性能是一樣的。設計這個系統的程序員,客戶端出身吧?哈哈哈
有個很嚴重的問題就是並發,同時有兩個應用伺服器收到兩個不同的請求,處理完以後資料庫更新了,但是session會被另一個覆蓋。重新登錄一下就多拿一個獎勵,有沒有?
怎麼改進就不能說了,有泄密的嫌疑。題主說的高並發應該是個系統性問題,題主把注意力放到了redis 上,認為正確的使用了redis 就能解決MySQL 壓力大的問題,其實有可能和redis 無關。
正確的做法是先評估系統瓶頸在哪裡,然後對瓶頸進行優化。題主的問題最大可能就是資料庫本身沒有優化好。可以如下優化,先看看有沒有慢SQL 如果有,而且多,那麼確定無疑就是SQL 本身的問題,這時看看索引有沒有優化的地方,看看能不能把關聯查詢拆開。如果已經優化得很好,那就只有分庫分表了。這樣的方案也非常多。
再回到redis上,緩存這種東西對於讀多寫少才有幫助,如果讀多寫也多、或者寫多讀少幫助不大。把握這種原則優化,否則可能越優化越慢。
題主有幾個關鍵的信息沒有提供,1系統的並發數,2系統應用伺服器台數,3資料庫壓力數據數據,如CPU load,線程數,慢SQL數量。怎麼用redis這種事情取決於你的場景,玩法可以有很多。
但是給出具體方案之前,有很多情況你不說明白很難判斷怎麼做合適。
比如你說資料庫壓力大,到底哪裡壓力大?(CPU?內存?)表現是什麼?(多大的tps?平均響應延遲多少?)
讀寫分離做了沒?每次請求數據量多少?查詢是不是都explain過了?讀操作寫操作比例多少?我見過很多人資料庫這點事沒搞明白就總想著上cache,以為cache可以解決一切問題。
然而這些基礎的東西不解決,上了cache其實也沒啥卵用。。。謝邀(並沒人邀請)
問題描述中說到把 Session 存儲到 Redis 中,然後每次請求從 Redis 拿到 Session。是否可以理解成通過每次請求的 SessionId 作為 Key 到 Redis 找到對應的數據?
如果是這樣,可以使用 Redis 做 Session 集群。也就是把 Redis 當做 Session 倉庫,通過請求中 Cookie 帶的 SessionId 找到對應的 Session。比如 Tomcat 伺服器的插件 tomcat-redis-session-manager 就是用來做這個的。每個伺服器應該都有類似的插件。
或者自己在登錄成功之後生成一個 ID,用 ID 做 key 存放到 Redis 中。客戶端每次請求帶上這個 ID,伺服器拿到後去 Redis 取數據。另外要看你的應用環境,緩存只能幫助資料庫承擔一些讀壓力,寫壓力是分擔不了的。
有回答中說寫庫可以隊列非同步寫。
1. 意義何在?非同步寫難道比同步寫能減少資料庫壓力?2. 「緩存」,緩存的是資料庫的數據,要以資料庫的數據為準,如果出現緩存領先於資料庫的情況,既不優雅又危險。如果某天寫庫的隊列異常,這些數據就很難找回了。所以資料庫的寫壓力 Redis 是無法分擔的,除非把一部分數據放在 Redis 做永久存儲。資料庫的寫壓力還是得靠資料庫的傳統的方法解決,升級硬體、Review SQL、分表分庫等等。高並發的項目肯定不能直接寫資料庫,頻繁更新資料庫會鎖表的。建議寫緩存,達到一定量的時候統一寫資料庫。大量的插入和更新要用消息隊列來處理。資料庫最好分主從資料庫,主庫負責寫操作,從庫負責讀操作。
先把數據都打到redis裡面,然後用mq非同步落地到db裡面
Java的話,spring 家族有個叫spring-session的玩意。你可以看看
你都不說你的機器配置,並發量,負載情況,空談架構有什麼意思。另外,能用錢解決並且錢夠多的時候,就用錢解決吧- -,真的。
這種寫庫必須用隊列
推薦閱讀:
※有幾台自己的伺服器,能做些什麼有趣的事情?
※單核1G內存的雲伺服器可以用來做些什麼?
※浪潮華為聯想,國產伺服器哪家強?
※對伺服器CPU而言寄存器ECC功能是否有必要?
※我們開發了一個APP,後端伺服器放在了美國亞馬遜的AWS EC2上。可是在國內訪問速度很慢。有可能是什麼原因造成的?