本文的复习偏向于概念,没有过多代码的演示
一、NoSQL
1.什么是NoSQL
- Nosql泛指非关系型的数据库,它的产生是为了解决大规模数据集合、多重数据种类带来的挑战,尤其是大数据应用难题;
- 区别于传统的关系型数据库,Nosql不保证关系数据的ACID特性。
2.为什么要使用NoSQL
- 因为现在的网站具有下面的特点与需求:
- 高并发读写
- Web2.0网站数据库并发负载非常高,往往达到每秒上万次的读写请求
- 高容量存储和高效存储
- Web2.0网站通常需要在后台数据库中存储海量数据,如何存储海量数据并高效查询是一个挑战
- 高扩展性和高可用性
- 随着系统的用户量和访问量与日俱增,需要数据库能够很方便的进行扩展和维护
- 高并发读写
3.NoSQL数据库的优势
- 易扩展
- 数据之间无关系,非常容易扩展,在架构的层面上也有可扩展能力。
- 大数据量,高性能
- NoSQL数据库具有非常高的读写性能,主要得益于它的无关系性,数据库的结构简单。
- 灵活的数据结构
- 无需建立字段,可以存储自定义的数据格式。
- 高可用
- NoSQL在不太影响性能的情况下,可以方便的实现高可用的框架。
4.常见的NoSQL产品
二、Redis
1.简介
- 全称:REmote Dictionary Server(远程字典服务器)
- 完全免费开源,用c语言编写,是一个高性能的分布式内存数据库。(key/value)
2.Redis与其他key-value缓存产品的比较
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载使用;
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储;
- Redis支持数据的备份,即master-slave(主从)模式的数据备份
3.Redis的优势
- 性能极高,Redis读的速度是110000次/s,写的速度是81000次/s;
- 具有丰富的数据类型,Redis支持二进制案例的Strings、Lists、Hashes、Sets及Ordered Sets数据类型操作;
- 原子性:Redis的所有操作都是原子性的,而且还支持对几个操作合并后的原子性执行;
- 丰富的特性:Redis还支持publish/subscribe(发布订阅模式)、key过期等等特性;
- 采用单线程,避免了不必要的上下文切换和线程竞争,不存在多进程或者多线程导致的切换而消耗CPU,不用考虑锁的相关问题,也不会因为出现死锁而导致的性能消耗;
- 使用多路I/O复用模型,非阻塞IO;
4.Redis的应用场景
(1) 缓存(数据查询,短连接,新闻内容,商品内容等),使用最多
(2) 聊天室在线好友列表
(3) 任务队列(秒杀,抢购,12306等)
(4) 应用排行榜
(5) 网站访问统计
(6) 数据过期处理(可以精确到毫秒)
(7) 分布式集群架构中的session问题
三、Redis的数据结构
- Redis是一种基于内存的数据库,并且提供一定的持久化功能,是一种键值(key-value)数据库,使用key作为索引找到当前缓存的数据,并且返回给程序调用者
- Redis支持6种数据类型,重点掌握前五种
- 字符串(String)
- 列表(List)
- 集合(Set)
- 哈希结构(hash)
- 有序集合(zset)
- 基数(HyperLogLog)
- 基数指的是一个集合中不重复的元素的个数
- 表格描述
数据类型 |
数据类型存储的值 |
说明 |
String(字符串) |
可以保存字符串、整数和浮点数 |
可以对字符串进行操作,比如增加字符或求子串;如果是整数或浮点数,可以实现计算,比如自增等 |
List(列表) |
是一个链表,每一个节点都包含一个字符串 |
Redis支持从链表的两端插入或者 弹出节点,或者通过偏移对它进行裁剪;还可以读取一个或多个节点,根据条件删除或查找节点等 |
Set(集合) |
它是一个收集器,但是是无序的,在它里面的每一个元素都是一个字符串,而且是独一无二的,和java的set集合很像 |
可以新增、读取、删除单个元素;检测一个元素是否在集合中;计算它和其他集合的交集、并集和差集等;随机从集合中读取元素 |
Hash(哈希散列表) |
类似java中的Map,是一个键值对应的无序列表 |
可以增删改查单个键值对,也可以获取所有的键值对 |
Zset(有序集合) |
是一个有序的集合,可以包含字符串、整数、浮点数、分值(score),元素的排序是依据分值的大小来决定的 |
可以增删改查元素,根据分值的范围或者成员来获取对应的元素 |
HyperLogLog(基数) |
它的作用是计算重复的值,以确定存储的数量 |
只提供基数的运算,不提供返回的功能 |
四、Redis的事务管理
- Redis的事务可以一次执行多个命令,并且带有以下两个重要的保证
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中不会被其他客户端发来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部执行,要么全部不执行
- 一个事务从开始到执行会经历下面三个阶段
- 开始事务
- 命令入队
- 执行事务
- Redis中以multi命令开始一个事务,将多个命令入队到事务中,最后由exec命令触发事务,一并执行事务中的所有指令
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set u1 user1
QUEUED
127.0.0.1:6379> get u1
QUEUED
127.0.0.1:6379> sadd tag c++ html java
QUEUED
127.0.0.1:6379> smembers tag
QUEUED
127.0.0.1:6379> exec
1) OK
2) "user1"
3) (integer) 3
4) 1) "java"
2) "html"
3) "c++"