一、关系数据库和非关系数据库
1.1 关系型数据库
- 一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。
- SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
- 主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等。
- 以上数据库在使用的时候必须先建库、建表、建立表结构,然后存储数据的时候按表结构去存,如果数据与表结构匹配不一致就会存储失败
1.2 非关系型数据库
-
NoSQL(NoSQL=NotonlysQL),意思是“不仅仅是SQL",是非关系型数据库的总称。
-
除了主流的关系型数据库外的数据库,都认为是非关系型。
-
不需要预先建库建表定义数据存储表结构,每条记录可以有不同的数据类型和字段个数(比如微信群聊里的文字、图片、视频、音乐等)。
-
主流的NOSQL 数据库有Redis、MongBD、 Hbase(分布式非关系型数据库,大数据使用)、Memcached、ElasticSearch(简称ES,索引型数据库)、TSDB(时续型数据库) 等。
1.3 关系型数据库与非关系型数据库的区别
- 数据存储方式不同
- 关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在數据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
- 与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
- 扩展方式不同
- SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
- 要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来克服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
- 而NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
- 对事务性的支持不同
- 如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的sQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
- 虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。
总结
| 区别 | SQL | NoSQL |
|---|---|---|
| 存储方式 | 二维表格(行、列) | 数据集(文档、键值对(K/V)、图结构) |
| 扩展方式 | 纵向扩展(提升硬件计算能力) | 横向扩展(扩展节点数量) |
| 事务支持 | 事务控制的细粒度更高、更稳定,更易于回滚事务 | 稳定性较弱 |
1.4 非关系型数据库产生背景
可用于应对Web2.0纯动态网站类型的三高问题(高并发、高性能、高可用)。
- High performance :对数据库高并发读写需求。
- Hugestorage :对海量数据高效存储与访问需求。
- High Scalability && High Availability :对数据库高可扩展性与高可用性需求。
关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路。让关系型数据库关注在关系上和对数据的一致性保障,非关系型数据库关注在存储和高效率上。例如,在读写分离的MySQI数据库环境中,可以把经常访问的数据(即高热数据)存储在非关系型数据库中,提升访问速度。
二、Redis概述
2.1 Redis简介
- Redis (远程字典服务器) 是一个开源的、使用C语言编写的NoSQL数据库。
- Redis 基于内存运行并支持持久化,采用key-value (键值对)的存储形式,是目前分布式架构中不可或缺的一环。
- Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降:若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。 若对高并发要求更高一些,可能会考虑在同-台服务器上开启多个进程。若CPU资源比较紧张,采用单进程即可。
2.2 Redis的优点
- 具有极高的数据读写速度:数据读取的速度最高可达到110000 次/s,数据写入速度最高可达到81000 次/s。
- 支持丰富的数据类型:支持key-value、 Strings、Lists、 Hashes、Sets及Sorted Sets等数据类型操作。
- 支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- 原子性:Redis所有操作都是原子性的。
- 支持数据备份:即master-salve 模式的数据备份。
2.3 Redis的五大数据类型
- String 字符串型(默认情况下Redis使用的数据类型)
- List 列表型
- Hash 哈希(散列)
- Set 无序集合
- Sorted Set 有序集合(或称zset)
| 结构类型 | 结构存储的值 | 结构的读写能力 |
|---|---|---|
| String | 可以是字符串、整数、浮点数 | 对整个字符串或者字符串的其中一部分进行操作,对整数的浮点数执行自增或者自减操作 |
| list | 一个链表,链表上每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪;读取单个或多个元素,根据值查找或者移除元素 |
| set | 包含字符串的无序收集器,并且被包含的每个字符串都是独一无二各不相同的 | 添加、获取、移除单个元素,检车一个元素是否存在与集合中,计算交集,并集,差集,从集合里面随机获取元素 |
| hash | 包含键值对的无序散列 | 添加、获取、移除单个键值对,获取所有键值对 |
| zset | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素,根据分值范围或者成员来获取元素 |
2.4 Redis的使用场景
- Redis作为基于内存运行的数据库,是一个高性能的缓存,一般应用在Session缓存、队列、排行榜、计数器、最近最热文章、最近最热评论、发布订阅等。
- Redis适用于数据实时性要求高、数据存储有过期和淘汰特征的、不需要持久化或者只需要保证弱一致性、逻辑简单的场景。
- 我们通常会将部分数据放入缓存中,来提高访问速度,然后数据库承担存储的工作。
哪些数据适合放入缓存中?
- 即时性。例如查询最新的物流状态信息
- 数据一致性要求不高。例如门店信息,修改后,数据库中已经改了,五分钟后缓存中才是最新的,但不影响功能使用。
- 访问量大且更新频率不高,例如网站首页的广告信息,访问量大,但是不会经常变化。
2.5 Redis为什么这么快?
- Redis是一款纯内存结构,避免了磁盘 I/O 等耗时操作。(基于内存运行)
- Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。(单线程模型)
- 采用了 I/O 多路复用机制,大大提升了并发效率。(epoll模式)
-
注:inux系统中有两种I/O类型:磁盘I/O,网络请求I/O。
在Redis6.0中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。
总结 Redis是基于内存运行的;Redis处理线程的命令是单线程处理(减少锁竞争与线程切换的资源消耗);采用了I/O多路复用(可用让单线程处理多个连接请求,减少网络IO的消耗),提高了并发。
三、Redis安装部署
#准备redis软件包到/opt下,版本如下
redis-5.0.7.tar.gz
#关闭防火墙
systemctl stop firewalld
setenforce 0
#安装环境依赖包,确保已有本地仓库并且挂载
yum install -y gcc gcc-c++ make
#解压软件包
cd /opt/
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
#编译安装,指定安装路径为/usr/local/redis
make && make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了Makefile 文件,所以在解压完软件包后,不用先执行./configure 进行配置,可直接执行make与make install命令进行安装。
#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
Please select the redis executable path [] /usr/local/redis/bin/redis-server
#这里默认为/usr/local/bin/redis-server,需要手动修改为/usr/local/redis/bin/redis-server,注意要一次性正确输入
---------------------- 虚线内是注释 ----------------------------------------------------
Port : 6379 #默认侦听端口为6379
Config file : /etc/redis/6379.conf #配置文件路径
Log file : /var/log/redis_6379.log #日志文件路径
Data dir : /var/lib/redis/6379 #数据文件路径
Executable : /usr/local/redis/bin/redis-server #可执行文件路径
Cli Executable : /usr/local/redis/bin/redis-cli #客户端命令工具
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
#当install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为6379
netstat -natp | grep redis
#把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
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
--70行修改--
bind 127.0.0.1 192.168.142.50 #监听的IP地址(添加本机IP地址)
--93行含义--
port 6379 #监听端口
--137行含义--
daemonize yes #使用守护进程的方式启动,即后台启动
--159行含义--
pidfile /var/run/redis_6379.pid #Redis的进程号保存位置
--172行含义--
logfile /var/log/redis_6379.log #日志保存的位置
--187行含义--
databases 16 #监听库的数量(编号0-15)
#上方设置完成后重启服务
/etc/init.d/redis_6379 restart #重启redis服务
四、Redis数据库命令工具介绍
4.1 Redis 命令工具
- redis-server:用于启动Redis的工具
- redis-benchmark:用于检测redis在本机的运行效率
- redis-check-aof:修复AOF持久化文件
- redis-check-rdb:修复RDB持久化文件
- redis-cli:redis命令行工具
4.2 redis-cli 命令行工具
语法:redis-cli -h <主机名> -p <端口号> -a <密码>
| 选项 | 含义 |
|---|---|
| -h | 指定远程主机 |
| -p | 指定Redis服务的端口号 |
| -a | 指定密码,未设置数据库密码可以省略-a选项(默认情况下未设置密码) |
若不添加任何选项表示,使用127.0.0.1:6379连接主机上的Redis数据库
4.3 redis-benchmark 测试工具
① redis-benchmark 测试工具选项及参数
- redis-benchmark 是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。
- 基本的测试语法:redis-benchmark [选项] [参数]
| 选项 | 参数 |
|---|---|
| -h | 指定服务器主机名 |
| -p | 指定服务器端口 |
| -s | 指定服务器 socket |
| -c | 指定并发连接数 |
| -n | 指定请求数 |
| -d | 以字节的形式指定SET/GET值的数据大小 |
| -k | l=keep alive 0=reconnect |
| -r | SET/GET/INCR 使用随机key,SADD使用随机值 |
| -P | 通过管道传输<numreg>请求 |
| -q | 强制退出redis,仅显示query/sec值 |
| --csv | 以CSV格式输出 |
| -l | 生成循环,永久执行测试 |
| -t | 仅运行以逗号分隔的测试命令列表 |
| -I | Idle模式,仅打开N个idle连接并等待 |
② 示例1
#向IP地址为192.168.142.50、 端口为6379 的Redis 服务器发送100个并发连接与10000 个请求测试性能。
redis-benchmark -h 192.168.142.50 -p 6379 -c 100 -n 10000
-h 192.168.142.50 #指定本机IP
-p 6379 #指定redis端口号
-c 100 #指定并发连接数为100
-n 10000 #指定请求数为10000
示例2
#测试存取大小为100字节的数据包的性能。
redis-benchmark -h 192.168.142.50 -p 6379 -d 100 -q
#测试大小为100字节的数据包
-d 100 #指定数据包大小为100字节
-q #退出redis,只显示query或者sec的值
示例3
#测试本机Redis服务在进行指定操作时的性能
redis-benchmark -t set,lpush -n 10000 -q
#测试redis在请求数为10000使用set,lpush命令时的性能
-t set,lpush #指定只测试set与lpush两条命令
五、Redis数据库常用命令
5.1 string数据类型命令
5.1 存放数据(set)与查看数据(get)
set [键名] [键值]
# 创建键、并赋予键值,也可以进行值的覆盖(修改)
get [键名]
# 查看键名对应的键值
5.2 查看所有键
keys *
#查看目前库中所有类型的键
5.3 查看指定条件键
keys k*
#查看所有以k开头的键
keys k?
# ? 代表单个任意字符
#查看以k开头且后方只有一个任意字符的键
keys k??
#查看以k开头且后方只有两个任意字符的键
5.4 查询是否存在键
EXISTS [键名]
#查看是否有该键名的键
5.5 删除键
del [键名]
#删除指定的键名
5.6 查看键的数据类型
type [键名]
#查看指定键的数据类型
5.7 修改键的名称(重命名)
rename [旧键名] [新键名]
#将已有键的键名修改
#若旧键与新键都具有值,则前者旧键会将新键的值覆盖
renamenx [旧键名] [新键名]
#该命令不同于rename,该命令在重命名前,会查看重命名的新键名是否之前已有键值,若新键在之前已经拥有键值,则不进行重命名覆盖操作
5.8 查看当前库中所有键的数量
dbsize
#查看当前库中键的总数
5.9 设置查看redis的密码
config set requirepass [密码]
#设置密码后,登录redis后需要输入密码才可以查看库中的内容
config get requirepass [密码]
#查看当前redis的密码
config set requirepass ''
#此命令为设置空密码
auth [密码]
#在设置密码后,登录redis后输入该命令,才可以查看库的内容
redis-cli -a[密码]
#设置密码后,登录redis时使用此命令一样可以查看库中内容
![ik3u1fbpfcp/e42cbf77bd3c4a98b09f9bc295ddd226~tplv-k3u1fbpfcp-watermark.image?)
5.10 设置指定键的过期时间
setex [键名] [时间] [键值]
#setex命令用于设置键的过期时间
#过期时间默认单位为秒
ttl [键名]
#查看指定键的生命周期
六、Redis多数据库常用命令
6.1 多数据库切换
Redis支持多数据库,redis默认清空下包含16个数据库,数据库名称是用数字0-15来依次命名的。(多数据库相互独立,互不干扰)
select [序号]
#切换数据库,序号范围为0-15
#使用redis-cli连接数据库后,默认使用的是序号为0的数据库
6.2 多数据库之间数据传输
move [键名] [序号]
#将当前库中的某个键移动到指定序号的库
6.3 清空当前数据库
flushdb
#清空当前所在的数据库
6.4 清空所有库
flushall
#清空所有库(0-15)的所有数据
七、Redis五大数据类型常用命令补充
| 数据类型 | 赋值命令 | 查看键值命令 | 删除键命令 |
|---|---|---|---|
| String | set | get | del |
| List | lpush | lrange | del |
| Hash | hset | hget | hdel |
| Set | sadd | smembers | del |
| Sortde Set | zadd | zrank | del |