Redis概述

1、redis是什么:
 redis的出现时间并不长,是NoSQL中的一种,基于键-值型的存储,与memcached类似,但是memcache只是内存的缓存,而redis不仅是内存中的缓存,还提供持久存储,在2009年第一次发布redis。
 
 redis全称(REmote DIctionary Server)远程字典服务器,而这个字典服务器从本质上来讲,只要是提供数据结构的远程存储功能的,可以理解为redis是一个高级的key-value存储,和数据结构存储,因为redis处理能够存储key-value这种简单的数据之外,还能存储列表、字典、hash表等对应的数据结构。
 
 在性能上redis不比mencache差,因为redis整个运行通通都是在内存中实现的,它的所有的数据集都是保存在内存中,内存中的数据会周期性的写入到磁盘上,已实现数据的持久功能,而这种写磁盘并不是访问,而仅是冗余功能,所以redis所有功能都在内存中完成,因此磁性能也是可想而知。
 
 redis和memcache不同之处在于redis有一个周期性的将数据保存到磁盘上的机制,而且不止一种,有两种机制,这也是redis持久化的一种实现,另外与memcache有所区别的是,redis是单线程服务器,只有一个线程响应所有的请求。
 
 redis也支持主从模式,但是redis的主从模式默认就有一个sentinel工具,从而实现主从架构的高可用,也就是说,redis能够借助与sentinel工具来监控主从节点,当主节点发生故障时,会自己提升另外一个从节点称为新的主节点。

在redis3.0版本发布,开始支持redis集群,从而可以实现分布式,可以将用户的请求分散至多个不同节点。

2、redis所支持的数据类型

支持存储的数据类型有:
string(字符串,包含整数)
list(列表)
hash(关联数组)
sets(集合)
sorted  sets(有序集合)
bitmps(位图)
hyperloglog

3、redis性能评估

(1)100万较小的键存储字符串,大概消耗100M内存
(2)由于redis单线程,如果服务器主机上有多个cpu,只有一个能够使用,但并不意味着cpu会成为瓶颈,因为redis是一个比较简单的key-value数据存储,cpu通常不会成为瓶颈的
(3)在常见的linux服务器上,500K(50万)的并发,只需要一秒中处理,如果主机硬件较好的情况下,每秒钟可以达到上百万的并发

4、redis优点:

丰富的(资料形态)操作
内建replication和culster(自身支持复制及集群功能)
支持就地更新(in-place  update)操作,直接可以在内存中完成更新操作
支持持久化(磁盘)
避免雪崩效应,万一出现雪崩效应,所有的数据都无法恢复,但redis由于有持久性的数据,可以实现恢复

           Redis存储

    redis使用了两种文件格式:全量数据和增量请求。

        全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;

        增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。


安装redis


yum安装:

NAT模式  挂载光盘  释放网络源 关闭防火墙

yum install epel-release -y   yum添加epel源

yum install redis -y    安装redis

vi /etc/redis.conf

image.png

image.png

开启客户端要确保服务端启动: 

redis-server /etc/redis.conf

redis-server -v 查看版本

image.png

image.png


源码编译

软件包

 wget 

 tar xf redis-5.0.0.tar.gz -C /opt/

yum install gcc gcc-c++ make -y

yum install -y tcl

cd /opt/redis-5.0.0/

make distclean    清理缓存

make   编译

make install  PREFIX=/usr/local/redis       安装

--

redis-benchmark : 用于测试redis的性能。

redis-check-aof : 当aof备份文件被损坏,可通过该工具对aof文件进行修复,使用方式:redis-check-aof --fix 要修复的aof文件。
redis-check-rdb : 修复损坏的rdb备份文件。
redis-cli : redis客户端,用于连接服务端。
redis-server : redis服务器端,用于启动redis服务器。
redis-sentinel : 哨兵模式(实际使用较多) 在master-slave模式下(slave默认不支持写),当master出现异常时,自动在slave中选择一台作为master。
连接上redis服务器后,可通过指令“info”查看redis服务器信息,也可查看服务器知道内容信息,例如:info replication 查看主从相关信息

--

ln -s /usr/local/redis/bin/* /usr/local/bin/     做软连接

image.png

mkdir /etc/redis    创建redis目录

mkdir /var/redis

cd /var/redis

mkdir data log run   创建dump file 目录,log目录,进程pid目录

cp /opt/redis-5.0.0/redis.conf   /etc/redis

vi /etc/redis/redis.conf    修改redis配置文件

修改成以下内容:

69行   bind 0.0.0.0    设置监听ip地址

92行   port 6379   监听端口,默认6379端口

158行  pidfile /var/redis/run/redis.pid     指定pid文件

263行  dir /var/redis/data     指定dump的目录

171行   logfile "/var/redis/log/redis.log"   指定日志文件

136行   daemonize yes    使得redis在background运行

redis-server /etc/redis/redis.conf    开启redis服务

redis-cli shutdown    关闭redis服务

redis-cli    客户端连接redis

127.0.0.1:6379>  set foo bar      写入标题foo,内容为bar

OK
127.0.0.1:6379> get foo    查看foo的内容
"bar"
127.0.0.1:6379>

image.png


手动添加系统服务启动文件

vi /usr/lib/systemd/system/redis.service

[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]

ExecStart=/usr/local/redis/bin/redis-server   /etc/redis.conf   --supervised  systemd
ExecStop=/usr/local/redis/bin/redis-cli  shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]

WantedBy=multi-user.target

useradd -r redis  -s /sbin/nologin

systemctl  daemon-reload    重新加载Unit文件
systemctl  start redis  


redis配置文件基本操作

1、redis配置文件:/etc/redis/redis.conf

daemonize  no  #表示redis并不会运行成为一个守护进程。
port  6379    #监听端口:6379/tcp
tcp-backlog   511    #指定tcp-backlog长度,backlog是一个等待队列。
bind   127.0.0.1      #监听地址。多个地址使用空格分隔
# unixsocket   /tmp/redis.sock    #指定使用sock文件通信及sock文件的位置,如果服务端和客户端在一台主机上,建议打开

#  unixsocketperm    700  #定义sock文件的访问权限

timeout  0     #表示当客户端连接成功后,空闲多长时间则链接超时,0表示不启用此功能。

tcp-keepalive   0   #定义是否启用tcp-keepalive功能

loglevel  notice    #定义日志级别
logfile   /var/log/redis/redis.log    #定义日志文件
databases  16  #定义redis默认有多少个databases,但在分布式中,只能使用一个 0  0-15

####SNAPSHOTTING####   #定义RDB的持久化相关

save  <seconds> <changes>   #使用save指令,指定每隔多少秒,如果发生多打变化,进行存储

save  60  10

####REPLICATION####     #配置主从相关

#slaveof  <masterip>  <masterport>  #此项不启用,则为主,如果启动则为从,但是需要指明主服务器的ip,端口

3.x 4.x适用

replicaof 5.x

#masterauth  <master-password>   #如果主服务设置了密码认证,那么从的则需要启用此项,指明主的认证密码

slave-read-only   yes   #定义从服务对主服务是否为只读(仅复制)

####LIMITS####    #定义与连接和资源限制相关的配置

# maxclients    10000    #定义最大连接限制(并发数)
#maxmemory <bytes>   #定义使用主机上的最大内存,默认关闭

####APPEND ONLY  MODE####   #定义AOF的持久化功能相关配置,一旦有某一个键发生变换,将修改键的命令附加到命令列表的文件中,类似于MySQL二进制日志

appendonly   no   #定义是否开启此功能

说明:RDB和AOF两种持久功能可以同时启用,两者不影响


登陆redis

命令如下:

 redis-cli   -h

常用选项:

 -h  指定主机ip
 -p   指定端口
 -s   指定socket文件通信,服务端和客户端在同一台主机上
 -a   指定认证密码
 -r   连接成功后指定运行的命令N次
 -i  连接成功后每个命令执行完成等待时间


redis登入之后基本操作

帮助:help  

说明:redis的help命令非常强大,因为redis支持众多的数据结构,每一种数据结构当中都支持N种操作,因此需要使用

help  @group方式来获取某一种数据结构所支持的操作。

help  命令   #获取单个命令的使用方法

image.png

查看都有哪些组:

使用TAB键,每按一次轮换一次,带有@则为一个组,不带@则为命令使用

切换库(空间)

select   1  #表示切换到1号库中,默认0号库,共16个,0-15

键的遵循:

可以使用ASCII字符
键的长度不要过长,键的长度越长则消耗的空间越多
如果在同一个库中(空间),键的名称不的重复,如果复制键的名称,实际上是修改键中的值
在不同的库中,键的名称可以重复
键可以实现自动过期

1、string的操作

set  key    value 

set key  value  NX

NX,如果一个键不存在,则创建该键,否则不允许创建

XX,如果一个键存在则设置键的值,如果不存在则不创建
EX,表示过期时间

获取键的值:get   <key>

添加键中的值(在原有键中附加值的内容)

append  <key>   <value>

获取指定键的值的字符串长度:

strlen   <key>

增加键中的整数值:

incr   <key>
注:只能对整数使用

删除键:

del   <key>

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

2、列表的操作:

键指向一个列表,而列表可以理解为一个字符串的容器,里列表是由众多元素组成的集合,可以在键所指向的列表中附加一个值

操作:

LPUSH    #在键所指向的列表前面插入一个值(最左边加入)
RPUSH    #在键所指向的列表后面插入一个值(最右边加入)
LPOP       #在键所指向的列表前面弹出一个值(最左边弹出)删除
RPOP       #在键所指向的列表后面弹出一个值(最右边弹出)
LINDEX    #根据索引获取值,指明索引位置进行获取对应的值
LSET         #用于修改指定索引的值为指定的值

指定一个新的列表,在帮助中并没有说明那个命令用于创建一个新的列表,实际上创建一个新的列表使用LPUSH或RPUSH都可以

例子:LPUSH  ll   abc   

            LINDEX  ll   0
         LSET  ll  0  123

image.png

image.png

image.png

3、认证方法:

在配置文件中vi /etc/redis/redis.conf:

requirepass  密码    #开启此项

image.png

pkill -9 redis

redis-server /etc/redis/redis.conf

redis-cli

auth   密码    #连接redis成功后,在交互界面

image.png

4、清空数据库:

(1)清空当前库的值:
FLUSHDB
(2)清空所有库
FLUSHALL

image.png


redis持久化

1、概述:
默认情况下,redis工作时所有数据集都是存储于内存中的额,不论是否有磁盘上的持久化数据,都是工作于内存中,redis本身就是一个内存的数据库,把所有数据库相关的存储都存储在内存中,如果redis崩溃或断电导致所有数据丢失,所以redis提供了持久化功能来保证数据的可靠性,redis持久化有两种,RDB和AOF

2、RDB

存储为二进制格式的数据文件,默认启动的持久化机制,按事先定制的策略,周期性地将数据保存至磁盘,使用save命令即可设定周期和策略即可;

数据文件默认为dump.rdb,客户端连接服务器以后可以用去使用sava命令进行保存数据至磁盘

保存快照有两种方式:

1、客户端也可显示使用save或bgsave命令启动快照保存机制;
2、借助于配置文件所定义的save和策略进行保存

save:同步保存,在客户端使用save保存快照时,是在redis主线程中保存快照;因为redis的主线程是用于处理请求的,所以此时会阻塞所有客户端请求,每次的保存快照都是吧内存中的数据完整的保存一份,并非是增量的,如果内存中的数据比较大,而还有大量的写操作请求时,此方式会引起大量的I/O,会导致redis性能下降。

BGSAVE:异步方式,将立即返回结果,但自动在后台保持操作,所以BGSAVE命令启动以后,前提不会被占用,客户端的请求也不会被阻塞(主进程不会被阻塞)

如果在配置文件中定义的save,那么redis在持久化的时候,则会开启另外的进程去处理,不会阻塞redis的主进程。

redis的RDB持久化不足之处则是,一旦数据出现问题,由于RDB的数据不是最新的,所以基于RDB恢复过来的数据一定会有一部分数据丢失,也就是RDB保存之后的修改的数据会丢失

3、AOF

append  only  file,有着更好的持久化能力的解决方案,AOF类似于MySQL的二进制日志,记录每一次redis的写操作命令,以顺序I/O方式附加在指定文件的尾部,是使用追加方式实现的,这也叫做一种附加日志类型的持久化机制,由于每一次的操作都记录,则会随时间长二增大文件的容量,并且有些记录的命令是多余的,AOF不像RDB,RDB是保存数据集的本身。

但是redis进程能够自动的去扫描这个对应的AOF文件,把其redis中一些冗余的操作给合并一个,已实现将来一次性把数据恢复,也就是说AOF的持久化文件,由BGREWRITEAOF命令来实现,BGREWRITEAOF命令是工作于后台的重写AOF 文件的命令,重写后redis将会以快照的方式将内存中的数据以命令的方式保存在临时文件中,最后替换原来的文件。

4、配置文件中RDB相关的参数:

stop-writes-on-bgsave-error  yes   #在进行快照备份时,一旦发生错误的话是否停止写操作

rdbcompression  yes   #RDB文件是否使用压缩,压缩会消耗CPU

rdbchecksum  yes    #是否对RDB文件做校验码检测

dbfilename    dump.rdb  #定义RDB文件的名称

dir  /var/lib/redis      #定义RDB文件存放的目录路径

5、配置文件中的与AOF相关的参数

appendonly  no    #定义是否开启AOF功能,默认为关闭
appendfilename   "appendonly.aof"   #定义AOF文件
appendfsync   always    #表示每次收到写命令时,立即写到磁盘上的AOF文件
appendfsync  everysec   #表示每秒钟写一次
appendfsync  no   #表示append功能不会触发写操作,所有的写操作都提交OS
no-appendfsync-on-rewrite   no    #当此项为yes时,表示在重写,对于新的写操作不做同步,而暂时存在内存中
auto-aof-rewrite-percentage  100   #表示当前AOF文件的大小是上次重写AOF文件的二倍时,则自动日志重写过程
auto-aof-rewrite-min-size  64mb  #定义aof文件重写过程的条件,最少为定义大小则触发终于过程。

注:持久化本省不能取代备份,还应该指定备份策略,对redis数据库定期进行备份

5、RDB与AOF同时启用:

(1)BGSAVE和BGREWRITEAOF不会同时执行,为了避免对磁盘的I/O影响过大,在某一时刻只允许一者执行。
如果BGSAVE在执行当中,而用户手动执行BGREWRITEAOF时,redis会立即返回OK,但是redis不会同时执行,会等BGSAVE执行完成,再执行BGREWRITEAOF
(2)在redis服务器启动用于恢复数据时,会优先使用AOF