Netty傻瓜教程(五):不能不談Redis

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

相關文章
相關標籤/搜索