一、关系型数据库与非关系型数据库
(一)关系型数据库
关系型数据库是结构化数据库,创建在关系型模型数据库,创建面向于记录。
常见的关系型数据库:Oracle、MySQL、SQL Server、Microsoft Access、DB2。
(二)非关系型数据库
NOSQL=Not Only SQL是非关系型数据库的总称。根据存储方式,存储结构及使用场景的不同,称为非关系型数据库。除主流关系型数据库以外的数据库,都可以称为非关系型数据库。
常见非关系型数据库:Redis、MongoDB,Hbase、CouhDB。
二、Redis基础
(一)Redis简介
Redis是一款开源,使用c语言编写的Nosql数据库,基于内存运行并支持持久化,采用key-value(键值对)的存储形式。其端口号是6379。
(二)Redis优点
- 具有较高的数据读写速度。
- 支持丰富的数据类型。key-value,strings,lists,hashes,sets,ordered sets。
- 支持数据的持久化。数据保存在磁盘中,重启可以加载使用。
- 原子性。
- 支持数据备份。
三、redis安装
1. 安装Redis
[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
注意:
在make之后会产生错误信息,
解决方案:
解决方法1:用make MALLOC=libc指定内存分配器为 libc进行编译
解决方法2:make clean && make distclean
[root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install
[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost redis-4.0.9]# cd utils/
其中:install_server.sh 是初始化脚本
[root@localhost utils]# ./install_server.sh
Please select the redis executable path [] /usr/local/redis/bin/redis-server (给予可执行的路径)
查看进程及服务控制
[root@localhost utils]# netstat -anpt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5360/redis-server 1
[root@localhost utils]# /etc/init.d/redis_6379 stop (redis关闭)
[root@localhost utils]# /etc/init.d/redis_6379 start (开启)
[root@localhost utils]# /etc/init.d/redis_6379 status (状态)
配置参数的修改
[root@localhost ~]#vim /etc/redis/6379.conf
bind 127.0.0.1 192.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
2.redis 命令工具
[root@localhost utils]# redis-cli (本机登录)
[root@localhost utils]# redis-cli -h 192.168.10.101 -p 6379 (远程登陆)
192.168.10.101:6379> ping (检测服务正常运行)
PONG
3:redis-benchmark 测试工具
redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能。
- -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。仅显示 query/sec 值;
- --csv:以 CSV 格式输出;
- -l:生成循环,永久执行测试;
- -t:仅运行以逗号分隔的测试命令列表;
- -I:Idle 模式。仅打开 N 个 idle 连接并等待。
-
(1)测试请求性能
[root@localhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -c 100 -n 100000
备注:
-h:指定服务器主机名;
-
-p:指定服务器端口;
-c:指定并发连接数;
-n:指定请求数;
(2)测试存取性能
[root@localhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -q -d 100
备注:
-h:指定服务器主机名;
-p:指定服务器端口;
-d:以字节的形式指定 SET/GET 值的数据大小;
-q:强制退出 redis。仅显示 query/sec 值;
-
四、Redis数据库常用命令
set 存放数据 命令格式 set key value
get 获取数据 命令格式 get key
(一)key相关命令
1.添加键值对
127.0.0.1:6379> set 1 1
OK
127.0.0.1:6379> set 2 2
OK
127.0.0.1:6379> set 3 3
OK
2. 查看数据库中所有值
127.0.0.1:6379> keys *
1) "3"
2) "1"
3) "2"
3.查看数据库中以v开头的数据
127.0.0.1:6379>KEYS v*
4.查看数据库中以v开头的任意一位数据
127.0.0.1:6379>KEYS v?
5.查看当前数据库中以 v 开头的后面包含任意两位的数据
127.0.0.1:6379>KEYS v??
(二)exists
判断该值是否存在。
127.0.0.1:6379>exists f5 判断 f5 是否存在
(integer) 1 结果为1,表示 f5 键是存在
若
(integer) 0 结果为0,表示 f5 键不存在
(三)del
del 命令可以删除当前数据库的指定 key
127.0.0.1:6379> del v5 删除数据库中v5
(integer) 1
127.0.0.1:6379>get v5
(nil)
(四)type
使用 type 命令可以获取 key 对应的 value 值类型
127.0.0.1:6379>type k1
string
备注:
redis支持的数据类型
- String:字符串,是最简单的类型,就是普通的set和get,作key value缓存。
- Hash:散列算法,类似map的一种结构,一般就是可以将结构化的数据,比如一个对象给缓存在redis里
- List:List是有序列表,可以通过list存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西
- Set:Set是无序集合,自动去重。
- Sorted Set:Sorted Set是排序的set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。
(五)rename
rename 命令是对已有 key 进行重命名
在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据。
127.0.0.1:6379>rename v22 v2 把 v22 重命名为 v2
OK
(六)renamenx
renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在。
使用renamenx 命令进行重命名时,如果目标 key 存在则不进行重命名。
(七)dbsize
dbsize 命令的作用是查看当前数据库中 key 的数目。
127.0.0.1:6379> dbsize
(integer) 5
五、多数据库常用命令
(一)多数据库之间切换
Redis 在没有任何改动的情况下默认包含 16 个数据库,数据库名称是用数字 0-15 来依次命名的
(1)切换至序号为 10 的数据库
127.0.0.1:6379>select 10
OK
(2)切换至序号为 15 的数据库
127.0.0.1:6379[10]>select 15
OK
(3)切换至序号为 0 的数据库
127.0.0.1:6379[15]>select 0
(二)多数据库之间移动数据
127.0.0.1:6379>set k1 100 在数据库0创建 k1
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)
(三)清除数据库内的数据
清空当前数据库数据,使用 FLUSHDB
命令实现;清空所有数据库的数据,使用 FLUSHALL 命令实现。
六、Redis 持久化
Redis 的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个 append only file(aof)里面(这称为“全持久化模式”)。
由于 Redis 的数据都存放在内存中,如果没有配置持久化,Redis 重启后数据就全丢失了。所以,需要开启 Redis 的持久化功能,将数据保存到磁盘上,当 Redis 重启后,可以从磁盘中恢复数据。Redis 提供两种方式进行持久化,一种是 RDB(Redis DataBase) 持久化(原理是将 Reids在内存中的数据库记录定时转储(dump) 到磁盘上的 RDB 持久化),另外一种是 AOF(append only file)持久化(原理是将 Reids 的操作日志以追加的方式写入文件)。
RDB与AOF的区别
ROB在指定时间间隔内将数据快照写入磁盘,是fork的一个子进程,先将数据写入临时文件夹,成功之后将替换之前文件,用二进制压缩储存。
AOF以日志形式记录服务器每一个写,删除操作。查询操作不会记录,以文本的方式记录。
RDB和AOF优缺点
RDB优点:
RDB是一个紧凑压缩的二进制文件,代表Redis在某一个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份,并把RDB文件拷贝到远程机器或者文件系统中,用于灾难恢复。
恢复数据速度快。
性能最大化
启动效率高
RDB缺点:
宕机之前没有保存的数据会丢失。
RDB通过fork子进程协助完成,消耗资源
AOF优点:
数据的持久性较高
在append模式下,出现宕机也不会破坏日志文件内容。
可以启动rewrite机制,保护数据安全性。
AOF缺点:
AOF恢复数据速度慢
AOF运行效率较低
二者选择的标准:
牺牲一些性能,换取更高的缓存一致性(AOF),
写操作频繁的时候,不启用备份来换取更高的性能,待手动运行 save 的时候,再做备份(RDB)
备注:
如果redies重启之后,需要加载一个持久化文件,优先会选择AOF文件。
如果先开启了RDB,再开启AOF,RDB先执行了持久化,那么RDB文件中的内容会被AOF覆盖掉。
七、Redis 持久化的配置
(一)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行
(二)AOF 持久化配置
在 Redis 的配置文件中存在三种同步方式,它们分别是:
- appendonly yes 开启AOF持久化(默认为no) ##673行
- appendfilename "appendonly.aof " AOF文件名称 ##677行
- # appendfsync always
- appendfsync everysec
- # appendfsync no
always:同步持久化,每次发生数据变化会立刻写入磁盘 ##702行
everysec:默认推荐,每秒异步记录一次(默认值)
no:不同步,交给操作系统决定如何同步
- aof-load-truncated yes ##769行
忽略最后一条可能存在问题的指令
[root@localhost ~]#/etc/init.d/redis_6379 restart
八、性能问题
(一)查看内存信息
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 带单位展示
(二)回收策略
maxmemory-policy:回收策略
volatile-lru:它允许 Redis 从整个数据集中挑选最近最少使用的 key 进行删除
volatile-ttl:按照key的过期时间进行淘汰
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰;
allkeys-lru:使用 LRU 算法从所有数据集合中淘汰数据;
allkeys-random:从数据集合中任意选择数据淘汰;
noeviction:禁止淘汰数据(默认值)
设置key的过期时间
127.0.0.1:6379> expire v1 10 v1的过期时间为10秒
备注:
当 Redis 由于内存压力需要回收一个 key 时,Redis 首先考虑的不是回收最旧的数据,而是在最近最少使用的 key 或即将过期的 key 中随机选择一个 key,从数据集中删除