最近针对Redis的基本数据结构、持久化机制、事务、主从复制和分布式锁等知识点做了系统的学习和整理,现对本次学习Redis的过程做一次思考和总结。
为什么要使用nosql(not only sql)
这个问题我们站在互联网技术中常提到的"高并发"和"高可用"关键词来思考这个问题,我是这样子理解的:
传统的关系型数据库,比如单机的MySQL的QTS只有2000~3000左右,在一些大并发的场景下,比如618活动、双11活动等场景下,数据库根本就扛不住这么大的并发量,轻而易举的就将数据库打挂了,从而导致了服务不可用。每请求一次数据库可以看作是一次I/O,在大并发的场景下,频繁的I/O非常影响系统的性能。传统的关系型数据库存在扩展成本高、读写慢(速度肯定不会比直接在内存中取快)、容量有限等问题。nosql具有高并发(直接内存操作)、高可用(主从、集群模式)、成本低和没有复杂的关系等优点。Java或者Guava的map其实性能也很高,但是不能满足需求,因为生命周期随着JVM而结束。而且现在大部分项目都是分布式的,没法解决缓存的一致性的问题。
举个例子:用户第一次从数据库中读到数据之后缓存到redis中,然后第二次直接从redis中读取就会大大提高系统的性能。
当然nosql也存在一些缺点,比如不支持SQL语句查询、特性不够丰富等。
综上所述,nosql的出现更多的是为了解决数据量大,分布式中的问题,提高系统的高并发和高可用,为了数据吞吐量上的数量而对数据一致性打一点折扣。
市面上常见nosql数据都有什么
键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB典型应用: 内容缓存,主要用于处理大量数据的高访问负载。数据模型: 一系列键值对优势: 快速查询劣势: 存储的数据缺少结构化 列存储数据库
相关产品:Cassandra, HBase, Riak典型应用:分布式的文件系统数据模型:以列簇式存储,将同一列数据存在一起优势:查找速度快,可扩展性强,更容易进行分布式扩展劣势:功能相对局限 文档型数据库
相关产品:CouchDB、MongoDB典型应用:Web应用(与Key-Value类似,Value是结构化的)数据模型: 一系列键值对优势:数据结构要求不严格劣势: 查询性能不高,而且缺乏统一的查询语法 图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph典型应用:社交网络数据模型:图结构优势:利用图结构相关算法劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案
redis都有哪些常见的应用场景
最常用的功能就是缓存。直接从缓存查找数据,减少I/O,直接提高程序性能。分布式session共享的问题。分布式锁的实现(redisson)。zset实现排行榜功能。BitMap实现判断哪些用户登陆过系统的功能实现发布/订阅功能,不过基本不推荐这么使用,有成熟的MQ解决方案,比如rabbitMQ、kafka
redis核心知识点
Redis之基本数据类型及其数据结构Redis之BitMapRedis之布隆过滤器(BloomFilter)Redis之内存淘汰机制和过期策略Redis之持久化机制(RDB和AOF)Redis之I/O多路复用技术(multiplexing)Redis之事务的实现Redis之主从复制的实现Redis之常见问题以及解决方案Redis之分布式锁的实现Redis总结