目录
(5)查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据
一:关系型数据库和非关系型数据库
关系型数据库
一个结构化的数据库,创建在关系模型基础上一般面向于记录包括
Oracle、MySQL、SQL Server、Microsoft Access、DB2等
非关系型数据库
包括主流的关系型数据库外的数据库,都认为是非关系型
包括Redis、MongoDB、Hbase、CouhDB
非关系型数据库的产生背景
High perfoermance——对数据库高并发读写需求
High Storage——对海量数据高效存储和访问需求
High Scalability && High Availability——对数据库高可扩展性与高可用性需求
Redis简介
基于内存运行并支持持久化
采用key-value(键值对)的存储形式
优点
具有极高的数据读写速度
支持丰富的数据类型
支持数据的持久化
原子性
支持数据备份
Redis安装部署
1:安装
[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
[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
备注:
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 //客户端命令行工具
2:查看进程
[root@localhost utils]# netstat -anpt | grep redis
3:服务控制
[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
4:配置参数的修改
[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
[root@localhost utils]# netstat -anpt | grep redis
二:Redis 命令工具
- redis-server:用于启动 Redis 的工具;
- redis-benchmark:用于检测 Redis 在本机的运行效率;
- redis-check-aof:修复 AOF 持久化文件;
- redis-check-rdb:修复 RDB 持久化文件;
- redis-cli:Redis 命令行工具。
1:redis-cli 命令行工具
(1)连接本机redis
[root@localhost ~]# redis-cli
127.0.0.1:6379>
(2)远程连接
[root@localhost ~]#redis-cli -h 192.168.10.101 -p 6379
三:Redis 数据库常用命令
set:存放数据,基本的命令格式为 set key value。
get:获取数据,基本的命令格式为 get key。
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
(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
(3)查看当前数据库中以 v 开头的数据
127.0.0.1:6379>KEYS v*
1) "v1"
2) "v5"
3) "v22"
(4)查看当前数据库中以 v 开头后面包含任意一位的数据
127.0.0.1:6379>KEYS v?
1) "v1"
2) "v5"
(5)查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据
127.0.0.1:6379>KEYS v??
1) "v22"
2:exists
exists 命令可以判断键值是否存在
127.0.0.1:6379>exists teacher
(integer) 1
结果为1,表示 teacher 键是存在
127.0.0.1:6379>exists tea
(integer) 0
结果为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"
127.0.0.1:6379> del v5
(integer) 1
127.0.0.1:6379>get v5
(nil)
4: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,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。
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"
6:renamenx
renamenx 命令的作用是对已有 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"
7:dbsize
dbsize 命令的作用是查看当前数据库中 key 的数目。
127.0.0.1:6379> dbsize
(integer) 5
2. 多数据库间切换
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
3:多数据库间移动数据
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>select 1
OK
127.0.0.1:6379[1]>get k1
(nil)
127.0.0.1:6379[1]>select 0 //切换至目标数据库 0
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)
4:清除数据库内数据
清空当前数据库数据,使用 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 的区别
(1)RDB是什么?
默认采用的方法
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。
触发机制:手动触发分别对应为save和bgsave命令
save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较多的实例会造成时间阻塞。线上环境不建议使用。
bgsave命令:Redis进程执行fork(用于创建进程的函数)操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段。
(2)RDB的优缺点:
RDB的优点:
RDB是一个紧凑压缩的二进制文件,代表Redis在某一个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份,并把RDB文件拷贝到远程机器或者文件系统中,用于灾难恢复。
Redis加载RDB恢复数据远远快于AOF方式。
RDB的缺点:
RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都有执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。
RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。
二、AOF是什么
AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流
二者选择的标准:
牺牲一些性能,换取更高的缓存一致性(AOF),
写操作频繁的时候,不启用备份来换取更高的性能,待手动运行 save 的时候,再做备份(RDB)
备注:
如果redies重启之后,需要加载一个持久化文件,有限会选择AOF文件。
如果先开启了RDB,再开启AOF,RDB先执行了持久化,那么RDB文件中的内容会被AOF覆盖掉。
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行
(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:查看内存信息
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 # 带单位展示
2:回收策略
- maxmemory-policy:回收策略
- volatile-lru:它允许 Redis 从整个数据集中挑选最近最少使用的 key 进行删除
- volatile-ttl:按照key的过期时间进行淘汰
- volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰;
- allkeys-lru:使用 LRU 算法从所有数据集合中淘汰数据;
- allkeys-random:从数据集合中任意选择数据淘汰;
- noeviction:禁止淘汰数据(默认值)
备注:
设置key的过期时间
expire v1 10
v1的过期时间为10秒
备注:
当 Redis 由于内存压力需要回收一个 key 时,Redis 首先考虑的不是回收最旧的数据,而是在最近最少使用的 key 或即将过期的 key 中随机选择一个 key,从数据集中删除