redis在遊戲服務器中的使用初探(四) redis應用

文章系列先介紹環境搭建 介紹redis操做和代碼編寫運行  這是典型的實戰工程過程。
那麼咱們爲什麼要使用redis而不是常規的數據庫好比 mysql呢?html


由於KV內存數據庫最大的優點全部數據所有存儲在內存中,速度快,並且key-value的特色也決定了他良好的擴展性.mysql

如下幾點做爲遊戲服務器中的應用示例,更多的使用方法能夠在實踐中繼續探索優化redis

 

1 數據庫緩存

好比前一章節的用戶數據,在mysql進行讀寫和redis上進行讀寫在大量併發訪問的場景下,差異是很大的。
Redis提供了較爲豐富數據類型,使咱們能夠更爲容易地將數據對象緩存起來(序列化、protobuffer)。
當須要請求某一數據時,先從Redis中查找,若是沒有再查數據庫,同時交給Redis緩存起來。
當對數據進行修改時,則先將修改後的數據保存到Redis,而後保存至數據庫sql


在保存到數據庫這一環節根據不用的數據處理需求 能夠有不用的思路
A不實時保存到數據庫,而是交由另外的線程(甚至是專門的程序)去保存,以提升邏輯層的響應速度。
B部分數據交給Redis保存(Reids自身有持久化功能),像玩家已經完成過的任務ID集合,利用Redis的Set類型保存更爲合適。
C玩家瞬時變化的數據不見得每次修改都須要保存(好比金錢、經驗),但若是遊戲服務器本身維護在內存中,出現宕機就會致使回檔。
Redis是獨立於遊戲服務器的,交由它來保存,能夠防止宕機回檔的問題,也能夠減小遊戲服務器本身維護數據所佔用的內存。數據庫

2 玩家排行榜

遊戲服務器中涉及到不少排行信息,好比玩家等級排名、金錢排名、戰鬥力排名等。
通常狀況下僅須要取排名的前N名就能夠了,這時能夠利用數據庫的排序功能,或者本身維護一個元素數量有限的top集合。
可是有時候咱們須要每個玩家的排名,玩家的數量太多,不能利用數據庫(全表排序壓力太大),本身維護也會比較麻煩。
使用Redis能夠很好的解決這個問題。它提供的有序Set,支持每一個鍵值(好比玩家id)擁有一個分數(score),每次往這個set裏添加元素,
Redis會對其進行排序,修改某一元素的score後,也會更新排序,在獲取數據時,能夠指定排序範圍。
更重要的是,這個排序結果會被保存起來,不用在服務器啓動時從新計算。
經過它,排行榜的實時刷新、全服排行都再也不成爲麻煩事。
redis中能夠使用sorted set,將排序的值設置成sorted set中的score,每次執行一條zadd便可
緩存

 

 

3 取最新N個數據的操做

好比你能夠把上面說到的 sorted set 的 score 值設置成過時時間的時間戳,那麼就能夠簡單地經過過時時間排序,定時清除過時數據了,
不只是清除 Redis 中的過時數據,你徹底能夠把 Redis 裏這個過時時間當成是對數據庫中數據的索引,
用 Redis 來找出哪些數據須要過時刪除,而後再精準地從數據庫中刪除相應的記錄。 服務器

 

 

參考併發

https://www.cnblogs.com/captainl1993/p/4788236.html優化

https://www.cnblogs.com/agent-k/p/Redis.html.net

《redis實戰》  www.ChinaDBA.net 中國DBA超級論壇電子書

相關文章
相關標籤/搜索