MySQL&Redis
MySQL属于关系型数据库,其数据存储在磁盘当中进行持久化存储,检索时涉及到一定的IO操作,数据访问较慢;Redis属于非关系型数据库,其数据存储于内存当中,亦可使用RDB、AOF方式进行持久化存储,数据访问效率高。
表设计方面,MySQL需要事先进行设计表结构、表字段等;Redis采用结构型数据存储,如果是对于小型的系统可以不用设计,但若考虑合理规范的使用Redis,需要先进行规划:
数据项:value存储的内容是什么,应该选用何种数据类型进存储。
数据类型:list、set、zset、string、hash。
数据大小:100字节、1000字节。。。
记录数:100万条(决定是否进行拆分)
MySQL支持多种存储引擎,不同的存储引擎有不同的存储方式;Redis是一个支持网络、基于内存的键值对类型数据库,支持五种数据类型。
MySQL使用的是规范化的SQL语句;而非关系型数据库之间的语法差异性很大。
MySQL&MongoDB
MySQL属于关系型数据库;MongoDB属于文档型的非关系型数据库,可以存储 xml、json、bson 类型,呈现分层的树状数据结构,数据结构由键值(key-value)对组成。
MySQL支持事务操作;MongoDB不支持事务。
MySQL数据存储在磁盘;MongoDB数据存储在内存。
MongoDB占用空间大,遵循的以空间换时间的原则,目前为止不支持在线压缩的功能,若频繁对数据进行增删改查容易出现数据碎片,从而导致索引出现问题&占用空间越来越大
MySQL由Database/Table/Row/Column(数据库-表-记录-列)组成; MongoDB由Database/Collection/Document (集合-文档)组成。
MySQL需要提前设计表结构、表字段,MongoDB的Collection的每个Document的结构可自由修改。
MySQL支持json,MongoDB没有。
MySQL 使用 SQL 语言; MongoDB 使用类似 JavaScript 的函数
Redis&Memcached
Redis不仅支持简单的k/v类型的数据,还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中
Redis的速度比Memcached快很多
Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的IO复用模型。在高并发场景的压力下,多线程非阻塞式IO的Memcached表现会更加优异。
Redis并不是将所有内存数据都存放在内存中,只会将所有的key存放在内存,在读取时会有一定几率存在一次IO操作,Redis是使用时间换取了空间的策略;
Memcached内部还存在一个slot的机制,对内存的使用优先使用废弃内存,在内存的重复利用上也具有一定的优势;
Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费。
Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis根据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),所以Redis更适合作为存储而不是cache。
Redis提供了一个“事务”的概念,Redis的事务仅仅只是将一组操作按顺序进行操作,在这之间不会插入任何其他命令,从而保证数据的一致性,但是这种方式很容易造成操作阻塞。Memcached提供了类似于乐观锁一样的cas操作,会快速的返回处理成功或失败,不会对其他数据操作产生影响。
Memcached本身并不支持集群,所有的集群形式都是通过客户端实现。Redis可修改配置文件 “cluster-enabled yes” 开启集群。
Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB。
Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高。
对持久化要求不高,更希望快速高效,优先考虑Memcached
需要进行实时配置(预热服务器配置,通过在线修改配置信息达到不同的效果),有限考虑Memcached。
存储JSON字符串的场景使用Memcached。
需要支持多类型数据类型,持久化要求比较高的情况下,优先使用Redis
使用Redis的String类型做的事,都可以用Memcached替换,以此换取更好的性能提升; 除此以外,优先考虑Redis;
图片描述
详细讲解: https://www.imooc.com/article/23549
转载于:https://www.cnblogs.com/hsmwlyl/p/10732952.html