做网站就用建站之星,百度竞价防软件点击软件,c asp做网站,网站开发项目的规划与设计文档blog.csdn.net/suifeng3051/article/details/23739295一、问题#xff1a;数据库表数据量极大#xff08;千万条#xff09;#xff0c;要求让服务器更加快速地响应用户的需求。二、解决方案#xff1a;1.通过高速服务器Cache缓存数据库数据2.内存数据库这里仅从数据缓存方… blog.csdn.net/suifeng3051/article/details/23739295一、问题数据库表数据量极大千万条要求让服务器更加快速地响应用户的需求。 二、解决方案1.通过高速服务器Cache缓存数据库数据2.内存数据库 这里仅从数据缓存方面考虑当然后期可以采用HadoopHBaseHive等分布式存储分析平台三、主流解Cache和数据库对比 上述技术基本上代表了当今在数据存储方面所有的实现方案其中主要涉及到了普通关系型数据库MySQL/PostgreSQLNoSQL数据库(MongoDB)内存数据库Redis内存CacheMemcached我们现在需要的是对大数据表仍保持高效的查询速度普通关系型数据库是无法满足的。而MongoDB其实只是一种非关系型数据库其优势在于可以存储海量数据具备强大的查询功能因此不宜用于缓存数据的场景。 从以上各数据可知对于我们产品最可行的技术方案有两种1.Memcached 内存Key-Value Cache2.Redis 内存数据库 四、下面重点分析Memcached和Redis两种方案 4.1 Redis 介绍 Redis是一个key-value存储系统。和Memcached类似它支持存储的value类型相对更多包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作而且这些操作都是原子性的。在此基础上redis支持各种不同方式的排序。与memcached一样为了保证效率数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件并且在此基础上实现了master-slave(主从)同步,当前 Redis的应用已经非常广泛国内像新浪、淘宝国外像 Flickr、Github等均在使用Redis的缓存服务。 4.2 Redis 工作方式分析 Redis作为一个高性能的key-value数据库具有以下特征 1. 多样的数据模型 2. 持久化 3. 主从同步 Redis支持丰富的数据类型最为常用的数据类型主要由五种String、Hash、List、Set和Sorted Set。Redis通常将数据存储于内存中或被配置为使用虚拟内存。Redis有一个很重要的特点就是它可以实现持久化数据通过两种方式可以实现数据持久化使用RDB快照的方式将内存中的数据不断写入磁盘或使用类似MySQL的AOF日志方式记录每次更新的日志。前者性能较高但是可能会引起一定程度的数据丢失后者相反。 Redis支持将数据同步到多台从数据库上这种特性对提高读取性能非常有益。4.3 Redis如何实现分布式可拓展性 2.8以前的版本与Memcached一致可以在客户端实现也可以使用代理twitter已开发出用于Redis和Memcached的代理Twemproxy 。3.0 以后的版本相较于Memcached只能采用客户端实现分布式存储Redis则在服务器端构建分布式存储。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本它没有中心节点各个节点地位一致具有线性可伸缩的功能。如图给出Redis Cluster的分布式存储架构其中节点与节点之间通过二进制协议进行通信节点与客户端之间通过ascii协议进行通信。在数据的放置策略上Redis Cluster将整个 key的数值域分成16384个哈希槽每个节点上可以存储一个或多个哈希槽也就是说当前Redis Cluster支持的最大节点数就是16384 4.4 Memcached介绍 Memcached 是一个高性能的分布式内存对象缓存系统用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数从而提供动态、数据库驱动网站的速度现在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。 4.5 Memcached工作方式分析 许多Web应用都将数据保存到 RDBMS中应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果减少数据库访问次数以提高动态Web等应用的速度、 提高可扩展性。下图展示了memcache与数据库端协同工作情况 其中的过程是这样的1. 检查用户请求的数据是缓存中是否有存在如果有存在的话只需要直接把请求的数据返回无需查询数据库。2. 如果请求的数据在缓存中找不到这时候再去查询数据库。返回请求数据的同时把数据存储到缓存中一份。3. 保持缓存的“新鲜性”每当数据发生变化的时候比如数据有被修改或被删除的情况下要同步的更新缓存信息确保用户不会在缓存取到旧的数据。 Memcached作为高速运行的分布式缓存服务器具有以下的特点 1. 协议简单 2. 基于libevent的事件处理 3. 内置内存存储方式4. memcached不互相通信的分布式4.6 如何实现分布式可拓展性Memcached的分布式不是在服务器端实现的而是在客户端应用中实现的即通过内置算法制定目标数据的节点如下图所示五、综合结论 应该说Memcached和Redis都能很好的满足解决我们的问题它们性能都很高总的来说可以把Redis理解为是对Memcached的拓展是更加重量级的实现提供了更多更强大的功能。具体来说 1、性能 性能上都很出色具体到细节由于Redis只使用单核而Memcached可以使用多核所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中Memcached性能要高于Redis虽然Redis最近也在存储大数据的性能上进行优化但是比起 Memcached还是稍有逊色。总体来讲TPS 方面 Redis 和 Memcache 差不多Redis 支持高并发量官方宣传支持10万级别的并发读写。 2、操作的便利性 Memcached 数据结构单一key-value仅用来缓存数据。 Redis 支持的数据类型更多数据操作方面Redis 更好一些也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积同时还提供String、Hash、List、Set和Sorted Set等数据结构的存储。 3、内存空间的大小和数据量的大小 Redis 在 2.0 版本后增加了自己的 VM 特性突破物理内存的限制可以限定内存使用大小当数据超过阈值则通过类似LRU的算法把内存中的最不常用数据保存到硬盘的页面文件中可以对 key value 设置过期时间类似MemcachedRedis一个value最大支持512MB。 Memcached 可以修改最大可用内存,采用 LRU 算法Memcached单个key-value大小有限一个value最大只支持1MB。 4、可靠性持久化 Redis 具有持久化机制可以定期将内存中的数据持久化到硬盘上Redis 支持快照、AOF依赖快照进行持久化aof 增强了可靠性的同时对性能有所影响。 Memcached 不支持数据持久化断电或重启后数据消失通常用在做缓存,提升性能。 5、数据一致性事务支持 Memcached 在并发场景下用 cas 保证一致性Redis 事务支持比较弱只能保证事务中的每个操作连续执行。 6、应用场景 Redis适用于对读写效率要求都很高数据处理业务复杂和对安全性要求较高的系统数据量较小的更性能操作和运算Redis 只使用单核而 Memcached 可以使用多核所以平均每一个核上Redis在存储小数据时比Memcached性能更高。 Memcached用于在动态系统中减少数据库负载提升性能;做缓存提高性能适合读多写少对于数据量比较大可以采用 sharding。 六、需要慎重考虑的部分 1. Memcached单个key-value大小有限一个value最大只支持1MB而Redis最大支持512MB2. Memcached只是个内存缓存对可靠性无要求而Redis更倾向于内存数据库因此对对可靠性方面要求比较高3. 从本质上讲Memcached只是一个单一key-value内存Cache而Redis则是一个数据结构内存数据库支持五种数据类型因此Redis除单纯缓存作用外还可以处理一些简单的逻辑运算Redis不仅可以缓存而且还可以作为数据库用4. 新版本3.0的Redis是指集群分布式也就是说集群本身均衡客户端请求各个节点可以交流可拓展行、可维护性更强大。七、总结1. 没有必要过于关注性能因为二者的性能都已经足够高了。由于Redis只使用单核而Memcached可以使用多核所以二者比较起来平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中Memcached性能要高于Redis。虽然Redis最近也在存储大数据的性能上进行优化但是比起Memcached还是稍有逊色。说了这么多结论是无论你使用哪一个每秒处理请求的次数都不会成为瓶颈。 2. 在内存使用效率上如果使用简单的key-value存储Memcached的内存利用率更高。而如果Redis采用hash结构来做key-value存储由于其组合式的压缩其内存利用率会高于Memcached。当然这和你的应用场景和数据特性有关。 3. 如果你对数据持久化和数据同步有所要求那么推荐你选择Redis。因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失选择Redis也是明智的。 4. 当然最后还得说到你的具体应用需求。Redis相比Memcached来说拥有更多的数据结构并支持更丰富的数据操作。通常在Memcached里你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中这些复杂的操作通常和一般的GET/SET一样高效。所以如果你需要缓存能够支持更复杂的结构和操作那么Redis会是不错的选择。关注下方二维码订阅更多精彩内容。转发朋友圈是对我最大的支持。