Redis属于持久存储在磁盘中内存数据库,数据模型属于键值能够支持字符串、列表、集合、有序集合、哈希、流等。作为内存数据库,Redis会把全部数据都存储在内存中而不是硬盘上。为什么不可以使用Redis作为主数据库而只用于缓存呢?
原因一:Redis的读写速度快但是只适合存储临时数据而非持久数据,如果使用Redis为主数据库,存储的数据库里面数据无法实现持久化,当服务器出现错误会导致数据永久丢失。
原因二:Redis是单线程一次只能支持处理一个请求,如果把Redis用作主数据库不能处理并发请求,会导致性能问题及响应时间延迟。而MySQL这种关系型数据库确可以处理多个请求,不容易出现性能瓶颈。
原因三:Redis不支持SQL查询,这样不能使用SQL语言,而MySQL数据库提供了更强大的SQL查询功能可以实现更为复杂的查询。MySQL的数据存储在磁盘中,与 Redis 相比 MySQL 作为主数据库存储成本低,但性能差一些。
结合实际情况看将Redis设为主数据库,会面临高额成本,且存储的容量还会受到限制。因为Redis默认将数据存储在内存中,内存的价格远高于磁盘,作为主数据库用Redis存储成本高。且容量受限于内存大小,不适合存储海量数据。
Redis支持简单的键值操作,缺乏复杂查询的能力(如 JOIN、聚合等)而主数据库需要支持复杂的业务逻辑。Redis高性能适合用于缓存,能够加速数据访问。实际应用MySQL成本优势更胜一筹。出于性能和成本出发,不少数据库服务商很多采用内存+磁盘结合的解决方案。
单一的数据库优势在于事务性实现更简单,是由数据库自己来保证。使用Redis更多是出于性能和并发上考虑,如果是遇到需要执行比较久且结果不经常变动的SQL就比较适合把运行的结果先放到缓存,后面再去请求缓冲读取,这样可以提高速度。大并发时全部请求都是直接访问的数据库,数据库连接就会容易出现异常,而Redis可以做出缓冲操作,让请求先访问Redis而不是直接访问数据库。
问题:有哪些存储方式分享?
答:B树能够支持随机读取和按范围查找系统,查找时间复杂度为logd(n)(d为每个节点的出度)。Mysql的InnoDB的引擎和OS的文件系统使用的就是B+树。
哈希存储CRUD非常快,但是不支持顺序扫描。bitcask是一个基于hash表结构的存储系统。他将写操作(包括删除标识)追加到文件尾。并定期合并新老文件&记录。
LSM树(Log Structured Merge Tree)是由B+数改进而来。主要思路是将增量写操作保存在内存中,超过阈值时刷入磁盘,从而减少随机写磁盘操作。读操作则需要合并磁盘数据和内存中的写操作。用Memtable/SSTable实现,实现细节在此不做深入探究。比较适合写操作较多的业务场景。BigTable/HBase/Cassandra中的列簇的数据存储方式采用的即是LSM树。
问题:Redis单线程为什么那么快?
答:主要原因有三点,纯内存操作;单线程操作(避开频繁上下文切换);采用非阻塞I/O多路复用机制。