一个数据库读写模型的设想

最近这几天,一直在思考写服务器的时候怎么做数据库的读写服务,用什么架构来做这个事情,现在终于有了一个大概的想法,用redis+mysql的方法。
        目前业内有两种思路,一种是full-mem模式,即全用redis存储这种方式。另外一种是redis只存热数据,大部分数据放到mysql里。具体选哪种还是要看具体的需求。
        一般而言,纯redis用于数据量比较小,读写极为频繁的状况,而redis+mysql结合是用于解决数据量比较大,而且冷数据比较多的情况。必定redis的价格还是蛮高的,一台2G的redis节点阿里云只需要270一个月,而一台256G的redis节点就要5W一个月,一年就是60W,用来发点奖金啥的都挺好的。
        我决定暂时用redis+mysql结合的方式,redis中只存3天或7天以后用户访问过的数据,mysql中存储其他的数据。大概思路如下:
        启动阶段:
        从mysql中读取一部分常用的不会在服务器运行过程中修改的配置表,根据实际需求初始化成各种redis的表,方便查询。比如一个道具配置表的结构是:

CREATE TABLE `standard_item` (
  `sn` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘sn‘,
  `id` int(10) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘物品id‘,
  `name` varchar(50) NOT NULL DEFAULT ‘11‘ COMMENT ‘道具名‘,
  `type` tinyint(4) NOT NULL DEFAULT ‘0‘ COMMENT ‘类型‘,
  `sub_type` smallint(5) unsigned NOT NULL DEFAULT ‘0‘,
  `quality` tinyint(4) NOT NULL DEFAULT ‘0‘ COMMENT ‘品质‘,
  `stacked_num` smallint(6) NOT NULL DEFAULT ‘0‘ COMMENT ‘堆叠数量‘,
  `use_num` smallint(6) NOT NULL DEFAULT ‘0‘ COMMENT ‘使用数量‘,
  `is_use` tinyint(4) NOT NULL DEFAULT ‘0‘,
  `price` smallint(6) NOT NULL DEFAULT ‘0‘,
  `effect` varchar(50) DEFAULT NULL,
  `version` int(10) NOT NULL DEFAULT ‘0‘ COMMENT ‘球员碎片对应的版本‘,
  PRIMARY KEY (`sn`),
  KEY `IX_Type` (`type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2478 DEFAULT CHARSET=utf8 COMMENT=‘标准物品表‘;

这个表在redis中存储一般会是以standard_item:id为key的哈希表,但是策划如果有需求根据type和quality查询所有道具的话,我就应该在初始化的阶段将standard_item多转存出几个standard_item:type:quality为主键的set来,以启动时候预处理的时间来换取运行阶段大量查询的时间,或者避免用户查询的时候击穿redis到mysql数据库。
    启动完成以后,读运算:
    用户请求服务器===》 服务器查询redis是否有用户缓存
                                                ===》如果有返回数据并进行对应运算
                                                ===》如果没有,击穿缓存层,访问mysql数据库读取数据===》返回数据并保存至redis,标记3天后过期
    启动完成后,写运算:
    服务器有写请求===》将写请求置入写的队列,解除数据的过期时间
    写数据的线程===》如果队列中有需要写的数据,就取出一条进行mysql写操作===》写入成功,标记redis数据3天后过期
                                                                                                                            ===》写入失败,重写至次数尝试超过限定次数,写日志
                         ===》如果队列中没有需要写的数据,休眠一小会

明天按照这个思路试着做套数据库读写机制试下。

时间: 2024-10-20 05:03:38

一个数据库读写模型的设想的相关文章

之前数据库读写模型的实现

之前有个数据库读写的设想,然后就实现了一下,实现花的时间比预期的要长,昨天没有弄完,今天又加班弄了一会.但还是有很多很不满意的地方,包括测试也没有做到位.明天回家看孩子,再整就得下周二了,到时候再好好调整下. 重点看game_db_sup后面的,game_db_sup监督了4个behaviour.eredis_pool_sup是github上现成的第三方库,主要负责redis的读写,主要是有poolboy和erdis的东西一起完成的.game_db_cache是个gen_server,主要负责配

《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型 (转)

不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创建模型 问题 有一个存在的数据库,它拥有表.也许还有视图.外键.你想通过它来创建一个模型. 解决方案 让我们设想,你拥有一个描述诗人(Poet)以及他们的诗(Poem),还有他们之间关系的数据库.如图2-7所示. 图2-7 一个关于诗人及他们的诗的简单数据库 从上图可以看出,一个诗人可能是一首或多首

MariaDB数据库读写分离实现(二):amoeba的使用

本文接上一篇博客:MariaDB数据库读写分离实现(一):mysql-proxy的使用 http://sohudrgon.blog.51cto.com/3088108/1608605 我们将mysql-proxy停止,在节点node5上安装amoeba,测试实现数据库的读写分离. 一.amoeba的简介     Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注分布式数据库 proxy 开发.座落于Clien

数据库读写分离和负载均衡策略

最近在学习数据库的读写分离和主从复制,采用的是一主多从策略,采用轮询的方式,读取从数据库的内容.但是,假如某一台从数据库宕机了,而客户端不知道,每次轮选到此从数据库,不都要报错?到网上查阅了资料,找到一篇不错的博文,不仅讲了解决方案,也详细的讲述了数据库的分区,分表,集群和负载均衡策略,博文原址http://www.cnblogs.com/zhongxinWang/p/4262650.html 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互

新春好跑步,以及数据库“读写分离”的点滴考虑

新春的好日子: 小风吹来: 花一样的味道: 满满的幸福滋味. 迈开步子在宽敞的马路上跑步,步伐轻盈,多么美好的事情. 跑步总是枯燥的,只有奔跑奔跑: 跑步是孤独的,每个人的都有自己的节奏: 跑步的时候总爱瞎想,昨天和一些同学聊到了数据库的"读写分离". 在我有限的认识中,我一直认为数据库"读写分离",是为了提升数据库的瓶颈,因为数据库写总是相对比较少,而读取可能总是比较多,甚至高几个数量级. 比如一个电子商务网站,把某一个产品上架,可能一个月才需要写一次,但是每天都

【转】mysql数据库读写分离数据同步

转载请注明来源:mysql数据库读写分离数据同步 mysql数据库读写分离数据同步 我是用了两个xp(一个主的,一个从的)的系统测试成功的,linux系统我也做测试了,没有成功,不过我想我所遇到的问题是同一个问题,xp下的可以成功,linux下的应该也可以成功,稍候会测试,然后更新结果! PS:刚测试了下linux 可以同步成功,主服务器是xp,从服务器是centos,可以成功. 例: A机器 192.168.0.2 B机器 192.168.0.3 两个机器可以ping通,互相访问 先配置主服务

spring+mybatis利用interceptor(plugin)兑现数据库读写分离

使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是“地位相当”的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这几台数据库服务器之间进行合理分配, 这个时候,通过统一的一个DataSource来屏蔽这种请求分配的需求,从而屏蔽数据访问类与具体DataSource的耦合: 系统中存在的多台数据库服务器现在地位可能相当也可能不相当,但数据访问类在系统启动时间无法明确到底应该使用哪一个数据源进行数据访问,而必须在系统运行期间通过某种条

DataUml Design 教程7 - 数据库生成模型

DataUml Design支持数据库生成模型,并支持外键关系,能够根据外键自动生成类与类之间的关系. 目前DataUML Design支持MS Server.MY SQL.Oracle和Access数据库,其它数据库待续. DataUml Design支持数据库表生成类图,支持浏览数据库对象功能. 一.浏览数据库对象 1.选择要查看的数据库对象,鼠标右键,点击"连接"菜单.如下图7-1 图7-1 连接成功之后,加载数据库中所有表,如下图7-2 图7-2 2.再选择数据库节点对象,鼠标

数据库读写分离的初步理解

传统的应用通常会将业务的表放在同一个数据库,所有的学些操作连接的都是一个数据库,在信息爆炸的今天,很多业务模块的信息数据会非常大,此时将所有的操作都放在一个数据库上不能满足性能需求,因为一台服务器其IO.CPU等资源都是有限的. 为什么要做读写分离了? 较多数业务都会频繁的读(查询)数据库. 读(查询)非常占用CPU和IO. 针对上述原因,目前很多系统架构上采取了数据库的"读写分离"的策略. 如上图所示,数据库上分为一个Master库和多个Slave库,其中Master库为主库,只有一