分布式缓存中间件redis应用

1 nosql数据库简介

        NoSQL是 Not Only SQL 的缩写,意即"不仅仅是SQL"的意思,泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。

NoSQL产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品性能

NoSQL产品redis、mongodb、 Membase、HBase 。

2 redis简介

Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis与其他 key - value 缓存产品有以下三个特点:

1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

3.Redis支持数据的备份,即master-slave模式的数据备份。

3 redis linux安装(安装方式1)

第一步:上传压缩包到服务器(我的位置是/data/soft)解压。

第二步:安装插件 yum install gcc

第三步:进入解压缩的文件目录 看到有Makefile。

和nginx一样,也是先make编译然后再make install 安装。

列表

make 

make install 

安装成功了

安装成功

第四步:更改配置

将启动文件拷贝到init.d    cp ../utils/redis_init_script /etc/init.d/

创建redis配置文件夹        mkdir /usr/local/redis -p

将配置文件拷贝过去         cp /data/soft/redis-5.0.5/redis.conf /usr/local/redis/

编辑配置文件: 

将daemonize的值改为yes

将bind 127.0.0.1 改为bind 0.0.0.0

添加 working 持久化工作空间(可以理解为oracle的workspace)

mkdir /usr/local/redis/working -p

添加工作空间

添加redis连接密码

添加连接密码

修改启动文件里面redis配置文件的路劲

vi  /etc/init.d/redis_init_script

修改配置文件的路径

在启动脚本中加上密码配置:

-a "password"

添加密码


第五步: 启动redis

为启动脚本添加权限  : chmod 777 redis_init_script 

启动redis:   ./redis_init_script start

停止redis:   ./redis_init_script stop

添加权限并启动

查看端口是否已经启动

已经启动redis

查看redis是否存活命令

redis-cli -a "abc123" ping  ---abc123 是redis 密码

返回 Pong 结果表示成功!

redis是否存活

第六步:设置redis开机自启

在启动脚本中加上:

#chkconfig: 22345 10 90

#description: Start and Stop redis

添加如图信息

然后执行注册脚本命令:

chkconfig redis_init_script on

4 redis linux 安装(安装方式2)

yum -y install gcc automake autoconf libtool make 

# wget https://github.com/antirez/redis/archive/3.2-rc1.tar.gz

# tar zxvf 3.2-rc1.tar.gz

# cd redis-3.2-rc1

# make MALLOC=libc

# cd src

# make install PREFIX=/usr/local/redis

# mkdir /usr/local/redis/etc

# cp ../redis.conf /usr/local/redis/etc

#cp /usr/local/redis/bin/* /usr/bin/

# vi /usr/local/redis/etc/redis.conf

将daemonize的值改为yes

将bind 127.0.0.1 改为bind 0.0.0.0

启动redis

# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

# redis-cli -h 127.0.0.1

尝试链接redis试试

5 redis 客户端命令基本使用

启动客户端输入界面 redis-cli 

输入密码  auth abc123 

redis-cli

然后就可以存取删值了

命令增删改

6 redis的数据类型

6.1 String 字符串

String字符串

6.2 hash

hash 是存储对象类型的数据的。类似如图

hash 类型

6.3 list 

list 类型

7 spring 集成 redis

第一步:引入pom 依赖

pom 依赖

第二步:更改配置文件

application.yml配置

第三步:测试类测试操作redis数据库。

如图:我们可以通过浏览器测试一下能否存储查询和删除值。

代码
测试SpringBoot集成redis

8 redis 的持久化机制

        redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复。

redis有RDB和AOF两种持久化机制:目前生产环境为了达到数据的安全性一般都两者都用,混合持久化。

8.1 RDB模式

原理:在指定时间间隔内,把当前数据生成dump.rdb的文件二进制中快照保存在磁盘上。恢复时直接将文件直接读取到内存中来恢复数据。redis会单独fork一个子进程来进行持久化,会先将数据写入一个临时文件中,等持久化好了以后再用这个临时文件替换上次持久化好的文件,在这个过程中只有子进程来进行IO操作,主进程任然处理客户端请求,所以保证了极高的性能,但是要预留出足够的磁盘空间。

操作:我们可以在redis的配置文件进行配置来实现RDB持久化配置。

RDB 持久化配置

每900秒至少有一个key改变,触发一次数据快照。

每300秒至少有10个key改变,触发一次数据快照。

每60有10000个key改变,触发数据快照。

优点:

1.如果要进行大规模数据的恢复,RDB方式要比AOF方式恢复速度要快。

2.RDB可以最大化Redis性能,父进程做的就是fork子进程,然后继续接受客户端请求,让子进程负责持久化操作,父进程无需进行IO操作。

3.RDB是一个非常紧凑(compact)的文件,它保存了某个时间点的数据集,非常适合用作备份,同时也非常适合用作灾难性恢复,它只有一个文件,内容紧凑,通过备份原文件到本机外的其他主机上,一旦本机发生宕机,就能将备份文件复制到redis安装目录下,通过启用服务就能完成数据的恢复。

缺点:

1.RDB这种持久化方式不太适应对数据完整性要求严格的情况,因为,尽管我们可以用过修改快照实现持久化的频率,但是要持久化的数据是一段时间内的整个数据集的状态,如果在还没有触发快照时,本机就宕机了,那么对数据库所做的写操作就随之而消失了并没有持久化本地dump.rdb文件中。

2.每次进行RDB时,父进程都会fork一个子进程,由子进程来进行实际的持久化操作,如果数据集庞大,那么fork出子进程的这个过程将是非常耗时的,就会出现服务器暂停客户端请求,将内存中的数据复制一份给子进程,让子进程进行持久化操作。

8.2 AOF模式

原理:以日志的形式记录Redis每一个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件不可以改写文件,redis启动之后会读取appendonly.aof文件来实现重新恢复数据,完成恢复数据的工作。默认是不开启的。

操作:需要将redis.conf中的appendonly  no改为yes启动Redis。

AOF 配置

appendfsync always:每修改同步,每一次发生数据变更都会持久化到磁盘上,性能较差,但数据完整性较好。

appendfsync everysec: 每秒同步,每秒内记录操作,异步操作,如果一秒内宕机,有数据丢失。默认是这个。

appendfsync no:不同步。

优点:

1.可以保持更高的数据完整性,如果设置的是1s,那么最多丢失这1s的数据。

2.redis可以在AOF文件体积变得过大的时候自动对AOF进行重写。

缺点:同样大小的数据AOF日志文件比RDB文件庞大并且AOF速度比较慢。

9 redis主从复制(读写分离)

        主从复制,是指将一台redis服务器的数据,复制到其他的redis服务器。前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

        由于redis的高性能,在应用中对其依赖很高,有时候一台redis服务器性能不够,需要配置redis集群。最简单的就是一台用来读,一台用来写。一般对读的需求比较大,所以可以配置一主(写)多从(读)。

主从复制

9.1 redis主从复制的配置

在配置redis主从复制的时候,主节点不需要修改。只需要更改从节点的redis.conf文件。

从节点配置:搜索到配置文件的REPLICATION模块如图配置 replicaof。

如果主节点有密码的话:往下加上 masterauth   abc123 将主节点的密码的配置也加上。

从节点配置

然后重启redis 后可以通过 info replication 来查看 主从节点的状态。

主节点上查看
从节点上查看

10 redis哨兵模式

        之前我们搭建了redis一主多从模式,若是redis master主节点挂了的话,那该怎么办呢。所以我们的哨兵模式就是解决master挂了的问题的。

        所谓哨兵模式就是:我们有哨兵来监控redis的主机情况,若是它挂了,我们就启用一个从机把它作为主节点,并且相应的配置文件也要更改掉。但是一个哨兵是不够的,万一哨兵也挂了,所以我们需要哨兵的集群。

哨兵模式

10.1 搭建哨兵模式

进入redis 解压缩的文件夹有个sentinel.conf 哨兵的配置文件夹。

把它拷贝: cp sentinel.conf /usr/local/redis 。

拷贝
配置哨兵文件

运行 redis-sentinel sentinel.conf

启动哨兵
启动成功

测试:我们手动将 101 主机redis 停掉 过一段时间查看从机信息发现 102 被选举成为master主节点了。

从机上看 102 成为了主节点

如果:master恢复以后,它会原恢复成master吗? 答案是否定的。它会变成一个从机。

主机重新启动变从机

10.2 springboot 集成哨兵模式

springboot集成redis哨兵

11 redis缓存穿透、雪崩 解决方案

缓存穿透:就是外界频繁的去请求一个不存在的数据,缓存里面没有,那么就会直接击穿去查询数据库。

解决方案:就是查出来即使是为空的我们也将其保存到缓存中去,给他设定一个过期时间。这样就会防止某一时刻大量的请求去穿透请求到数据库里面。:

缓存雪崩:在某一时刻,key值大量的过期导致缓存失效,在这个时刻大批量的数据请求来请求进来导致数据库压力过大。

解决方案:1.缓存不设置过期时间。2.缓存过期时间错峰。3.多级缓存。

你可能感兴趣的:(分布式缓存中间件redis应用)