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