1、非关系型数据库

NoSQL(NoSQL= Not Only SQL),意思是“不仅仅是 SQL”,是非关系型数据库的总称。主流的 NoSQL 数据库有 Redis、MongBD、Hbase、CouhDB 等等。NOSQL数据库凭借着其非关系型、分布式、开源及横向扩展等优势,被认为是下一代数据库产品。

2、非关系数据库产生背景

High performance--对数据库高并发读写需求

Huge Storage--对海量数据高效存储与访问需求

High Scalability && High Availability--对数据库高可扩展性与高可用性需求

关系型数据库和非关系型数据库都有各自的特点与应用场景,例如,在读写分离的 MySQL数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度。

一、Redis基础

1、Redis简介

Redis(RemoteDictionaryServer,远程字典型)是一个开源的、使用C语言编写的NoSQL数据库。Redis 基于内存运行并支持持久化,采用 key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。

Redis服务器程序是单进程模型,也就是一台服务器上可以同时启动多个Redis进程,而Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降。

Redis具有以下几个优点:

具有极高的数据读写速度

支持丰富的数据类型

原子性

支持数据备份

支持数据的持久化

Redis作为基于内存运行的数据库,缓存是其最常用的场景之一。除此之外,Redis常见应用场景还包括获取最新N个数据的操作,排行榜类应用,计数器类应用,存储关系,实时分析系统,日志记录

2、Redis安装部署

通常情况下,在 Linux 系统中进行源码编译安装,需要先执行./configure 进行环境检查与配置,从而生成 Makefile 文件,再执行 make && make install 命令进行编译安装。而 Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,可直接进入解压后的软件包目录,执行 make与 make install 命令进行安装。

root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

[root@localhost ~]# yum -y install gcc* zlib-devel
[root@localhost ~]#tar xvzf redis-4.0.9.tar.gz 
[root@localhost ~]#cd redis-4.0.9/ 

[root@localhost redis-4.0.9]# make
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

注意:

在make的时候,可能会出现如下错误提示:

NoSQL与Redis配置与优化_数据库

解决方法1:用make MALLOC=libc指定内存分配器为进行编译

解决方法2:make clean && make distclean

[root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install 
[root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost redis-4.0.9]# cd /root/redis-4.0.9/utils/
[root@localhost utils]# ./install_server.sh
  • 1.
  • 2.
  • 3.
  • 4.

make install 只是安装了二进制文件到系统中,并没有启动脚本和配置文件。软件包中默认提供了一个install_server.sh脚本文件,通过该脚本文件可以设置Redis服务所需要的相关配置文件。当脚本运行完毕,Redis服务就已经启动,默认侦听端口为6379。

执行./install_server.sh之后会出现以下提示,直接按回车键即可:

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    //客户端命令行工具
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

查看进程,发现已经开启了此进程:

[root@localhost utils]# netstat -anpt | grep redis
  • 1.

Redis安装完成,可通过Redis的服务控制脚本/etc/init.d/redis_6379来对Redis服务进行的控制,如停止Redis服务,启动Redis服务,重启Redis服务,查看Redis运行状态:

[root@localhost ~]#/etc/init.d/redis_6379 stop 
[root@localhost ~]#/etc/init.d/redis_6379 start 
[root@localhost ~]#/etc/init.d/redis_6379 restart 
[root@localhost ~]#/etc/init.d/redis_6379 status
  • 1.
  • 2.
  • 3.
  • 4.


3、配置参数
[root@localhost ~]#vim /etc/redis/6379.conf 
bind 127.0.0.1192.168.10.101   	//监听的主机地址 
port 6379 		//端口 
daemonize yes 	//启用守护进程 
pidfile /var/run/redis_6379.pid 	//指定 PID 文件 
loglevel notice 	//日志级别 
logfile /var/log/redis_6379.log 	//指定日志文件 

[root@localhost~]#/etc/init.d/redis_6379 restart 
[root@localhost utils]# netstat -anpt | grep redis
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

除了上述配置参数外,Redis 主配置文件中还包含很多其它的配置参数,具体内容如下表:

参数

作用

timeout 300

当客户端限制多长时间后关闭连接,如果指定为0,表示关闭该功能。

dbfilename dump.rdb

指定本地数据库文件名,默认值为dump.rdb

dir /var/lib/redis/6379

指定本地数据库存放目录

maxclients 10000

设置同一时间最大客户端连接数,默认为10000

二、Redis命令工具

redis-server:用于启动 Redis 的工具;

redis-benchmark:用于检测 Redis 在本机的运行效率;

redis-check-aof:修复 AOF 持久化文件;

redis-check-rdb:修复 RDB 持久化文件;

redis-cli:Redis 命令行工具。

1、redia-cli命令行工具
(1)连接本机redis
[root@localhost ~]# redis-cli
127.0.0.1:6379>
  • 1.
  • 2.
(2)远程连接
[root@localhost ~]#redis-cli -h 192.168.10.101 -p 6379
  • 1.
2、获取帮助

help @<group>:获取<group>中的命令列表;

help <command>:获取某个命令的帮助;

help <tab>:获取可能帮助的主题列表。

(1)查看所有与 List 数据类型的相关命令
127.0.0.1:6379>help @list
  • 1.


(2)查看 set 命令的命令帮助
127.0.0.1:6379>help set
  • 1.
3:redis-benchmark 测试工具

redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能。

(1)测试请求性能

向 IP 地址为 192.168.10.101、端口为6379 的 Redis 服务器发送 100 个并发连接与100000 个请求测试性能

[root@localhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -c 100 -n 100000
  • 1.

-h:指定服务器主机名; -p:指定服务器端口; -c:指定并发连接数; -n:指定请求数;

====== MSET (10 keys) ======
100000 requests completed in 1.02 seconds		
100 parallel clients		##100个并发连接
3 bytes payload
keep alive: 1

87.25% <= 1 milliseconds		##87.25%的命令执行时间小于等于1毫秒
99.90% <= 2 milliseconds
100.00% <= 2 milliseconds
97943.19 requests per second		#每秒的请求数
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
(2)测试存取性能

测试存取大小为 100 字节的数据包的性能

[root@localhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -q -d 100
  • 1.

-h:指定服务器主机名; -p:指定服务器端口; -d:以字节的形式指定 SET/GET 值的数据大小; -q:强制退出 redis。仅显示 query/sec 值;

(3)set 与 lpush 操作性能

测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能。

[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
  • 1.


-n:指定请求数; -q:强制退出 redis。仅显示 query/sec 值; -t:仅运行以逗号分隔的测试命令列表;

Lpush 命令将一个或多个值插入到列表头部

三、Redis数据库常用命令

set:存放数据,基本的命令格式为set key value。

get:获取数据,基本的命令格式为get key。

127.0.0.1:6379>set teacher zhanglong 
127.0.0.1:6379>get teacher
  • 1.
  • 2.
1.key 相关命令

在Redis 数据库中,与key 相关的命令主要包含以下几种。

(1)添加键值对

使用keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。

127.0.0.1:6379>set k1 1 
OK
127.0.0.1:6379>set k2 2 
OK
127.0.0.1:6379>set k3 3 
OK
127.0.0.1:6379>set v1 4 
OK
127.0.0.1:6379>set v5 5 
OK
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
(2)查看当前数据库中所有键
127.0.0.1:6379>KEYS  *  
1) "teacher" 
2) "k1" 
3) "k2" 
4) "k3" 
5) "v1" 
6) "v5" 
127.0.0.1:6379>set v22 5 
OK
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
(3)查看当前数据库中以v 开头的数据
127.0.0.1:6379>KEYS v*    
1) "v1" 
2) "v5" 
3) "v22"
  • 1.
  • 2.
  • 3.
  • 4.


(4)查看当前数据库中以v 开头后面包含任意一位的数据
127.0.0.1:6379>KEYS v?   
1) "v1" 
2) "v5"
  • 1.
  • 2.
  • 3.


(5)查看当前数据库中以v 开头v 开头后面包含任意两位的数据
127.0.0.1:6379>KEYS v??   
1) "v22"
  • 1.
  • 2.
2:exists

exists 命令可以判断键值是否存在。

127.0.0.1:6379>exists teacher 
(integer) 1
  • 1.
  • 2.


127.0.0.1:6379>exists tea 
(integer) 0
  • 1.
  • 2.


结果为1,表示 teacher 键是存在,结果为0,表示 tea 键不存在

3:del

del 命令可以删除当前数据库的指定key

127.0.0.1:6379>keys * 
1) "teacher" 
2) "v1" 
3) "v22" 
4) "k3" 
5) "k1" 
6) "k2" 
7) "v5"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.


127.0.0.1:6379> del v5 
(integer) 1 
127.0.0.1:6379>get v5 
(nil)
  • 1.
  • 2.
  • 3.
  • 4.


4:type

使用type 命令可以获取key 对应的value 值类型

127.0.0.1:6379>type k1 
string
  • 1.
  • 2.


redis支持的数据类型:

String(字符串):最简单的类型,就是普通的set和get,作key value缓存。 

Hash(哈希):类似map的一种结构,一般就是可以将结构化的数据,比如一个对象给缓存在redis里

List(列表):List是有序列表,可以通过list存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西

Set(集合):Set是无序集合,自动去重。

Sorted Set(无序集合):Sorted Set是排序的set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。

5:rename

rename 命令是对已有key 进行重命名

在实际使用过程中,建议先用exists 命令查看目标key 是否存在,然后再决定是否执行rename 命令,以避免覆盖重要数据。

127.0.0.1:6379>keys v* 
1) "v1" 
2) "v22" 
127.0.0.1:6379>rename v22 v2 
OK
127.0.0.1:6379>keys v* 
1) "v1" 
2) "v2" 
127.0.0.1:6379>get v1 
"4" 
127.0.0.1:6379>get v2 
"5" 
127.0.0.1:6379>rename v1 v2 
OK
127.0.0.1:6379>get v1 
(nil) 
127.0.0.1:6379>get v2 
"4"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.


6:renamenx

enamenx 命令的作用是对已有key 进行重命名,并检测新名是否存在。

使用renamenx 命令进行重命名时,如果目标key 存在则不进行重命名

127.0.0.1:6379>keys * 
1) "teacher" 
2) "k3" 
3) "k1" 
4) "k2" 
5) "v2" 
127.0.0.1:6379>get teacher 
"zhanglong" 
127.0.0.1:6379>get v2 
"4" 
127.0.0.1:6379>renamenx v2 teacher
(integer) 0 
127.0.0.1:6379>keys * 
1) "teacher" 
2) "k3" 
3) "k1" 
4) "k2" 
5) "v2" 
127.0.0.1:6379>get teacher 
"zhanglong" 
127.0.0.1:6379>get v2 
"4
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
7:dbsize

dbsize 命令的作用是查看当前数据库中key 的数目。

127.0.0.1:6379> dbsize 
(integer) 5
  • 1.
  • 2.

四:多数据库常用命令

1:多数据库间切换

Redis 在没有任何改动的情况下默认包含16 个数据库,数据库名称是用数字0-15 来依次命名的

(1)切换至序号为10 的数据库
127.0.0.1:6379>select 10 
OK
  • 1.
  • 2.
(2)切换至序号为15 的数据库
127.0.0.1:6379[10]>select 15 
OK
  • 1.
  • 2.
(3)切换至序号为0 的数据库
127.0.0.1:6379[15]>select 0
  • 1.
2:多数据库间移动数据

Redis 的多数据库在一定程度上是相对独立的,例如在数据库0 上面存放k1 的数据,在其它1-15 的数据库上是无法查看到的。

127.0.0.1:6379>set k1 100 
OK
127.0.0.1:6379>get k1 
"100" 
127.0.0.1:6379>move k1 1 	//将数据库0 中k1 移动到数据库1 中
(integer) 1 
127.0.0.1:6379>select 1 		//切换至目标数据库1 
OK
127.0.0.1:6379[1]>get k1 		//查看被移动数据
"100" 
127.0.0.1:6379[1]> select 0 
OK
127.0.0.1:6379> get k1 		//在数据库 0 中无法查看到 k1 的值 
(nil)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
3:清除数据库内数据

清空当前数据库数据,使用FLUSHDB

命令实现;清空所有数据库的数据,使用FLUSHALL 命令实现

五:Redis持久化

Redis 的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个 append only file(aof)里面(这称为“全持久化模式”)。

由于Redis 的数据都存放在内存中,如果没有配置持久化,Redis 重启后数据就全丢失了。所以,需要开启Redis 的持久化功能,将数据保存到磁盘上,当Redis 重启后,可以从磁盘中恢复数据。Redis 提供两种方式进行持久化,一种是RDB(Redis DataBase) 持久化(原理是将Reids在内存中的数据库记录定时dump 到磁盘上的RDB 持久化),另外一种是AOF(append only file)持久化(原理是将Reids 的操作日志以追加的方式写入文件)。

1:RDB 和AOF 的区别

RDB是默认采用的方法,RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。触发机制:手动触发分别对应为save和bgsave命令

2:RDB的优缺点

优点:

RDB是一个紧凑压缩的二进制文件,代表Redis在某一个时间点上的数据快照。非常适用于备份,全量复制等场景,redis加载RDB恢复数据远远快于AOF方式。

RDB的缺点:

RDB方式数据没办法做到实时持久化/秒级持久化。频繁执行成本过高。

RDB文件使用特定的二进制格式保存,存在老版本Redis服务无法兼容新版RDB格式的问题

AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流

二者选择的标准:

牺牲一些性能,换取更高的缓存一致性(AOF),

写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save 的时候,再做备份(RDB)

3:Redis 持久化配置
(1)RDB 持久化配置
[root@localhost ~]# vim /etc/redis/6379.conf 

打开6379.conf 文件之后,搜索save,可以看到如下所示配置信息。
save 900 1:在900(15 分钟)之后,如果至少有1 个key 发生变化,则dump内存快照。
save 300 10:在300(5 分钟)之后,如果至少有10 个key 发生变化,则dump内存快照。
save 60 10000:在60(1 分钟)之后,如果至少有10000 个key 发生变化,则dump 内存快照。
dbfilename dump.rdb:RDB文件名称		##254行
dir /var/lib/redis/6379:RDB文件路径		##264行
rdbcompression yes:是否进行压缩		##242
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
(2)AOF 持久化配置

在Redis 的配置文件中存在三种同步方式,它们分别是:

appendonly yes:开启AOF持久化(默认为no)		##673行
appendfilename "appendonly.aof ":AOF文件名称		##677# appendfsync always
appendfsync everysec
# appendfsync no
always:同步持久化,每次发生数据变化会立刻写入磁盘
everysec:默认推荐,每秒异步记录一次(默认值)
no:不同步,交给操作系统决定如何同步

 aof-load-truncated yes  	##769行
忽略最后一条可能存在问题的指令

[root@localhost ~]#/etc/init.d/redis_6379 restart
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.


六:性能管理

1:查看内存信息
192.168.9.236:7001> info memory

used_memory:1210776 #已经内存使用的大小,以字节为单位
used_memory_human:1.15M # 带单位展示,以M为单位
used_memory_rss:7802880 # 从操作系统角度看redis内存占用多少
used_memory_rss_human:7.44M # 带单位展示
maxmemory:1073741824 # 最大内存大小
maxmemory_human:1.00G # 带单位展示
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
2:回收策略

maxmemory-policy:回收策略

volatile-lru:它允许Redis 从整个数据集中挑选最近最少使用的key 进行删除
volatile-ttl:按照key的过期时间进行淘汰 
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰;
allkeys-lru:使用LRU 算法从所有数据集合中淘汰数据;
allkeys-random:从数据集合中任意选择数据淘汰;
noeviction:禁止淘汰数据(默认值)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

设置key的过期时间

expire v1 10

v1的过期时间为10秒

redis设置密码

一、设置方法

方法一:通过配置文件redis.conf设置密码

 找到requirepass关键字,后面就是跟的密码,默认情况下是注释掉的,即默认不需要密码,如下:

NoSQL与Redis配置与优化_redis_02

 打开注释,设置为自己的密码,重启即可

方法二:通过命名设置密码

使用redis-cli连接上redis,执行如下命令:

config set requirepass 123456
  • 1.

执行完毕,无需重启,退出客户端,重新登录就需要输入密码了

二,连接方法
1、连接时输入密码
[root@localhost bin]# ./redis-cli -a 123456
  • 1.
2、先连接再输入密码
[root@localhost bin]# ./redis-cli127.0.0.1:6379> auth 123456
  • 1.
三、关闭方法
[root@localhost bin]# ./redis-cli -a 123456 shutdown
  • 1.
四、区别

 1)修改配置文件设置的密码永久生效;使用命令设置的密码临时生效,重启后失效

 2)修改配置文件设置的密码,需要重启生效;使用命令设置的密码,退出后再登录生效,重启后失效

 3)命令的优先级高于配置文件的优先级