联系型数据库和非联系型数据库
联系型数据库
- 联系型数据库是一个结构化的数据库,创立在联系模型(二维表格模型)基础上,一般面向于记载。
- SQL 句子(规范数据查询言语)便是一种根据联系型数据库的言语,用于履行对联系型数据库中数据的检索和操作。
- 干流的联系型数据库包括Oracle、MySQL、SQL Server、Microsoft Access、DB2、PostgreSQL等。
- 以上数据库在运用的时候必须先建库建表设计表结构,然后存储数据的时候按表结构去存,假如数据与表结构不匹配就会存储失利。
非联系型数据库
- NoSQL(NoSQL = Not Only SQL),意思是“不仅仅是 SQL”,对错联系型数据库的总称。
- 除了干流的联系型数据库外的数据库,都认为对错联系型。
- 不需求预先建库建表界说数据存储表结构,每条记载能够有不同的数据类型和字段个数(比如微信群聊里的文字、图片、视频、音乐等)。
- 干流的NoSQL 数据库有Redis、MongBD、Hbase、Memcached、ElasticSearch、TSDB等。
联系型数据库和非联系型数据库区别
-
数据存储方法不同
- 联系型和非联系型数据库的主要差异是数据存储的方法。联系型数据天然便是表格局的,因此存储在数据表的行和列中。数据表能够互相相关协作存储,也很容易提取数据。
- 与其相反,非联系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非联系型数据一般存储在数据集中,就像文档、键值对或许图结构。你的数据及其特性是挑选数据存储和提取方法的首要影响因素。
-
扩展方法不同
- SQL和NoSQL数据库最大的差别或许是在扩展方法上,要支撑日益增长的需求当然要扩展。
- 要支撑更多并发量,SQL数据库是纵向扩展,也便是说进步处理才能,运用速度更快速的计算机,这样处理相同的数据集就更快了。由于数据存储在联系表中,操作的功用瓶颈或许涉及很多个表,这都需求经过进步计算机功用来克服。尽管SgL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
- 而NoSQL数据库是横向扩展的。由于非联系型数据存储天然便是分布式的,NoSQL数据库的扩展能够经过给资源池增加更多普通的数据库服务器(节点)来分担负载。
- 对业务性的支撑不同
- 假如数据操作需求高业务性或许复杂数据查询需求操控履行计划,那么传统的SQL数据库从功用和稳定性方面考虑是你的最佳挑选。SQL数据库支撑对业务原子性细粒度操控,而且易于回滚业务。(SQL业务操控的细粒度更高,更稳定,更易回滚业务)
- 尽管NoSQL数据库也能够运用业务操作,但稳定性方面无法和联系型数据库比较,所以它们真正的价值是在操作的扩展性和大数据量处理方面。
非联系型数据库发生背景
可用于应对 Web2.0 纯动态网站类型的三高问题(高并发、高功用、高可用)
- High performance:对数据库高并发读写需求
- Huge storage:对海量数据高效存储与拜访需求
- High Scalability && High Availability:对数据库高可扩展性与高可用性需求
联系型数据库和非联系型数据库都有各自的特点与运用场景,两者的紧密结合将会给Web2.0的数据库发展带来新的思路。让联系型数据库重视在联系上和对数据的一致性确保,非联系型数据库重视在存储和高功率上。例如,在读写别离的MySQL数据库环境中,能够把常常拜访的数据存储在非联系型数据库中,进步拜访速度。
Redis简介
Redis (远程字典服务器)是一个 开源的、运用C言语编写的NoSQL 数据库。
Redis 根据内存运转并支撑耐久化,选用key-value (键值对)的存储方式,是现在分布式架构中不可或缺的一环。
Redis服务器程序是单进程模型,也便是在一台服务器上能够同时发动多个Redis进程,Redis的实践处理速度则是完全依靠于主进程的履行功率。
- 若在服务器上只运转一个Redis进程,当多个客户端同时拜访时,服务器的处理才能是会有一定程度的下降;
- 若在同一台服务器上敞开多个Redis进程,Redis在进步并发处理才能的同时会给服务器的CPU造成很大压力。
即:在实践生产环境中,需求根据实践的需求来决议敞开多少个Redis进程。若对高并发要求更高一些,或许会考虑在同一台服务器上敞开多个进程。若CPU资源比较严重,选用单进程即可。
Redis的优点
- 具有极高的数据读写速度: 数据读取的速度最高可达到110000 次/s,数据写入速度最高可达到81000次/s。
-
支撑的数据结构: key-value,支撑丰厚的数据类型:Strings、 Lists、Hashes、 Sets 及Sorted Sets 等数据类型操作。
- Strings 字符串型
- Lists 列表型
- Hashes 散列
- Sets 无序集合
- Sorted Sets 有序集合
- 支撑数据的耐久化: 能够将内存中的数据保存在磁盘中,重启的时候能够再次加载进行运用。
- 原子性: Redis一切操作都是原子性的。(支撑业务,一切操作都作为业务)
- 支撑数据备份: 即 master-salve 方式的数据备份。(支撑主从复制)
Redis存在的问题
- 缓存和数据库双写一致性问题
- 缓存雪崩问题
- 缓存击穿问题
- 缓存的并发竞赛问题
Redis的适用场景
- Redis作为根据内存运转的数据库,是一个高功用的缓存,一般运用在session缓存、 行列、排行榜、计数器、最近最热文章、最近最热评论、发布订阅等。(给联系型数据做缓存,进步拜访的速度)
- Redis适用于数据实时性要求高、数据存储有过期和筛选特征的、不需求耐久化或许只需求确保弱一致性、逻辑简略的场景。
哪些数据适合放入缓存中
一般会将部分数据放入缓存中,来进步拜访速度,然后数据库承当存储的工作。
- 即时性。例如查询最新的物流状况信息。
- 数据一致性要求不高。例如门店信息,修改后,数据库中现已改了,五分钟后缓存中才是最新的,但不影响功用运用。
- 拜访量大且更新频率不高,例如网站主页的广告信息,拜访量大,但是不会常常变化。
Redis为什么快
- Redis是一款纯内存结构,防止了磁盘 I/O 等耗时操作。(根据内存运转)
- Redis指令处理的核心模块为单线程,削减了锁竞赛,以及频频创立线程和毁掉线程的代价,削减了线程上下文切换的耗费。(单线程处理)
- 选用了 I/O 多路复用机制,大大进步了并发功率。(epoll方式)
注:在 Redis 6.0中新增加的多线程也仅仅针对处理网络恳求进程选用了多线性,而数据的读写指令,仍然是单线程处理的。
Redis装置
-
装置所需依靠包
-
解压包,由于有makefile文件,可直接编译装置
-
直接用make进行编译,install时加个参数指定装置途径
-
进入redis的bin目录,其中的为履行指令
-
回到redis软件包中,进入utils目录,利用install_server.sh对redis做一些必要装备
-
履行install_server.sh文件
-
将redis/bin下的可履行文件悉数加入系统管理中
-
将redis履行文件加到系统管理
-
在第一次履行install_server.sh文件时,redis就现已发动成功。
-
但发动监听的时本地(127.0.0.1),所以要修改装备文件
-
装备完后重启redis
Redis指令东西
东西 | 效果 |
---|---|
redis-server | 用于发动redis的东西 |
redis-benchmark | 用于检测redis在本机的运转功率 |
redis-check-aof | 修正AOF耐久化文件 |
redis-check-rdb | 修正RDB耐久化文件 |
redis-cli | redis指令行东西 |
redis-cli指令行东西
语法:redis-cli -h host -p port -a password
- -h:指定远程主机
- -p:指定Redis 服务的端口号
- -a:指定暗码,未设置数据库暗码能够省略-a选项
- 若不增加任何选项表明,则运用127.0.0.1:6379衔接本机上的 Redis 数据库
redis-benchmark 测验东西
redis-benchmark是官方自带的Redis功用测验东西,能够有用的测验Redis服务的功用。
根本的测验语法:redis-benchmark [选项] [选项值]
选项 | 效果 |
---|---|
-h | 指定服务器主机名 |
-p | 指定服务器端口 |
-s | 指定服务器 socket |
-c | 指定并发衔接数 |
-n | 指定恳求数 |
-d | 以字节的方式指定SET/GET值的数据大小 |
-k | 1=keep alive 0=reconnect |
-r | SET/GET/INCR 运用随机key,SADD运用随机值 |
-P | 经过管道传输<numreg>恳求 |
-q | 强制退出redis,仅显现query/sec值 |
–csv | 以CSV格局输出 |
-l | 生成循环,永久履行测验 |
-t | 仅运转以逗号分隔的测验指令列表 |
-I | Idle方式,仅翻开N个idle衔接并等待 |
示例
- 向IP地址为192.168.44.20、 端口为6379 的Redis 服务器发送100个并发衔接与100000 个恳求测验功用。
redis-benchmark -h 192.168.44.20 -p 6379 -c 100 -n 100000
- 测验存取大小为100字节的数据包的功用。
redis-benchmark -h 192.168.44.20 -p 6379 -q -d 100
- 测验本机上Redis 服务在进行 set 与 lpush 操作时的功用。
redis-benchmark -t set,lpush -n 100000 -q
Redis数据库常用指令
指令 | 效果 |
---|---|
set | 寄存数据 |
get | 获取数据 |
keys * | 检查一切的key |
keys k? | 检查k最初后边恣意一位的数据 |
exists | 判别键是否存在(存在1,不存在0) |
del | 删去键 |
type | 检查键对应的value值类型 |
rename key1 key2 | 改名,不管key2是否存在都会改名成功。假如存在,key1的值会掩盖key2得值 |
renamenx key1 key2 | 改名,若key2不存在,能够改名成功。若key2存在则不进行改名 |
dbsize | 检查当时数据库中key的数目 |
set、get 设置和获取键的值
- set:寄存数据,指令格局为
set key value
- get:获取数据,指令格局为
get key
lpush创立list
指令格局:lpush key value
keys 获取键值列表
keys指令能够获取契合规矩的键值列表,一般状况能够结合 * 、? 等选项来运用。
-
检查当时数据库中一切键
-
检查当时数据库中以v最初的键
-
检查当时数据库中以v最初,后边包括恣意一位字符的键
-
检查当时数据库中以v最初,后边包括恣意两位字符的键
exists 判别键是否存在
exists 指令能够判别键是否存在。
回来1,表明键存在。
回来0,表明键不存在。
del 删去键
del 指令能够删去当时数据库的指定key。
type 检查键存储的数据类型
type 指令能够获取 key 对应的 value 值类型。
rename 重命名
rename 指令是对已有 key 进行重命名。(掩盖)
- 运用rename指令进行重命名时,无论方针key是否存在都会进行重命名,且源key的值会掩盖方针key的值。
- 在实践运用进程中,主张先用exists指令检查方针key 是否存在,然后再决议是否履行rename 指令,以防止掩盖重要数据。
假如重命名后的键名是现已存在的键,那就会掩盖已有的键。
renamenx 重命名
renamenx 指令的效果是对已有key进行重命名,并检测新名是否存在,假如方针key存在则不进行重命名。(不掩盖)
dbsize检查键数目
dbsize 指令的效果是检查当时数据库中key的数目。
设置过期时长和检查存活时间
setex,设置过期时长,指令格局:setex key 时间 value
ttl,检查存活时间,指令格局:ttl key
设置和清空暗码
设置和检查暗码
运用config set requirepass password
指令设置暗码。(一旦设置暗码,必须先验证经过暗码,否则一切操作不可用)
运用config get requirepass
指令检查暗码。
设置暗码后,运用暗码登录能够直接操作,不需求二次验证
清空暗码
运用config set requirepass ''
清空暗码。
Redis多数据库操作
Redis 支撑多数据库,Redis默认状况下包括16个数据库,数据库名称是用数字0-15来依次命名的。
运用redis-cli衔接Redis数据库后,默认运用的是序号为0的数据库。
多数据库相互独立,互不干扰。
多数据库间切换select
指令格局:select 序号
(范围:0~15)
运用redis-cli衔接Redis数据库后,默认运用的是序号为0的数据库。
多数据库间移动数据
指令格局:move 键值 序号
铲除数据库内数据
- FLUSHDB:清空当时数据库数据
- FLUSHALL:清空一切数据库的数据,慎用!!!
总结
联系型数据库:
- 实例–>数据库–>表(table)–>记载行(row)、数据字段(column)
非联系型数据库:
- 实例–>数据库–>集合(collection) –>键值对(key-value)
- 非联系型数据库不需求手动建数据库和集合(表)。
Redis
- Redis根据内存运转并支撑耐久化
- 选用key-value(键值对)的存储方式
- 优点
- 具有极高的数据读写速度
- 支撑丰厚的数据类型
- 支撑数据的耐久化
- 原子性
- 支撑数据备份
Redis 为什么快
- 根据内存运转
- 选用单线程处理数据的读写(削减锁竞赛和线程切换的耗费)
- 选用IO多路复用机制(能够让单线程处理多个衔接恳求,削减网络IO的耗费)
设置、检查、删去的指令
类型 | 设置 | 检查 | 删去 |
---|---|---|---|
string | set | get | del |
List | lpush | lrange | del |
Hash | hset | hget | hdel |
Set | sadd | smembers | del |
Sorted Set | zadd | zrank | del |