一、什么是NoSQL?
NoSql实际是NOT ONLY SQL,不仅SQL的意思。 关系型数据库是行+列的数据结构,同一表下数据结构是一样的,而非关系型数据库没有固定的格式,并且可以进行横向扩展。 NoSQL泛指非关系型数据库,传统的关系型数据库难以应对大数据尤其是超大规模高并发的处理,NoSQL在当今大数据环境下发展迅速,主流的NoSQL数据库有 Cassandra、 Mongodb、CouchDB、Redis、 Riak、 Membase、Neo4j、HBase等。
传统RDBMS
- 组织化结构
- 固定SQL
- 数据和关系都存在单独的表中
- DML(数据操作语言)、DDL(数据定义语言)等
- 严格的一致性:原子性、一致性、隔离性、持久性
- 事务
NoSQL特点
- 不仅是数据
- 没有固定的查询语言
- 键值对存储(redis)、列存储(HBase)、文档存储(mongodb)、图形数据库(存储图形关系)
- 最终一致性:基本可用、软状态/柔性事务、最终一致性
二、Redis是什么?
Redis全称remote dictionary server即远程字典服务,使用ANSI C编写、支持网络、可基于内存和持久化的日志型KV数据库,并提供了多种语言的API。与memcached一样,为了保证效率,数据缓存在内存中,不同的是Redis支持周期性的将数据持久化到磁盘或把修改操作写入追加的记录文件,并在此基础上实现了主从同步。
三、Redis五种基本类型
Redis是一个开源、内存存储的数据结构服务器。可用作数据库,高速缓存和消息队列代理。支持字符串(String)、哈希表、列表、集合、有序集合、位图、hyperloglogs等数据类型,内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
1、String(字符串)
String类型是Redis最基础的数据结构,也是使用较多的类型,其他四种类型多多少少是在String类型的基础上构建的,string类型最大存储512MB,这里的String类型可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串或数字的字符串
应用场景
1、缓存功能:利用Redis作为缓存,配合其他数据库作为存储层,利用Redis高并发的特点可以大大加快系统的读写速度、以及降低后端数据库的压力 2、计数器:利用Redis作为系统的实时计数器,可以快速实现计数和查询的功能,二期最终的数据结果可以按照特定的时间落地到数据库或者其他存储介质当中进行持久化存储 3、统计多单位的数量:eg,uid:gongming count:0 根据不同的uid更新count数量。 4、共享用户session:分布式系统中利用Redis将用户的session集中管理,这种模式下只需保证Redis的高可用,每次session的更新或获取可以快速完成
2、List(列表)
list类型用于存储多个有序的字符串,列表中每个字符看做一个元素,Redis的list支持存储2^32-1个元素,同时支持列表两端插入(pubsh)和弹出(pop)元素,支持读取指定范围或指定下标的元素操作;Redis列表是链表型数据结构,元素有序并且可以重复
应用场景
1、消息队列:list结构可以轻松实现阻塞队列,例如生产者通过lpush插入数据,消费者通过brpop消费,同时支持channel实现消息广播 2、列表或数据分页展示,利用list的范围内获取元素解决分页查询功能
3、Set(集合)
set类型和list类型类似,都可以用来存储多个字符元素的集合,不同的是set集合中不允许元素重复且元素是无需的,set集合使用哈希表构造的,因此复杂度是O(1),支持集合内增删改查,并且支持多个集合间的交集、并集、差集操作
应用场景
1、标签: 2、统计网站独立IP:利用set集合的元素唯一性,快速实时统计访问网站的独立IP
4、sorted set (有序集合)
有序集合也是集合类型的一部分,保留了集合中元素不重复的特性,但是给每个元素多设置了一个分属,利用此分属作为排序的依据。
应用场景
1、排行榜:利用有序性做排行榜 2、用来做带权重的队列
5、hash(哈希)
hash结构是键值对集合,它是一个string类型的field和value的映射表,Redis本身是键值对型数据库,因此hash结构相当于在value中又套了一层key-value 型数据,所以hash更适合存储关系型数据对象
应用场景
1、用来存储关系型数据库中表记录,一条记录作为一个key-value,把每列的属性值对应成field-value存储在哈希表中,通过key值区分表中的主键。 2、存储用户相关信息,避免重复读取数据库以提高系统性能