游戏服务器使用MongoDB作为缓存和数据库一致性,还有必要使用Redis缓存吗

1465人阅读
nosql(3)
redis(1)
memcache(3)
一、问题:
& & 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求。
二、解决方案:
& & &1.通过高速服务器Cache缓存数据库数据
& & &2.内存数据库
& (这里仅从数据缓存方面考虑,当然,后期可以采用Hadoop+HBase+Hive等分布式存储分析平台)
三、主流解Cache和数据库对比:
& & &上述技术基本上代表了当今在数据存储方面所有的实现方案,其中主要涉及到了普通关系型数据库(MySQL/PostgreSQL),NoSQL数据库(MongoDB),内存数据库(Redis),内存Cache(Memcached),我们现在需要的是对大数据表仍保持高效的查询速度,普通关系型数据库是无法满足的。而MongoDB其实只是一种非关系型数据库,其优势在于可以存储海量数据,具备强大的查询功能,因此不宜用于缓存数据的场景。
& & & &从以上各数据可知,对于我们产品最可行的技术方案有两种:
& & & & &1.Memcached&& & & & 内存Key-Value Cache
& & & & &2.Redis&& & & & & & & & & & 内存数据库
四、下面重点分析Memcached和Redis两种方案:
4.1&Memcached介绍&&
& & &Memcached&是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度,现在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。
4.2&Memcached工作方式分析
& & &许多Web应用都将数据保存到 RDBMS中,应用服务器从中读取数据并在浏览器中显示。&但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、&网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、&提高可扩展性。下图展示了memcache与数据库端协同工作情况:
& & &其中的过程是这样的:
& & & & & &1.检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,无需查询数据库。
& & & & & &2.如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。
& & & & & &3.保持缓存的“新鲜性”,每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。
& & &Memcached作为高速运行的分布式缓存服务器,具有以下的特点:&
4.3 如何实现分布式可拓展性?
& & &Memcached的分布式不是在服务器端实现的,而是在客户端应用中实现的,即通过内置算法制定目标数据的节点,如下图所示:
4.4&Redis 介绍 &
& & &Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,当前
Redis的应用已经非常广泛,国内像新浪、淘宝,国外像&Flickr、Github等均在使用Redis的缓存服务。
4.5&Redis&工作方式分析
& & &Redis作为一个高性能的key-value数据库具有以下特征:&
& & &Redis支持丰富的数据类型,最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted&Set。Redis通常将数据存储于内存中,或被配置为使用虚拟内存。Redis有一个很重要的特点就是它可以实现持久化数据,通过两种方式可以实现数据持久化:使用RDB快照的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的AOF日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。
Redis支持将数据同步到多台从数据库上,这种特性对提高读取性能非常有益。
4.6 Redis如何实现分布式可拓展性?
2.8以前的版本:与Memcached一致,可以在客户端实现,也可以使用代理,twitter已开发出用于Redis和Memcached的代理&。
3.0 以后的版本:相较于Memcached只能采用客户端实现分布式存储,Redis则在服务器端构建分布式存储。Redis&Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,各个节点地位一致,具有线性可伸缩的功能。如图给出Redis&Cluster的分布式存储架构,其中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信。在数据的放置策略上,Redis&Cluster将整个
key的数值域分成16384个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis&Cluster支持的最大节点数就是16384
五、综合结论
&应该说Memcached和Redis都能很好的满足解决我们的问题,它们性能都很高,总的来说,可以把Redis理解为是对Memcached的拓展,是更加重量级的实现,提供了更多更强大的功能。具体来说:
1.性能上:
& & &性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比
Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起&Memcached,还是稍有逊色。
2.内存空间和数据量大小:
& & &MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。
3.操作便利上:
& & &MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。
4.可靠性上:
& & &MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。
5.应用场景:
& & &Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。
& & &Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
六、需要慎重考虑的部分
1.Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB
2.Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高
3.从本质上讲,Memcached只是一个单一key-value内存Cache;而Redis则是一个数据结构内存数据库,支持五种数据类型,因此Redis除单纯缓存作用外,还可以处理一些简单的逻辑运算,Redis不仅可以缓存,而且还可以作为数据库用
4.新版本(3.0)的Redis是指集群分布式,也就是说集群本身均衡客户端请求,各个节点可以交流,可拓展行、可维护性更强大。
来自:http://blog.csdn.net/suifeng3051/article/details/
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:495834次
积分:3492
积分:3492
排名:第9037名
原创:46篇
转载:37篇
评论:31条
(3)(2)(1)(1)(1)(1)(1)(4)(1)(1)(2)(3)(2)(2)(1)(1)(8)(1)(6)(3)(4)(7)(1)(1)(3)(3)(3)(1)(1)(5)(2)(5)(1)(2)基于Redis+MySQL+MongoDB存储架构应用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于Redis+MySQL+MongoDB存储架构应用
上传于|0|0|文档简介
&&基于Redis+MySQL+MongoDB存储架构应用
你可能喜欢OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;
欢迎您订阅我们的技术周刊
我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,
欢迎分享您的观点,经验,技巧,心得
让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;
本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(
订阅邮件周刊
在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
注意 转载须保留原文链接,译文链接,作者译者等信息。&&
在之前的这篇文章 在ExpressJS(NodeJS)中 中提及将Session存放到Mongodb中,其中有很多讲解的不是很详细。我们为什么要把Session存放到数据中,以及又为什么要在子域名间跨域共享Cookie呢?Session与Cookie的关系客户端与服务会使用一个Sessionid的Cookie值来进行客户端和服务器端会话的匹配,这个Cookie一般是服务器端读/写的,并在Http请求响应的Header中的Set-Cookie属性设置:HTTP/1.1 200 OKServer: nginxDate: Wed, 14 Jan :09 GMTContent-Type: text/htmlTransfer-Encoding: chunkedProxy-Connection: Keep-AliveConnection: Keep-AliveContent-Encoding: gzipSet-Cookie: sessionid=i4w3axuzyj4nwwg75y6k5us2; path=/; domain=.; httponlypath=/&&&&&&&&&&&& 表示这个cookie是设置在根目录的。httponly&&&&&&&&&& 属性禁止客户端JavaScript的访问,防止当前会话(sessionid)被恶意的js脚本盗取domain=.& 表示将sessionid存放到主域名下,各个二级域名域名均使用此Cookie (sessionid)注* 中间代理人攻击,即是通过代理服务器(如无线路由)盗取你的会话Cookie(SessionID等),从而访冒你的身份。因此Google建议网站全部采用HTTPS协议,加密传输内容,并提高了纯HTTPS网站的权重。使用数据库来集中管理session,存放Session内容,并在各个子域名跨域共享Cookies (SessionID),即可实现为每一个子域分配一个独立的node.js Web服务器,各个服务程序均可依据sessionid从数据库中寻找到同一Session,从而实现不同Web Server中的会话同步,从而实现一定程度上的负载均衡。要想实现完全意义的负载均衡还需要将Web服务做到完全状态无关,不仅仅是Session,所有的中间缓存数据都要转移到与服务器无关的缓存层中,这正是Redis最善长的地方。但是为什么存放在Redis中要比MongoDB中好呢?将Session存放到MongoDB在MongoDB中是这样存放Session的, 使用 & 即用来将Express中的Session持久化到Mongodb的一个中间件,它也可以在上使用。Express 4.x, 5.0 与 Connect 3.x配合使用:var session = require('express-session');var MongoStore = require('connect-mongo')(session);app.use(session({&&& secret: 'foo',&&& store: new MongoStore(options)}));Express 2.x, 3.x 和 Connect 1.x, 2.x配合使用:var MongoStore = require('connect-mongo')(express);app.use(express.session({&&& secret: 'foo',&&& store: new MongoStore(options)}));对于 Connect 只需要将express替换成connect即可 是一个基于文档的数据库,所有数据是从磁盘上进行读写的。MongoDB善长的是对无模式JSON数据的查询。而Redis是一个基于内存的键值数据库,它由C语言实现的,与Nginx/ NodeJS工作原理近似,同样以单线程异步的方式工作,先读写内存再异步同步到磁盘,读写速度上比MongoDB有巨大的提升。因此目前很多超高并发的网站/应用都使用Redis做缓存层,普遍认为其性能明显好于MemoryCache。当并发达到一定程度时,即可考虑使用Redis来缓存数据和持久化Session。在NodeJS中使用Redis缓存数据Redis () 数据库采用极简的设计思想,最新版的源码包还不到2Mb。其在使用上也有别于一般的数据库。node_redisredis驱动程序多使用  此模块可搭载官方的 hiredis C 语言库 - 同样是非阻塞的,比使用JavaScript内置的解释器性能稍好。可选择将hiredis 与 redis 一同安装。npm install hiredis redis如果 hiredis 安装成功, node_redis 会默认使用 hiredis, 否则会使用JavaScript的解释器。Redis的一个Key不仅可以对应一个String类型的值,还支持hashes, lists, sets, sorted sets, bitmaps等。比如存/取一组Hash值,Redis中有两个对应的 HMSET key field value [field value ...]、为一个Key一次设置多个哈希键/值, 多用于JSON对象的写入(序列化的SESSION)。HGETALL key读取一个Key的所有 哈希键/值,多用于JSON对象读取这两个命令即是在NodeJS中存取JSON对象的关键,下面是node_reids中对应的例子:var redis = require("redis"),&&& client = redis.createClient();//写入JavaScript(JSON)对象client.hmset('sessionid', { username: 'kris', password: 'password' }, function(err) {& console.log(err)})//读取JavaScript(JSON)对象client.hgetall('sessionid', function(err, object) {& console.log(object)})Redis没有严格意义上的表名和字段名,以 Key-Value 键值对的方式存储,因此一般采用 schema:key 形式做为键值,其中schema:& 可理解为传统数据库中的表名key:    可理解为表中的主键因此使用redis存放你的session时,需要一个schema前辍, 比如这个key: sessionid:i4w3axuzyj4nwwg75y6k5us2Redis 也仅能对Key进行检索, 尚不支持对Key所存放的Hash Key的检索。 如要检索到所有session,只需匹配 sessionid:* 即可, client.keys('session:*', function (err, keys) {& console.log(keys)})有些第三方库会支持检索值中的Hash Key,但这不是一个原子性操作,redis本身并不提供。 因此在采用Redis缓存与检索数据时,要使用一些独特的数据类型,如集合(Sets)& sadd myset 1 2 3&&& //添加 1 2 3到集合myset(integer) 3& smembers myset&&&&& //列出集合的所有成员1. 32. 13. 2& sismember myset 30& //判断30是否存在(integer) 0&&&&&&&&&& //不存在Redis集合不允许添加相同成员。多次添加同一元素到集合中最终只会包含一个元素。多个集合之间可以进行连接/交集这样的操作。从而实现类似传统数据库中索引、条件和连接查询的效果。# 添加 3 个用户和信息hmset user:1 user_name lee age 21hmset user:2 user_name david age 25hmset user:3 user_name chris age 25# 维护age索引sadd age:21 1sadd age:25 2 3# 维护name索引sadd name:lee 1sadd name:david 2sadd name:chris 3# 查找& age = 25 和 name = lee 的用户sinter age:25 name:lee& -& 会返回一个空集合将Session存放到Redis中  是一个 Redis 版的 session 存储器,使用node_redis作为驱动。借助它即可在Express中启用Redis来持久化你的Session.安装$ npm install connect-redis在 Express 3.x 中还需要安装express-session $ npm install express-session参数client 你可以复用现有的redis客户端对象, 由 redis.createClient() 创建host&& Redis服务器名port&& Redis服务器端口socket Redis服务器的unix_socket可选参数ttl&&&&&&& Redis session TTL 过期时间 (秒)disableTTL 禁用设置的 TTLdb&&&&&&&& 使用第几个数据库pass&&&&&& Redis数据库的密码prefix&&&& 数据表前辍即schema, 默认为 "sess:"使用将express-session传给connect-redis来启用var session = require('express-session');var RedisStore = require('connect-redis')(session);app.use(session({&&& store: new RedisStore(options),&&& secret: 'keyboard cat'}));检验app.use(function (req, res, next) {& if (!req.session) {&&& return next(new Error('oh no')) // handle error& }& next() // otherwise continue})这样你的Session就转移到了Redis数据库,这样做的一个额外好处是,当你的Express服务器突然重启后,用户仍然可以使用当前Cookie中的SessionID从数据库中获取到他的会话状态,做到会话不丢失,在一定程度上提高网站的键壮性。如果你的NodeJS网站上的所有缓存数据都转移到了Redis后,就可做到完全状态无关,按需扩展网站的规模。可水平扩展的NodeJS网站服务器集群(非 & 不同,它们是相互独立的,可分布在不同的物理服务器上),这样的架构,对于应对超大规模并发也是有好处的。
给我带来了很大帮助谢谢
alert('1');
cluster模块 也可以这样做分布在不同物理服务器上吧?反正都是用redis缓冲
请问,这个的意思是吧redis安装在另外的服务器上,我尝试过,安在和node同一台机器上,cluster模式可以共享session,但是redis安装在其他机器上就链接补上redis了,请问这是什么原因
@侯优仪 #10
一般是Reids的设置问题,你可以试试
1) 检查一下redis服务器的防火墙设置。
看看redis是否限制只允许本机访问,如:
bind 127.0.0.1 ,如果有先注释掉。
3)如果允许外网访问,请确保redis 设置了访问密码,如: requirepass password 并检查是否与 node.js 中写的一致
@蒲丹示 #6
Alert("err")
&热门文章 - 分享最多
&相关阅读 - JS学习
&关键字 - Node.JS
&欢迎订阅 - 技术周刊
我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;
我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊}

我要回帖

更多关于 redis缓存数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信