分布式缓存中间件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集成redis8 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.多级缓存。