21-Redis高级特性应用实践

最后

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

docker run -p 6380:6379 --name redis6380 \

-v /usr/local/docker/redis02/data:/data \

-v /usr/local/docker/redis02/conf/redis.conf:/etc/redis/redis.conf \

-d redis redis-server /etc/redis/redis.conf \

–appendonly yes

docker run -p 6381:6379 --name redis6381 \

-v /usr/local/docker/redis03/data:/data \

-v /usr/local/docker/redis03/conf/redis.conf:/etc/redis/redis.conf \

-d redis redis-server /etc/redis/redis.conf \

–appendonly yes

第三步 检测redis服务角色

启动三个客户端,分别登陆三台redis容器服务,通过info指令进行角色查看,默认新启动的三个redis服务角色都为master.

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:0

master_repl_offset:3860

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:3859

第四步:检测redis6379的ip设置

docker inspect redis6379

……

“Networks”: {

“bridge”: {

“IPAMConfig”: null,

“Links”: null,

“Aliases”: null,

“NetworkID”: “c33071765cb48acb1efed6611615c767b04b98e6e298caa0dc845420e6112b73”,

“EndpointID”: “4c77e3f458ea64b7fc45062c5b2b3481fa32005153b7afc211117d0f7603e154”,

“Gateway”: “172.17.0.1”,

“IPAddress”: “172.17.0.2”,

“IPPrefixLen”: 16,

“IPv6Gateway”: “”,

“GlobalIPv6Address”: “”,

“GlobalIPv6PrefixLen”: 0,

“MacAddress”: “02:42:ac:11:00:02”,

“DriverOpts”: null

}

}

第五步:设置Master/Slave架构

分别登陆redis6380/redis6381,然后执行如下语句

slaveof 172.17.0.2 6379

说明,假如master有密码,需要在slave的redis.conf配置文件中添加"masterauth 你的密码"这条语句,然后重启redis再执行slaveof 指令操作.

第六步:再次登陆redis6379,然后检测info

[root@centos7964 ~]# docker exec -it redis6379 redis-cli

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:2

slave0:ip=172.17.0.3,port=6379,state=online,offset=2004,lag=1

slave1:ip=172.17.0.4,port=6379,state=online,offset=2004,lag=1

master_failover_state:no-failover

master_replid:5baf174fd40e97663998abf5d8e89a51f7458488

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:2004

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:2004

第七步: 登陆redis6379测试,master读写都可以

[root@centos7964 ~]# docker exec -it redis6379 redis-cli

127.0.0.1:6379> set role master6379

OK

127.0.0.1:6379> get role

“master6379”

127.0.0.1:6379>

第八步: 登陆redis6380测试,slave只能读。

[root@centos7964 ~]# docker exec -it redis6380 redis-cli

127.0.0.1:6379> get role

“master6379”

127.0.0.1:6379> set role slave6380

(error) READONLY You can’t write against a read only replica.

127.0.0.1:6379>

Java中的读写测试分析,代码如下:

@SpringBootTest

public class MasterSlaveTests {

@Autowired

private RedisTemplate redisTemplate;

@Test

void testMasterReadWrite(){//配置文件端口为6379

ValueOperations valueOperations = redisTemplate.opsForValue();

valueOperations.set(“role”, “master6379”);

Object role = valueOperations.get(“role”);

System.out.println(role);

}

@Test

void testSlaveRead(){//配置文件端口为6380

ValueOperations valueOperations = redisTemplate.opsForValue();

Object role = valueOperations.get(“role”);

System.out.println(role);

}

}

主从同步原理分析


Redis的主从结构可以采用一主多从结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。

  • Redis全量同步:

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

1)从服务器连接主服务器,发送SYNC命令;

2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;

3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;

5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;

6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

  • Redis增量同步

Redis增量复制是指Slave初始化后,开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

小节面试分析


  • 如果redis要支持10万+的的并发你会怎么做?

单机的redis几乎不太可能说QPS超过10万+,除非一些特殊情况,比如你的机器性能特别好,配置特别高,物理机,维护做的特别好,而且你的整体的操作不是太复杂,一般的单机也就在几万。真正实现redis的高并发,需要读写分离。对缓存而言,一般都是用来支撑读高并发的,写的请求是比较少的,可能写请求也就一秒钟几千。读的请求相对就会比较多,例如,一秒钟二十万次读。所以redis的高并发可以基于主从架构与读写分离机制进行实现。

  • Redis的replication机制是怎样的?

(1)redis采用异步方式复制数据到slave节点。

(2)一个master node是可以配置多个slave node的。

(3)slave node也可以连接其他的slave node。

(4)slave node做复制的时候,是不会block master node的正常工作的。

(5)slave node在做复制的时候,也不会block对自己的查询操作,它会用旧的数据集来提供服务; 但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了。

(6)slave node主要用来进行横向扩容,做读写分离,扩容的slave node可以提高读的吞吐量。

Redis哨兵模式

===================================================================

简介


哨兵(Sentinel)是Redis的主从架构模式下,实现高可用性(high availability)的一种机制。

由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

基本架构


在这里插入图片描述

哨兵快速入门


第一步:分别进入3台redis容器内部进行配置,在容器指定目录/etc/redis创建sentinel.conf文件,文件内容为:

sentinel monitor redis6379 172.17.0.2 6379 1

其中, 如上指令表示要的监控的master, redis6379为服务名, 172.17.0.2和6379为master的ip和端口,1表示多少个sentinel认为一个master失效时,master才算真正失效.

假如,这里如果出现 bash: vi: command not found,可依次执行如下两个指令

1、apt-get update

2、apt-get install vim

第二步:在每个redis容器内部的/etc/redis目录下执行如下指令(最好是在多个客户端窗口执行),启动哨兵服务

redis-sentinel sentinel.conf

第三步:打开一个新的客户端连接窗口,关闭redis6379服务(这个服务是master服务)

docker stop redis6379

其它客户端窗口,检测日志输出,例如

410:X 11 Jul 2021 09:54:27.383 # +switch-master redis6379 172.17.0.2 6379 172.17.0.4 6379

410:X 11 Jul 2021 09:54:27.383 * +slave slave 172.17.0.3:6379 172.17.0.3 6379 @ redis6379 172.17.0.4 6379

410:X 11 Jul 2021 09:54:27.383 * +slave slave 172.17.0.2:6379 172.17.0.2 6379 @ redis6379 172.17.0.4 6379

第四步:登陆ip为172.17.0.4对应的服务进行info检测,例如:

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=172.17.0.3,port=6379,state=online,offset=222807,lag=0

master_failover_state:no-failover

master_replid:3d63e8474dd7bcb282ff38027d4a78c413cede53

master_replid2:5baf174fd40e97663998abf5d8e89a51f7458488

master_repl_offset:222807

second_repl_offset:110197

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:29

repl_backlog_histlen:222779

127.0.0.1:6379>

从上面的信息输出发现,redis6381服务现在已经变为master。

Sentinel 配置进阶


对于sentinel.conf文件中的内容,我们还可以基于实际需求,进行增强配置,例如:

sentinel monitor redis6379 172.17.0.2 6379 1

daemonize yes #后台运行

logfile “/var/log/sentinel_log.log” #运行日志

sentinel down-after-milliseconds redis6379 30000 #默认30秒

其中:

1)daemonize yes表示后台运行(默认为no)

2)logfile 用于指定日志文件位置以及名字

3)sentinel down-after-milliseconds 表示master失效了多长时间才认为失效

哨兵工作原理分析


1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。

2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值(这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒), 则这个实例会被 Sentinel 标记为主观下线。

3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。

4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。

5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 。

6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 。

7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。

8): 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

Redis集群高可用

====================================================================

简述


Redis单机模式可靠性保证不是很好,容易出现单点故障,同时其性能也受限于CPU的处理能力,实际开发中Redis必然是高可用的,所以单机模式并不是我们的终点,我们需要对目前redis的架构模式进行升级。

Sentinel模式做到了高可用,但是实质还是只有一个master在提供服务(读写分离的情况本质也是master在提供服务),当master节点所在的机器内存不足以支撑系统的数据时,就需要考虑集群了。

Redis集群架构实现了对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在这N个redis节点中,每个节点存储总数据的1/N。redis集群通过分区提供一定程度的可用性,即使集群中有一部分节点失效或无法进行通讯,集群也可以继续处理命令请求。

基本架构


对于redis集群(Cluster),一般最少设置为6个节点,3个master,3个slave,其简易架构如下:

在这里插入图片描述

创建集群


第一步:准备网络环境

创建虚拟网卡,主要是用于redis-cluster能于外界进行网络通信,一般常用桥接模式。

docker network create redis-net

查看docker的网卡信息,可使用如下指令

docker network ls

查看docker网络详细信息,可使用命令

docker network inspect redis-net

第二步:准备redis配置模板

mkdir -p /usr/local/docker/redis-cluster

cd /usr/local/docker/redis-cluster

vim redis-cluster.tmpl

在redis-cluster.tmpl中输入以下内容

port ${PORT}

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

cluster-announce-ip 192.168.227.131

cluster-announce-port ${PORT}

cluster-announce-bus-port 1${PORT}

appendonly yes

其中:

各节点解释如下所示:

  1. port:节点端口,即对外提供通信的端口

  2. cluster-enabled:是否启用集群

  3. cluster-config-file:集群配置文件

  4. cluster-node-timeout:连接超时时间

  5. cluster-announce-ip:宿主机ip

  6. cluster-announce-port:集群节点映射端口

  7. cluster-announce-bus-port:集群总线端口

  8. appendonly:持久化模式

第三步:创建节点配置文件

在redis-cluser中执行以下命令

for port in $(seq 8010 8015); \

do \

mkdir -p ./${port}/conf \

&& PORT= p o r t e n v s u b s t < . / r e d i s − c l u s t e r . t m p l > . / {port} envsubst < ./redis-cluster.tmpl > ./ portenvsubst<./rediscluster.tmpl>./{port}/conf/redis.conf \

&& mkdir -p ./${port}/data; \

done

其中:

  • for 变量 in $(seq var1 var2);do …; done为linux中的一种shell 循环脚本, 例如:

[root@centos7964 ~]# for i in $(seq 1 5);

do echo $i;

done;

1

2

3

4

5

[root@centos7964 ~]#

  • 指令envsubst <源文件>目标文件,用于将源文件内容更新到目标文件中.

通过cat指令查看配置文件内容

cat /usr/local/docker/redis-cluster/801{0…5}/conf/redis.conf

第四步:创建集群中的redis节点容器

for port in $(seq 8010 8015); \

do \

docker run -it -d -p p o r t : {port}: port:{port} -p 1 p o r t : 1 {port}:1 port:1{port} \

–privileged=true -v /usr/local/docker/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \

–privileged=true -v /usr/local/docker/redis-cluster/${port}/data:/data \

–restart always --name redis-${port} --net redis-net \

–sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \

done

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

image

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

image

2、Redis学习笔记及学习思维脑图

image

3、数据面试必备20题+数据库性能优化的21个最佳实践

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

{port}/data:/data \

–restart always --name redis-${port} --net redis-net \

–sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \

done

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

[外链图片转存中…(img-ryXfjN7J-1715786689293)]

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

[外链图片转存中…(img-QondMyCt-1715786689293)]

2、Redis学习笔记及学习思维脑图

[外链图片转存中…(img-HcF7Fhiu-1715786689293)]

3、数据面试必备20题+数据库性能优化的21个最佳实践

[外链图片转存中…(img-t9rxaryW-1715786689294)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值