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的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注恰卡编程网网站,小编会继续努力为大家带来更多实用的文章!

发布于 2022-03-29 22:27:33
收藏
分享
海报
0 条评论
28
上一篇:Docker安装Redis的方法 下一篇:springboot中RedisTemplate如何使用
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码