前些日子,一个悠闲又不悠闲的下午,我还在用 Node.js 写着某个移动互联网应用的 API 服务端。那时还是用 MySQL 作为数据库,一切都很好,所有功能正常运行。可是有很多问题让人不安:

  1. 频繁的产品功能变化让MySQL跟不上 产品初期功能变化很频繁,其中很多变化都不得不对数据库结构做出更改。对于MySQL来说,也许是改一个字段名方便SELECT,也许是把一个字段移到另一个表方便索引,也许是要对多个表重新设计来达到修改要求(这种情况最惨烈,但开发过程中遇到过不止一次<char_group class="biaodian cjk">)。

  2. 符合范式的设计让JOIN在SELECT语句中大行其道

    尽管在设计时已经做好规划,保证在多数查询时不会用到JOIN,但是在其它不少地方仍然很难回避两表甚至多表联查,一些模块中SQL语句的复杂度甚至能达到大学数据库原理考试时考查的SQL语句题目的水平。写起来烦,想想实际运行情况,也不禁为MySQL同学捏一把汗。于是后来对复杂的MySQL语句增加了Cache,Redis第一次在这个项目登场就是干这个的,当时Cache的设计思路是:

    Redis存储两份数据,一份是数据缓存,一份是数据的最新版本号,执行复杂SQL查询时先检查这个查询在Redis里有没有数据缓存且对比数据的最新的版本号看当前数据缓存是不是最新的,是的话就读出来直接返回,不是的话查询MySQL得出结果并保存在Redis数据缓存中。如果更新了会影响这个查询结果的数据的话则简单地将Redis里该数据的最新版本号加1即可。

    这个设计很简单实用,但很快问题就暴露出来了:因为缓存的加入导致整个系统更复杂,而且随着MySQL数据库结构的不断复杂,单纯加入缓存无法根本上解决这一问题。更重要的是,由于读写频率基本保持在1:1,导致缓存命中率极低,不如不用。

  3. 一切问题的解决方案都是NoSQL 上述问题让我重新考虑是否用NoSQL替换MySQL。关于NoSQL数据库我接触过的为MongoDB和Redis,最后选择Redis的原因是因为系统中已经使用了Redis做Cache,对Redis了解更多。

    现在的API服务端代码已经从Node.js(JavaScript) + C + MySQL迁移到Node.js(CoffeeScript) + C + Redis。通过实践,使用Redis后的代码更易维护,更加整洁,性能也更高。同时在迁移时写了一个简单的Redis ORM模块,用起来十分方便。

MySQL 迁移到 Redis 记的更多相关文章

  1. Redis-port安装使用实现redis迁移codis,以及简单redis pipe实现将mysql迁移redis

    (0)Redis-port原理: 首先是看到下面这篇文档开始研究的redis-port http://www.itnpc.com/news/web/146085373656602.html  简要截图 ...

  2. 将数据从MySQL迁移到Oracle的注意事项

    将数据从MySQL迁移到Oracle的注意事项1.自动增长的数据类型处理MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动 ...

  3. 【菜鸟玩Linux开发】通过MySQL自动同步刷新Redis

    在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不适合使用Redis直接作为数据库.这俩家 ...

  4. Linux 上从 MySQL 迁移到 MariaDB 的简单步骤

    大家好!这是一篇介绍如何在服务器或个人电脑上从MySQL迁移到MariaDB的教程.也许你会问为什么我们要将数据库管理从MySQL迁移到MariaDB.往下看我们告诉你为什么这样做.为什么要用Mari ...

  5. 数据库 SQL Server 到 MySQL 迁移方法总结

    最近接手一起老项目数据库 SQL Server 到 MySQL 的迁移.因此迁移前进行了一些调查和总结.下面是一些 SQL Server 到 MySQL 的迁移方法. 1. 使用 SQLyog 迁移 ...

  6. MySQL迁移[转]

    http://dbarobin.com/2015/09/15/migration-of-mysql-on-different-scenes/ MySQL 迁移方案概览 MySQL 迁移无非是围绕着数据 ...

  7. 在 Linux 中怎样将 MySQL 迁移到 MariaDB 上

    自从甲骨文收购 MySQL 后,由于甲骨文对 MySQL 的开发和维护更多倾向于闭门的立场,很多 MySQL 的开发者和用户放弃了 MySQL.在社区驱动下,促使更多人移到 MySQL 的另一个叫 M ...

  8. 聊聊Mysql索引和redis跳表

    摘要 面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别.这种一看就知道是死记硬背,没有理解索引的本质.本文旨在剖析这 ...

  9. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

随机推荐

  1. Vuex状态管理——任意组件间通信

    核心概念 在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信. 每一个 Vuex 应用的 ...

  2. 解决虚拟机linux系统全屏问题

    修改设置 1) 如下图右单击虚拟机名,选择[settings-],调出虚拟机设置界面. 2) 在设置界面选择[hardware]->[CD/DVD2(IDE)]->[Connection] ...

  3. KMP算法,看这篇就够了!

    普通的模式匹配算法(BF算法) 子串的定位操作通常称为模式匹配算法 假设有一个需求,需要我们从串"a b a b c a b c a c b a b"中,寻找内容为"a ...

  4. k8s网络模型与集群通信

    在k8s中,我们的应用会以pod的形式被调度到各个node节点上,在设计集群如何处理容器之间的网络时是一个不小的挑战,今天我们会从pod(应用)通信来展开关于k8s网络的讨论. 小作文包含如下内容: ...

  5. Linux系统查看磁盘可用空间的5个命令

    大家好,我是良许. 工作中,经常会遇到磁盘爆满的情况,尤其是一台服务器运行了 N 年之后,里面会充满各种各样垃圾文件,比如:编译产生的中间文件.打包的镜像文件.日志文件,等等. 别问我怎么知道,我上家 ...

  6. c++ 中vector 常见用法(给初学者)

    c++ 中 vector vector有两个参数,一个是size,表示当前vector容器内存储的元素个数,一个是capacity,表示当前vector在内存中申请的这片区域所能容纳的元素个数. ca ...

  7. [atAGC054D]ox

    对于两个字符串$s$和$t$(保证其中每一种字符个数相同),定义$s$和$t$的相对逆序对数为$s$得到$t$的最少交换次数,显然同种字符相对顺序保持不变,因此即依次编号后的逆序对数 问题不妨看作构造 ...

  8. [hdu7000]二分

    不妨假设$x\le y$,可以通过翻转整个格子序列来调整 令$a_{i}$​​为$i$​​到$y$​​的期望步数,显然有方程$a_{i}=\begin{cases}0&(i=y)\\\frac ...

  9. [atAGC106F]Figures

    考虑purfer序列,若生成树的pufer序列为$p_{i}$,则答案为$(\prod_{i=1}^{n}a_{i})\sum_{p}\prod_{i=1}^{n}\frac{(a_{i}-1)!}{ ...

  10. Docker 急速入门

    1. 概述 之前聊了很多 SpringCloud 相关的话题,今天我们来聊聊服务容器 Docker. 2. 在 CentOS7 安装 Docker 2.1 卸载旧版本的Docker  # yum re ...