MySql是關係型數據庫,有強大的數據查詢功能,支持事務,可是畢竟在硬盤中,訪問量大額外開銷也大;Redis將數據存儲在內存中,並且支持多種數據格式,速度快,額外開銷少。html
當訪問量比較大的時候,能夠用Redis做爲緩存,用MySql做爲後段存儲,架構以下:java
部署詳情請參考:http://www.cnblogs.com/hellowzd/p/5163782.htmlmysql
若是簡單點實現,能夠:redis
讀: 讀redis->沒有,讀mysql->把mysql數據寫回redis
寫: 寫mysql->成功,寫redissql
固然具體狀況具體分析,在遊戲開發裏,有些時候都是讀寫redis,而後作MySql的同步,redis用list存,而後設置一個每分鐘跑的任務去讀這個list,更新到MySql裏面。數據庫
像通常的鏈接數據庫同樣,鏈接redis最好也須要來個鏈接池:緩存
private static JedisPool getInstance() { if (pool == null) { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(500); config.setMaxIdle(20); config.setMaxWaitMillis(100 * 1000l); config.setTestOnBorrow(true); config.setTestOnReturn(true); pool = new JedisPool(config, REDIS_SERVER, REDIS_PORT, 10000, REDIS_AUTH); //don't foget to set the password para. } return pool; }
而後獲取jedis:服務器
public static Jedis getJedis() { Jedis jedis = null; try { jedis = getInstance().getResource(); //jedis.auth(REDIS_AUTH); } catch (Exception e) { Log.error(e.getMessage(), e); } return jedis; }
而後就能夠開始操做redis了:多線程
try { jedis = RedisPoolManager.getJedis(); // 用戶表 jedis.select(RedisConstantManager.REDIS_DB_USER); jedis.hset("user_" + userId, field, value); }
在netty開發中,一個channel就是一個線程,多個客戶端鏈接的時候必然要考慮到多線程的問題,好在redis裏操做hash數據有一個hincrby(String key,String field,int value)方法,這個操做是原子性的,避免了數據的不一致。架構
在遊戲服務器中,爲了節省性能,咱們沒有必要把全部玩家的信息都緩存到內存中。好比有一些不常登錄的玩家,那麼他的信息就不必一直呆在緩存中了,須要清除。Redis爲這個功能提供了一個方法:expire,它能夠爲key設置以秒爲單位的生命週期,好比設置爲300s,那麼五分鐘以後,這條記錄就會在內存中刪除。這樣不只能夠節省內存,並且增長了服務器的性能。
這是一個遊戲中排行榜的例子:http://www.tuicool.com/articles/amEN7nj