Bootstrap

Redis 配置与优化

一、关系型数据库与非关系型数据库

(一)关系型数据库

关系型数据库是结构化数据库,创建在关系型模型数据库,创建面向于记录。

常见的关系型数据库:Oracle、MySQL、SQL  Server、Microsoft  Access、DB2。

(二)非关系型数据库

NOSQL=Not  Only SQL是非关系型数据库的总称。根据存储方式,存储结构及使用场景的不同,称为非关系型数据库。除主流关系型数据库以外的数据库,都可以称为非关系型数据库。

常见非关系型数据库:Redis、MongoDB,Hbase、CouhDB。

二、Redis基础

(一)Redis简介

Redis是一款开源,使用c语言编写的Nosql数据库,基于内存运行并支持持久化,采用key-value(键值对)的存储形式。其端口号是6379。

(二)Redis优点

  1. 具有较高的数据读写速度。
  2. 支持丰富的数据类型。key-value,strings,lists,hashes,sets,ordered sets。
  3. 支持数据的持久化。数据保存在磁盘中,重启可以加载使用。
  4. 原子性。
  5. 支持数据备份。

三、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 值;

  1. 四、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 提供两种方式进行持久化,一种是 RDBRedis DataBase 持久化(原理是将 Reids在内存中的数据库记录定时转储(dump) 到磁盘上的 RDB 持久化),另外一种是 AOFappend 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,从数据集中删除

;