最近针对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