Redis安装配置及整合SpringBoot的方法
Redis安装配置及整合SpringBoot的方法
这篇文章主要介绍“Redis安装配置及整合SpringBoot的方法”,在日常操作中,相信很多人在Redis安装配置及整合SpringBoot的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis安装配置及整合SpringBoot的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
安装 Redis
#下载Rediswgethttps://download.redis.io/releases/redis-6.0.9.tar.gz#解压redistar-zxvfredis-6.0.9.tar.gz#安装gcc环境,安装过忽略yum-yinstallgcc-c++cdredis-5.0.5#安装make&&makeinstall
Redis 配置启动脚本
#拷贝utils目录下的redis_init_script到/etc/init.d目录下redis_init_script是启动脚本cputils/redis_init_script/etc/init.dcd/etc/init.dvim/etc/init.d/redis_init_script#-----------------redis_init_scriptstart---------------#!/bin/sh##SimpleRedisinit.dscriptconceivedtoworkonLinuxsystems#asitdoesuseofthe/procfilesystem.###BEGININITINFO#Provides:redis_6379#Default-Start:2345#Default-Stop:016#Short-Description:Redisdatastructureserver#Description:Redisdatastructureserver.Seehttps://redis.io###ENDINITINFO#redis默认端口REDISPORT=6379#redis默认启动redis-server位置EXEC=/usr/local/bin/redis-server#redisredis-cli位置CLIEXEC=/usr/local/bin/redis-cli#redispid位置拼接了默认端口参数。PIDFILE=/var/run/redis_${REDISPORT}.pid#redis默认配置的conf配置文件CONF="/usr/local/redis/conf/redis.conf"#$1参数为start或者stopcase"$1"instart)if[-f$PIDFILE]thenecho"$PIDFILEexists,processisalreadyrunningorcrashed"elseecho"StartingRedisserver..."$EXEC$CONFfi;;stop)if[!-f$PIDFILE]thenecho"$PIDFILEdoesnotexist,processisnotrunning"elsePID=$(cat$PIDFILE)echo"Stopping..."$CLIEXEC-p$REDISPORTshutdownwhile[-x/proc/${PID}]doecho"WaitingforRedistoshutdown..."sleep1doneecho"Redisstopped"fi;;*)echo"Pleaseusestartorstopasfirstargument";;esac#-----------------redis_init_scriptend---------------#保存之后启动redis./redis_init_scriptstart#停止redis./redis_init_scriptstop
配置Redis 开启自启动
#在以下位置加上一段注释#!/bin/sh##SimpleRedisinit.dscriptconceivedtoworkonLinuxsystems#asitdoesuseofthe/procfilesystem.###BEGININITINFO#Provides:redis_6379#Default-Start:2345#Default-Stop:016#Short-Description:Redisdatastructureserver#Description:Redisdatastructureserver.Seehttps://redis.io###ENDINITINFO#chkconfig:223451090#desccription:StartandStopredis:wq!#保存#注册redis到开机自启动chkconfigredis_init_scripton
Redis 配置文件解析
#设置后台运行yes后台运行,no前台运行daemonizeyes#pidfilepid目录文件pidfile/var/run/redis_6379.pid#dirredis的工作空间。必须写一个目录。不能写一个文件名dir/usr/local/redis/working#bind哪些ip地址可以访问redis-server0.0.0.0任何地址都可以访问bind0.0.0.0#requirepass设置redis链接密码requirepass584521
SpringBoot 整合 Redis
引入依赖
<dependency><goupId>org.springframework.boot</goupId><artifactId>spring-boot-starter-data-redis</aartifactId></dependency>
配置 redis
spring:redis:database:0#数据库host:127.0.0.1#redis地址port:6379#redis端口password:584521#redis密码
接口测试
@ApiIgnore@RestController@RequestMapping("redis")publicclassRedisController{@AutowiredprivateRedisTemplateredisTemplate;@GetMapping("/set")publicObjectset(Stringkey,Stringvalue){redisTemplate.opsForValue().set(key,value);return"ok";}@GetMapping("get")publicObjectget(Stringkey){Objectvalue=redisTemplate.opsForValue().get(key);returnvalue;}@GetMapping("delete")publicObjectdelete(Stringkey){redisTemplate.delete(key);return"ok";}}
redis 默认使用的 JDK 的序列化机制
Redis 持久化机制
Redis RDB 机制 Redis DataBase
每隔一段时间,把内存中的数据写入到磁盘的临时文件,作为快照。恢复的时候把快照文件读进内存。如果 redis 宕机重启,那么内存中的数据肯定会没有的。 重启 redis 时。从 RDB 文件中读取恢复数据
#打开redis.conf文件vimredis.conf#redis工作空间dir/usr/local/redis/working#rdb持久化文件名dbfilenamedump.rdb#save保存到硬盘。多少时间内发生了多少次改变save9001save30010save6010000#stop-writes-on-bgsave-error保存时,发生错误停止写入操作stop-writes-on-bgsave-erroryes#rdbcompression压缩rdb文件如果像节省cpu性能开销。就可以关闭nordbcompressionyes#rdbchecksum压缩rdb文件以后。是否要检验rdb文件。会有百分之10的性能损耗rdbchecksumyes
RDB 优点
全量备份
可以远程传输
子进程备份时,主进程不会有IO操作。
RDB 缺点
rdb 持久化会有一个触发机制。如果最后的数据没有还没有触发保存。那么就有可能会导致 redis 宕机重启后,导致数据不一致
Redis AOF 机制 Append Only File
Redis 默认使用的是RDB模式作为持久化操作
关于 AOF 的配置名称
#选择是否开启aofappendonlyyes#appendfilename配置aof持久化文件的名称appendfilename"appendonly.aof"#appendfsyncaof文件的同步策略。always针对每一次的写操作。资源占用比较大。,erverysec每秒同步一次no永不同步appendfsynceverysec#no-appendfsync-on-rewrite重写的时候可以不做同步。如果是yes有可能会导致文件内容的不一致性bi-appendfsync-on-rewriteno#auto-aof-rewrite-percentage100aof文件增长比例,指当前aof文件比上次重写的增长比例大小。aof重写即在aof文件在一定大小之后,重新将整个内存写道aof文件当中,以反应最新得状态这样就避免了文件过大而实际内存数据小的问题。(频繁修改问题)auto-aof-rewrite-percentage100#auto-aof-rewrite-min-size64mbaof文件重写最小得文件大小。即最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了,根据上一次重写完成之后的大小。此变量仅仅只有初始化启动redis时有效,如果是redis恢复时,则lastSize等于初始aof文件大小。auto-aof-rewrite-min-size64mb#aof-load-truncated指redis在恢复时,会忽略最后一条可能存在问题的指令。默认值yes。即在aof写入时,可能存在指令写错的问题(突然断电,写了一半),这种情况下,yes会log并继续,而no会直接恢复失败.aof-load-truncatedyes
不小心使用了 flushdb , flushall 。 我们可以停止 redis-server, 打开 aof 文件。 将 flushdb flushall 这种命令直接删除。重启 redis 服务
RDB 和 AOF 可以同时使用, 加载顺序,先加载 AOF 再加载 RDB
Redis 主从架构
原来的单个Redis作为一个主 (Master),多个从 (Slave) 。读写分离架构。 主作为写库, 从作为读库,也就是说写操作操作 Mater, 大多数读操作用 Slave 。Slave 会对 Mater 做一个全量复制的数据。
Master 先启动,随后启动 Slave , 然后 Slave 会去 ping Master 节点,ping 通知后。 Master 会将数据提交给 Slave。Master 的数据复制是全量复制。
Master 会从内存中拷贝所有的 数据生成RDB文件。然后通过网络传输给我们的 Slave 节点。
Slave 拿到 RDB 文件后,会先下载到自己的硬盘中,然后再加载到 Slave 中。 这只是一个第一次启动时的操作
后续操作 Master 会直接传输给 Slave 节点。 传输操作并不会阻塞写操作
配置 一主二从机制,需要先准备三台Redis 机器 一台主,两台从
#启动Redis-cliredis-cli#查看Redis角色信息inforeplication#Replicationrole:master#当前redis角色connected_slaves:0#当前redis连接数量master_replid:9d6bd1e0965ba650aed518034318a11c243c2d8cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0
#replicaof<masterip><masterport>主库ip,主库端口号replicaof192.168.1.1916379#masterauth<master-password>主库redis密码masterauth584521#replica-read-onlyyes配置从主只能够读不能写数据replica-read-onlyyes#停止redis服务./redis_init_scriptstop#删除dump.rdb和aof文件rm-rfdump.rdb*.aof#启动redis服务./redis_init_scriptstart
#replicaof<masterip><masterport>主库ip,主库端口号replicaof192.168.1.1916379#masterauth<master-password>主库redis密码masterauth584521#replica-read-onlyyes配置从主只能够读不能写数据replica-read-onlyyes#停止redis服务./redis_init_scriptstop#删除dump.rdb和aof文件rm-rfdump.rdb*.aof#启动redis服务./redis_init_scriptstart
Disk-backed : Redis 会创建一个进程。 会写入一个文件到硬盘,然后将硬盘传输到 Redis Slave 节点上。
Diskless: Redis 会创建一个进程,会将 RDB 文件写入到 socket 连接中,不会接触到磁盘。 可以通过 socket 传输. Redis 会在 Slave 都连接上的一段时间后, 然后将 socket 传输到 多个 Slave 节点上。
全部启动成功之后,通过
info replication
命令查看各个 Redis 的角色状态。无磁盘化复制
#当磁盘很慢,但是网络环境又很不错。那么就可以使用无磁盘化传输repl-diskless-syncno#配置slave连接上多久后,才开始通过socket传输。repl-diskless-sync-delay5
配置 从 Redis Slave 第二台
配置 从 Redis , Slave 第一台
主 Redis Master
Redis 缓存过期处理和内存淘汰机制
主动定时删除
#每秒钟检查10次hz10
定时随机的检查过期的key,如果过期则清理删除。(每秒检查次数在redis.conf中的hz配置)
被动惰性删除
当客户端请求一个已经过期的key的时候,那么redis会检查这个key是否过期,如果过期了,则删除,然后返回一个nil。这种策略 友好,不会有太多的损耗,但是内存占用会比较高。
Redis 内存满了怎么办
#maxmemory<byte>配置redis一共能占用多少内存单位bytemaxmemory2048
如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。
如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最久没有访问的数据最先被置换(淘汰)。
LRU(The Least Recently Used,最近最久未使用算法)是一种常见的缓存算法,在很多分布式缓存系统(如Redis, Memcached)中都有广泛使用。
LFU(Least Frequently Used ,最近最少使用算法)也是一种常见的缓存算法。
Redis 提供了以下多种淘汰机制
#volatile-lru->EvictusingapproximatedLRUamongthekeyswithanexpireset.#allkeys-lru->EvictanykeyusingapproximatedLRU.#volatile-lfu->EvictusingapproximatedLFUamongthekeyswithanexpireset.#allkeys-lfu->EvictanykeyusingapproximatedLFU.#volatile-random->Removearandomkeyamongtheoneswithanexpireset.#allkeys-random->Removearandomkey,anykey.#volatile-ttl->Removethekeywiththenearestexpiretime(minorTTL)#noeviction->Don'tevictanything,justreturnanerroronwriteoperations.
maxmemory 内存达到多少的时候。表示内存已经满了
Redis 哨兵模式
原来一主二从里面, Master 节点一旦宕机。 我们就无法写入数据了。因为主节点宕机。从节点无法写入数据。只可以读取数据。
配置 Redis 压缩包中的 sentinel.conf 文件
#开启保护模式后绑定ip哪个ip才能够连接#bind127.0.0.1#yes开启绑定模式,。no不开启protected-modeno#端口号port26379#daemonize是否开启后台daemonizeyes#pid文件位置。和redis不是同一个进程pidfile/var/run/redis-sentinel.pid#配置sentinel的日志文件logfile/usr/local/redis/logs/sentinel/redis-sentinel.log#dirsentinel的工作空间dir/usr/local/redis/sentinel#sentinelmonitor<master-group-name><ip><port><quorum>配置监听的master名称、以及ip地址,端口号。sentinelmonitorxh-master192.168.1.19163792#sentinelauth-passmymasterMySUPER--secret-0123passw0rdsentinelauth-passxh-master584521#sentineldown-after-milliseconds<master-name><milliseconds>master名称。哨兵认为master失败的时间段sentineldown-after-millisecondsxh-master10000#sentinelparallel-syncs<master-name><numslaves>master名称以及同时需要同步几个slave节点的数据。sentinelparallel-syncsxh-master1#sentinelfailover-timeout<master-name><milliseconds>master名称。故障转移超时时间。sentinelfailover-timeoutxh-master180000
下面可以直接将 sentinel 直接复制到其他两台 Redis 节点上
scp./sentinel.confroot@192.168.1.192:/usr/local/redis/scp./sentinel.confroot@192.168.1.193:/usr/local/redis/
启动 Redis-sentinel 哨兵
#启动时会报一个错误redis-sentinel#说Sentinel没有指定配置文件6031:X08Nov21:12:20.727#Sentinelstartedwithoutaconfigfile.Exiting...#指定配置文件启动redis-sentinel/usr/local/redis/sentinel.conf安装此方式启动slave1和slave2
启动完成后, 当我们手动停止掉 redis-server 服务后。redis 哨兵,会在剩余的两个 slave 节点中。选举出一个 master 节点。
当原来的master 节点重新启动之后, master 并不是master 节点了。已经转变为 slave 节点了。可以通过
info replication
4-4解决原Master恢复后不同步问题在本节课中,相信细心的同学会发现原来的Master(191)恢复成Slave后,他的同步状态不OK,状态为master_link_status:down,这是为什么呢?这是因为我们只设置了192和193的masterauth,这是用于同步master的数据,但是191一开始是master是不受影响的,当master转变为slave后,由于他没有auth,所以他不能从新的master同步数据,随之导致inforeplication的时候,同步状态为down,所以只需要修改redis.conf中的masterauth为584521一般master数据无法同步给slave的方案检查为如下:1.网络通信问题,要保证互相ping通,内网互通。2.关闭防火墙,对应的端口开发(虚拟机中建议永久关闭防火墙,云服务器的话需要保证内网互通)。3.统一所有的密码,不要漏了某个节点没有设置。#查看xh-master下的master节点信息sentinelmasterxh-master#查看xh-master下的slaves节点信息sentinelslavesxh-master#查看xh-master下的哨兵节点信息sentinelsentinelsxh-master
Redis 使用 哨兵模式整合 SpringBoot 中
配置 ymal 文件
spring:redis:database:1password:584521sentinel:master:xh-master#配置master的名称nodes:192.168.1.191:26379,192.168.1.192:26379,192.168.1.193:26379#配置redis哨兵的端口号以及ip
Redis Cluster集群
是单个master容量有限,数据达到一定程度会有瓶颈,这个时候可以通过水平扩展为多master 集群。
redis-cluster:他可以支撑多个master-slave,支持海量数据,实现高可用与高并发。 哨兵模式其实也是一种集群,他能够提高读请求的并发,但是容错方面可能会有一些问题,比如master同步数据给slave的时候,这其实是异步复制吧,这个时候 了,那么slave上的数据就没有master新,数据同步需要时间的,1-2秒的数据会丢失。master恢复并转换成slave后,新数据则丢失。
每个节点知道彼此之间的关系,也会知道自己的角色,当然他们也会知道自己存在与一个集群环境中,他们彼此之间可以交互和通信, ong。那么这些关系都会保存到某个配置文件中,每个节点都有,这个我们在搭建的时候会做配置的。
客户端要和集群建立连接的话,只需要和其中一个建立关系就行。
某个节点挂了,也是通过超过半数的节点来进行的检测,客观下线后主从切换,和我们之前在哨兵模式中提到的是一个道理。
Redis中存在很多的插槽,又可以称之为槽节点,用于存储数据,这个先不管,后面再说。
搭建 Redis-cluster 集群
修改 201 节点下 Redis 配置文件
#开启cluster集群yes开启,no关闭cluster-enabledyes#cluster-config-filenodes-6379.confcluster-config-filecluster节点配置文件cluster-config-filenodes-6379.conf#cluster-node-timeout15000配置redis-cluster超时时间cluster-node-timeout1500#开启aof持久化appendonlyyes#修改万配置文件后。删除aof和rbd文件如果不删除可能就会报错rm-rf*.aofrm-rf*.rdb#停止redis/etc/init.d/redis_init_scriptstop#启动redis/etc/init.d/redis_init_scriptstart
重复操作 202, 203, 204, 205, 206
通过 redis-cli 创建 cluster 集群
#如果设置密码了记得设置密码redis-cli-a584521--clustercreate192.168.1.201:6379192.168.1.202:6379192.168.1.203:6379192.168.1.204:6379192.168.1.205:6379192.168.1.206:6379--cluster-replicas1
以上就是 三主三从的关系了。 M 为 master . S 为 Slave 。 205 分配到 201 , 206 分配到 202 。 204 分配到 203
#上面最后会询问你是否要配置该集群了CanIsettheaboveconfiguration?(type'yes'toaccept):yes
检查 cluster 集群信息
redis-cli-a584521--clustercheck192.168.1.201:6379
Redis Slots 概念
一共是有 16384 个槽节点分配
[OK]All16384slotscovered
如何分配的槽节点呢
将 16384 平均分配给三个Master
槽 slot 如何存储
redis 会对每个存储的数据的 key 进行一个 hash 然后对 16384 取模 , 计算公式
hash(key) % 16384
进入到集群的控制台
#查看集群的信息redis-cli-c-a584521-h192.168.1.202-p6379#查看节点的信息clusternodes
Redis SpringBoot 中整合 Cluster 集群
配置 yaml 文件
spring:redis:password:584521cluster:nodes:192.168.1.201:6379192.168.1.202:6379192.168.1.203:6379192.168.1.204:6379192.168.1.205:6379192.168.1.206:6379
缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,比如说发起一个 id 为 ‘-1’ 的数据, 或者 id 特别大 又不存在的数据。 这时因为缓存中没有数据,就会导致每一次的请求都会落在数据库上。导致数据库压力过大。
接口层增加校验,如用户鉴权校验,对请求参数做逻辑校验
从缓存中取不到的数据,在数据库中也取不到的数据。 这个时候也可以写入到缓存中。k - null 的方式。 缓存有效期设置短点。 如果设置的过长,就会导致正常情况无法使用。
缓存击穿
缓存击穿是指缓存中没有,但是数据库中有的数据,一般是 缓存时间到期,这个时候由于并发用户过多, 同时缓存没有读到数据,导致请求全部落在数据库中,造成数据库压力过大。
设置热点数据永不过期
加锁去读。对 key 加锁。 当缓存中拿不到数据的时候。放开一个线程去数据库中去读数据。
缓存雪崩
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
如果缓存数据库是分布式部署,将热点数据均匀分布在不同缓存数据库中。
设置热点数据永远不过期。
到此,关于“Redis安装配置及整合SpringBoot的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注恰卡编程网网站,小编会继续努力为大家带来更多实用的文章!
推荐阅读
-
vue动态添加删除输入框(springboot vue怎么让数据库显示出来)
springbootvue怎么让数据库显示出来?一般情况下是前端调阅后端接口,来获取到数据库的数据,后端哪里会把数据库的数据整理...
-
php如何让Swoole/Pool进程池实现Redis持久连接
php如何让Swoole/Pool进程池实现Redis持久连接本篇...
-
php操作redis大全记录
php连接redis测试˂?php$redis=newRedis();$redis-˃conne...
-
PHP经典高级工程师面试题
1.PHP如何实现不用自带的cookie函数为客户端下发cookie。对于分布式系统,如何来保存session值...
-
PHP操作Redis数据库
-
php利用redis防止商品超发来限制抢购,简单又实用
-
php如何实现秒杀功能?php+redis模拟简单抢购场景,快来看看吧
-
PHP高级工程师面试题
-
Laravel结合Redis发送邮箱验证码
-
使用redis缓存实现多服务器PHP sessions共享