NoSQL之Redis配置与优化

目录

一:关系型数据库和非关系型数据库

关系型数据库

非关系型数据库

非关系型数据库的产生背景

Redis简介

Redis安装部署

1:安装

2:查看进程

3:服务控制

4:配置参数的修改

二:Redis 命令工具

1:redis-cli 命令行工具

三:Redis 数据库常用命令

1.key 相关命令

(1)添加键值对

(2)查看当前数据库中所有键

(3)查看当前数据库中以 v 开头的数据

(4)查看当前数据库中以 v 开头后面包含任意一位的数据

(5)查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据

2:exists

3:del

4:type

5:rename

6:renamenx

7:dbsize

2. 多数据库间切换

3:多数据库间移动数据

4:清除数据库内数据

四: Redis 持久化

1:RDB 和 AOF 的区别

(1)RDB是什么?

(2)RDB的优缺点:

二、AOF是什么

3:Redis 持久化配置

(1)RDB 持久化配置

(2)AOF 持久化配置

五:性能管理

1:查看内存信息

2:回收策略


一:关系型数据库和非关系型数据库


关系型数据库

        一个结构化的数据库,创建在关系模型基础上一般面向于记录包括
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,从数据集中删除

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值