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

相关文章
相关标签/搜索