前些日子,一个悠闲又不悠闲的下午,我还在用 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. 【编译原理】LL1文法语法分析器

    上篇文章[编译原理]语法分析--自上向下分析 分析了LL1语法,文章最后说给出栗子,现在补上去. 说明: 这个语法分析器是利用LL1分析方法实现的. 预测分析表和终结符以及非终结符都是针对一个特定文法 ...

  2. MSSQL SQL注入 总结

    0x00 MSSQL 基础 MSSQL系统自带库和表 系统自带库 MSSQL安装后默认带了6个数据库,其中4个系统级库:master,model,tempdb和msdb:2个示例库:Northwind ...

  3. VSCode Java 开发环境配置 详细教程

    VSCode Java 开发环境配置 详细教程 配置java 下载 用于现在大多数使用者用的是java 8,小白的我先安装java 8好了,^ w ^. 下载地址:Java 8 | Java SE 打 ...

  4. Springboot 启动分析

    启动类 Spring 启动类主要是 Annotation (@SpringBootApplication) 和 main 方法体中的 SpringApplication.run. 其中注解 @Spri ...

  5. Integer.valueOf()和Integer.parseInt()区别

    他们返回类型的不同是最大的原因. static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行分析. static Integer valueOf(int i) ...

  6. python实现图像梯度

    一,定义与作用 图像梯度作用:获取图像边缘信息 二,Sobel 算子与函数的使用 (1)Sobel 算子------来计算变化率 (2)Sobel函数的使用 (3-1)代码实现(分别): (3-2)代 ...

  7. [SQL]master..sysprocesses

    --https://docs.microsoft.com/zh-cn/sql/relational-databases/system-compatibility-views/sys-sysproces ...

  8. Java培训机构如何选择才能避免被骗?

    近年来,随着IT行业的快速崛起,各类互联网人才供不应求,而Java工程师作为目前最为火爆的岗位之一,更是以高薪+高新技术的标签受到了人们的广泛关注.许多年轻人也看到了这个行业的发展前景,决定报名培训机 ...

  9. [yLOI2018] 锦鲤抄

    先思考图上是\(tag\)的特殊情况. 考虑我们按拓扑序反过来操作,就可以得到我们任意想要的顺序. 那么我们把所有的图都缩点操作,那么我们只需要考虑一个联通分量里就行了. 一个联通分量最后只会剩下一个 ...

  10. 【samtools】运行报错: error while loading shared libraries:libcrypto.so.1.0.0或libncurses.so.5或libtinfow.so.5

    samtools用conda安装后,总是出现共享库缺失的报错.即便你刚安装samtools时可以用,但后面在同一环境中安装其他相关软件,有可能产生了冲突,导致库替换,因而报错. 避免这种情况,可能最好 ...