关系型数据库和非关系型数据库的区别
(1) 数据存储方式不同
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
①关系型:依赖于关系模型E-R图,同时以表格式的方式存储数据
②非关系型:除了以表格形式存储之外,通常会以大块的形式组合在一起进行存储数据
(2) 扩展方式不同
SQL和NoSQI数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。要支持更多并发量,SQI数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来克服。虽然SQI数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
而NoSQI数据军是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQI数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
① 关系:纵向(天然表格式)
② 非关:横向(天然分布式)
(3)对事务性的支持不同
如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQI数据库从性能和稳定性方面考虑是最佳选择。SQI数据库支持对事务原子性细粒度控制,并且易于回滚事务。
虽然NoSQI数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展
性和大数据量处理方面。
①关系型:特别适合高事务性要求和需要控制执行计划的任务
②非关系:此处会稍显弱势,其价值点在于高扩展性和大数据量处理方面
(4)关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给Web2.0的数据库发展带来新的思路。让关系数据库关注在关系上,非关系型数据库关注在存储上。例如,在读写分离的MySQI数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度。
关系数据库:保存位置 磁盘
非关数据库(内存/缓存数据库) :保存的位置 是缓存/内存(效率、速度块)特殊的是redis,因为redis可以将内存中的
数据保存在磁盘中
总结
关系型数据库
实例→数据库→表→记录行、数据字段→存储数据
非关系型数据库
实例→数据库→集合→键值对(key-value)
非关系数据库不需要手动建数据库和集合
Redis简介
Redis是一个开源的、使用c语言编写的NoSQL数据库。
Redis基于内存运行并支持持久化(支持存储在磁盘),采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。
Redis服务器程序是单进程模型
Redis服务在一.台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器.上只运行一个Redis进程, 当多个客户端同时访问时,服务器的处理能力是会有一-定程度的下降;若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。
建议可以开2个进程
原因:
1、备份
2、抗高并发的同时尽量不给CPU造成太大的压力
若对高并发要求更高一- .些,可能会考虑在同一台服务器上开启多个进程。若CPU资源比较紧张,采用单进程即可。
不同的进程所用的资源池是相互独立的,当出现几个或多个redis就需要互相访问对方的资源池(上下文切换),这就非常占用cpu资源
频繁进行主进程之间的切换/通讯会很消耗cpu资源,所以redis默认开启的是单进程,并且需要根据并发量业务需求来开启对应的主进程数量,建议值为2
Redis的优点
(1) 具有极高的数据读写速度:数据读取的速度最高可达到110000 次/s,数据写入速度最高可达到81000 次/s。
(2) ★★支持丰富的数据类型:支持key-value、 Strings、 Lists、 Hashes (散列值)、Sets 及Ordered Sets等数据类型操作。
ps:
string 字符串(可以为整形、浮点和字符型,统称为元素)
list 列表: (实现队列,元素不唯-一, 先入先出原则)
set 集合: (各不相同的元素)
hash
hash散列值: (hash的key必须是唯- 的)
set /ordered sets 集合/有序集合
(3)★★支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
(4)原子性: Redis所有 操作都是原子性的。
(5)支持数据备份:即master-salve 模式的数据备份。
Redis作为基于内存运行的数据库,缓存是其最常应用的场景之一。 除此之外,Redis常见应用场景还包括获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。
部署Redis
安装redis
安装依赖包
yum install -y gcc gcc-c++ make
解压安装包
[root@localhost opt]# tar xzvf redis-5.0.7.tar.gz
由于安装包理由makefile文件不需要编译,直接安装
[root@localhost redis-5.0.7]# make
[root@localhost redis-5.0.7]# make prefix=/usr/local/redis install
执行安装脚本
[root@localhost redis-5.0.7]# cd utils/
[root@localhost utils]# ./install_server.sh #一直回车即可
创建软连接
ln -s /usr/local/redis/bin/* /usr/local/bin/
redis服务控制
/etc/init.d/redis_6379 stop #停止
/etc/init.d/redis_6379 start #启动
/etc/init.d/redis_6379 restart #重启
/etc/init.d/redis_6379 status #查看状态
修改配置添加监听主机地址
vim /etc/redis/6379.conf
重启redis
Redis的命令工具
redis-server:用于启动Redis的工具
redis-benchmark:用于检测Redis在本机的运行效率
redis-check-aof:修复AOF持久化文件
redis-check-rdb:修复RDB持久化文件
redis-cli:Redis命令行工具
redis-cli -h 远程主机ip -p 服务端口号 -a 指定密码
如果没有设置数据库密码,可以省略-a选项,若不添加任何选项表示,这使用127.0.0.1:6379连接本机上的Redis数据库
Redis测试工具redis-benckmark
不需要安装,redis自带
redis-benckmark选项
-h :指定服务器主机名
-P :指定服务器端口
-s :指定服务器socket(套接字)
-c :指定并发连接数
-n :指定请求数
-d :以字节的形式指定SET/GET值的数据大小
-k :1=keep alive 0=reconnect
-r :SET/GET/INCR 使用随机key,SADD使用随机值
-p :通过管道传输<numreq>请求
-q :强制退出redis
-l :生成循环,永久执行测试
-t :仅运行以逗号分割的测试命令列表
-I :Idle模式,仅打开N哥idle连接并等待
向主机发送100个并发连接和1W个请求测试性能
[root@redis utils]# redis-benchmark -h 192.168.59.129 -p 6379 -c 100 -n 10000
测试存储大小为100字节的数据包的性能
[root@redis utils]# redis-benchmark -h 192.168.59.129 -p 6379 -q -d 100
测试本机redis在进行set和lpush操作时的性能
[root@redis utils]# redis-benchmark -t set,lpush -n 10000 -q
Redis数据库常用命令
存放和获取数据
set key :存放数据
get key : 获取数据
keys n? 查询键
keys n*
redis-cli命令行工具
redis-cli -h host -p port -a password #若不添加host默认使用本地127.0.0.1:6379连接redis数据库
*代表多个字符 ?代表一个字符
重命名
rename 旧key名 新key名 无论新key名是否存在都会进行重命名并覆盖
renamenx 旧key名 新key名 如果新key已经存在就取消这个操作
判断值是否存在以及键值类型
查看当前库里key的数目
设置密码 、删除密码
追加数据
key值的递增、递减
返回原有的值并设置新值
设置键并指定过期时间
批量创建、批量查看
多数据库
默认情况下只能选择16个数据库 0-15
多数据库之间移动数据
move 键值 数据库序号
清空数据库数据
性能管理
查看内存的使用
查看cpu的使用
内存碎片率
操作系统分配的内存值used_memory_rss除以Redis使用的内存值used_memory计算得出内存碎片是由操作系统低效的分配/回收物理内存导致的(不连续的物理内存分配)
跟踪内存碎片率对理解Redis实例的资源性能是非常重要的:
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150号,其中50号是内存碎片率。需要在redis-cli工具上输入shutdown save命令,并重启Redis服务器。
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少Redis内存占用
内存使用率
redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
避免内存交换发生的方法:
针对缓存数据大小选择安装Redis实例(云平台里面使用RDS服务,ECS云主机选择内存、缓存型配置)
尽可能的使用Hash数据结构存储
设置key的过期时间
内回收key
保证合理分配redis有限的内存资源。
当达到设置的最大阀值时,需选择–种key的回收策略,默认情况下回收策略是禁止删除。
配置文件中修改maxmemory- policy属性值
[root@localhost ~]# vim /etc/redis/6379.conf
598 maxmemory-policy noenviction
volatile-lru //使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl //从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random //从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru //使用LRU算法从所有数据集合中淘汰数据
allkeys-random //从数据集合中任意选择数据淘汰
noenviction //禁止淘汰数据
总结
1、redis是一种非关数据库(内存/缓存)
redis相比于其他非关数据库优势的地方主要在于:
①数据类型丰富
mysql:整型、文本、图片、字符、浮点(单精度/双精度)、char、vachar、decimal (5,2)
redis: key-value hashes strings sets(有序、无序) list
②持久化(可以将内存种的数据保存在磁盘中)形式为: RDB与AOF
2、redis 集群模式:哨兵、主从、cluster (集群)
redis的集群模式,同时也可以理解为是redis的高可用模式
主从:提供了备份冗余,缺点:无法针对故障进行自动修复,写操作无法负载均衡
哨兵:以主从为基础提供了故障自动修复的功能,写操作无法负载均衡
集群:基于主从基础,解决了故障自动修复、写操作负载均衡的问题,同时对于资源需求相较于前两种集群得到了一定的改善
3、高可用中的持久化
RDB和AOF
(1)持久化方式:
① RDB :周期性的快照
② AOF :接近实时的持久化(以everysec方式)基于日志文件持久化
(2) redis 启用的优先级
AOF>RDB,同时仅当AOF功能关闭的情况下,redis才会在重新启动时使用RDB的方式进行恢复
(3) RDB和AOF中持久化模式
①RDB:
由redis主进程(周期性) fork 派生出子进程对redis内存中的数据进行持久化(二进制压缩),生成到. rdb文件中
②AOF:
根据持久化策略(always、 no、 everysec (默认) ),先将redis中的语句保存在缓冲区中,再从缓冲区同步到.aof文件中.
4、redis的恢复策略/优势
redis与其他常用非关数据库类似,都是将数据保存在内存中,而保存在内存中时,当redis 重启,内存数据丢失,但redis 通过RDB或AOF的持久化功能可以在redis
进行重启之后,优先读取AOF文件,基于AOF文件进行数据恢复/加载这种方式来正常运行