关于redis-cluster:2022最新版-Redis大厂面试题总结附答案

专一于PHP、MySQL、Linux和前端开发,感兴趣的感激点个关注哟!!!文章已收录,次要蕴含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相干理论知识、面试题和实战内容。文章导语大家好,前段时间始终在忙找工作相干的事件。最近工作稳固了,于是把面试过程中遇到的Redis相干常识问题总结下来,心愿可能对大家面试、学习有所帮忙。本文重点分享数据类型,其余内容后续章节分享,也能够点击上方收录链接。 本系列面试题会从意识Redis、Redis几大数据类型、常见的应用场景和解决方案、Redis主从复制、Redis哨兵、Redis集群等相干知识点进行总结。不仅仅单纯的从文字方面终结,还会带有更多的图文方面,尽可能的让大家深刻的学习。 同时我也筹备了一份汇总纲要,绝对文字来说更加的清晰、明了。须要的小伙伴也能够回复Redis面试纲要。同时该系列问题也会一直的欠缺、更新。让大家学习到更多的常识。 意识RedisREmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的应用 ANSI C 语言编写、恪守 BSD 协定、反对网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis的数据类型都有哪些有五种根本数据类型,别离是string、hash、list、有序汇合(zset)、汇合(set)。在5.0之后减少了一种Stream类型。额定的有GEO、HyperLogLog、BitMap。Redis应用的场景有哪些数据缓存(用户信息、商品数量、文章浏览数量)音讯推送(站点的订阅)队列(削峰、解耦、异步)排行榜(积分排行)社交网络(独特好友、互踩、下拉刷新)计数器(商品库存,站点在线人数、文章浏览、点赞)基数计算GEO计算Redis性能特点都有哪些长久化丰盛的数据类型(string、list、hash、set、zset、公布订阅等)高可用计划(哨兵、集群、主从)事务丰盛的客户端提供事务音讯公布订阅GeoHyperLogLog事务分布式事务锁Redis如何实现分布式锁Redis能够应用setnx key value + expire key expire_time来实现分布式锁。失常状况下,下面的命令是没有问题的。当Redis出现异常的状况下,很容易呈现非原子性操作。非原子性操作指的的setnx命令执行胜利,然而expire没有执行胜利,此时key就成为了一个无过期工夫的key,始终保留在Redis中,导致其余的申请就无奈执行。要解决该问题,能够应用lua脚本实现。通过lua实现命令的原子性操作。 在Redis中应用set命令,加参数也能够实现分布式锁。set key vale nx ex|px ttl<!-- tabs:start --> 通过数组定义--- getLock keylocal key = KEYS[1]local requestId = KEYS[2]local ttl = tonumber(KEYS[3])local result = redis.call('setnx', key, requestId)if result == 1 then --PEXPIRE:以毫秒的模式指定过期工夫 redis.call('pexpire', key, ttl)else result = -1; -- 如果value雷同,则认为是同一个线程的申请,则认为重入锁 local value = redis.call('get', key) if (value == requestId) then result = 1; redis.call('pexpire', key, ttl) endend-- 如果获取锁胜利,则返回 1return result通过数组定义-- releaseLock keylocal key = KEYS[1]local requestId = KEYS[2]local value = redis.call('get', key)if value == requestId then redis.call('del', key); return 1;endreturn -1<!-- tabs:end --> ...

September 21, 2022 · 1 min · jiezi

关于redis-cluster:redis重新分片

为什么会呈现从新分片呈现上面状况后redis集群会从新进行分片: 有新的节点退出有节点须要下线某些节点数据分布不平均须要从新调整如何从新分片从新分片须要人工应用redis.trib工具,流程如下: 执行命令./redis-trib.rb reshard ip:port执行了这个命令之后,控制台会显示集群里所有节点信息,包含ip,port,每个节点负责的slots,每个节点的master/slave角色,及每个节点的ID。相似:$ ./redis-trib.rb reshard 127.0.0.1:7000Connecting to node 127.0.0.1:7000: OKConnecting to node 127.0.0.1:7002: OKConnecting to node 127.0.0.1:7005: OKConnecting to node 127.0.0.1:7001: OKConnecting to node 127.0.0.1:7003: OKConnecting to node 127.0.0.1:7004: OK>>> Performing Cluster Check (using node 127.0.0.1:7000)M: 9991306f0e50640a5684f1958fd754b38fa034c9 127.0.0.1:7000slots:0-5460 (5461 slots) masterM: 393c6df5eb4b4cec323f0e4ca961c8b256e3460a 127.0.0.1:7002slots:10922-16383 (5462 slots) masterS: 3375be2ccc321932e8853234ffa87ee9fde973ff 127.0.0.1:7005slots: (0 slots) slaveM: e68e52cee0550f558b03b342f2f0354d2b8a083b 127.0.0.1:7001slots:5461-10921 (5461 slots) masterS: 48b728dbcedff6bf056231eb44990b7d1c35c3e0 127.0.0.1:7003slots: (0 slots) slaveS: 345ede084ac784a5c030a0387f8aaa9edfc59af3 127.0.0.1:7004slots: (0 slots) slave[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.How many slots do you want to move (from 1 to 16384)? 1000同时还会询问咱们须要迁徙多少个slots,示例中咱们迁徙1000. ...

January 5, 2022 · 1 min · jiezi

关于redis-cluster:Rediscluster安装

1、装置前筹备redis cluster的装置的环境筹备,请先回顾单机版装置流程Redis单机装置(生产环境配置) 在每台服务器上配备好Redis实例。本次装置筹备三台服务器搭建三主个节点,三个从节点: 序号IP端口1172.17.73.23070012172.17.73.23070023172.17.73.23270034172.17.73.23270045172.17.73.23370056172.17.73.23370062、编写配置文件redis cluster 集群,要求至多3个master,去组成一个高可用,强壮的分布式集群,每个master都倡议至多给一个slave,3个master,3个slave起码要求。 正式环境下,倡议在6台服务器上搭建,至多3台。 保障每个master都和本人slave不在同一台服务器上,如果6台更好,一个master + slave. 本次3台服务器搭建6个实例的redis cluster 创立目录: mkdir -p /etc/redis-clustermkdir -p /var/log/redismkdir -p /var/redis/logredis.confg 批改 port 7001cluster-enabled yescluster-config-file /etc/redis-cluster/node-7001.confcluster-node-timeout 15000daemonize yespidfile /var/run/redis_7001.piddir /var/redis/7001logfile /var/log/redis/7001.log#本级IPbind 172.17.73.230 protected-mode no appendonly yes依照下面的配置批改将六个实例的配置文件筹备好后别离copy到对应服务器的地位: /etc/redis7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf筹备生产环境的启动脚本:在以下目录下别离寄存对应的启动脚本 /etc/init.d/redis_7001、redis_7002、redis_7003、redis_7004、redis_7005、redis_7006别离在启动六个redis实例 3、创立集群redis-cli --cluster create 172.17.73.230:7001 172.17.73.230:7002 172.17.73.232:7003 172.17.73.232:7004 172.17.73.233:7005 172.17.73.233:7006 --cluster-replicas 1提醒输出yes即可: 到这本次集群搭建就实现了。

April 16, 2021 · 1 min · jiezi

关于redis-cluster:中间件使用redis-cluster

没有用spring-data-redis,封装了service层,针对罕用操作实现了get,set,delete,hasKey,hget,hset,hdelete,lpush,rpop,ttl,publish等办法实现了分布式锁,分布式计数器,get后立刻生效,集群环境下执行lua脚本的命令 分布式锁:如果key在redis中存在,则获取失败返回false,否则设置该key及生效工夫,返回胜利。Redis操作为单线程,判断key是否存在及设置key应为一个原子操作,通过lua脚本实现。在分布式定时工作中抢锁执行定时工作有用到,定时工作在多个服务中启用,但同时只有抢到锁的那个服务能调用胜利,保障服务的冗余及同一时刻只有一个节点执行定时工作。分布式计数器:和分布式锁相似,如果key在redis中存在,则+1,否则设为1。该过程为原子操作。用于接口限流。get后立刻生效:和分布式锁相似,如果key在redis中存在,则删除,返回true,否则返回false。用于用户登录时校验图片验证码,校验后验证码立刻生效,进步脚本防御的难度。lua脚本执行办法。因为在集群环境下,key存储在不同节点,为确保lua脚本是一个原子操作,须要不同的key在同一节点执行。即lua脚本中的每个key前增加同一{xx},cluster分片时会依照xx进行hash分槽。反对同时连贯多个cluster,依据dbkey指定集群。为了将缓存隔离,搭建了多个redis集群,配置文件中通过dbkey辨别不同的集群。调用redisService办法时如果不指定dbkey则操作默认cluster,如果传入dbkey参数则操作指定cluster可按cluster增加对立前缀。因为测试环境分为sit,qa,uat,心愿应用同一套cluster,cluster没有单机db的概念,因而在配置cluster时,对立增加前缀sit,qa,uat进行辨别,调用redisService办法时主动增加。反对配置明码。可连贯配置和不配置明码的cluster,由配置文件决定

March 5, 2021 · 1 min · jiezi

关于redis-cluster:Redis-Cluster

MASTER yum install -y epel-releaseyum install -y redisvi /etc/redis.conf<code>bind 192.168.1.193protected-mode yesport 6379tcp-backlog 65535syslog-enabled yeslogfile /dev/nullmaxclients 51200timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /var/run/redis_6379.pidloglevel noticedatabases 16always-show-logo yesstop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir /var/lib/redisreplica-serve-stale-data yesreplica-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noreplica-priority 100lazyfree-lazy-eviction nolazyfree-lazy-expire nolazyfree-lazy-server-del noreplica-lazy-flush noappendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yesaof-use-rdb-preamble yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000stream-node-max-bytes 4096stream-node-max-entries 100activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit replica 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10dynamic-hz yesaof-rewrite-incremental-fsync yesrdb-save-incremental-fsync yes</code>redis-sentinelvi /etc/redis-sentinel.conf<code>port 26379bind LocalhostIPsyslog-enabled yesdir /tmp###监控mymaster主服务器,有2个sentinel主观认为master down,则批准master转移sentinel monitor mymaster MASTERIP 6379 2###在3000毫秒(3s)内无奈和master通信(ping或者info),则认为master downsentinel down-after-milliseconds mymaster 3000###这个配置项指定了在产生failover主备切换时最多能够有多少个slave同时对新的master进行同步,这个数字越小,实现failover所需的工夫就越长,然而如果这个数字越大###就意味着越多的slave因为replication而不可用。能够通过将这个值设为 1 来保障每次只有一个slave 处于不能解决命令申请的状态。sentinel parallel-syncs mymaster 1###同一个sentinel对同一个master两次failover之间的间隔时间###当一个slave从一个谬误的master那里同步数据开始计算工夫,直到slave被纠正为向正确的master那里同步数据时###当想要勾销一个正在进行的failover所须要的工夫。###当进行failover时,配置所有slaves指向新的master所需的最大工夫。不过,即便过了这个超时,slaves仍然会被正确配置为指向master,然而就不按parallel-syncs所配###置的规定来了。sentinel failover-timeout mymaster 180000</code>SLAVE装置redis,批改redis.conf配置文件,指向master进入集群执行slaveof 192.168.1.193 6379

February 23, 2021 · 1 min · jiezi

关于redis-cluster:k8s部署有状态应用rediscluster集群踩坑总结

redis-cluster集群的部署网上一堆,用k8s部署也不在少数,但都是抄来抄去,问题不少,实际操作分享进去的还是太少。1、redis启动配置文件,应用CofigMap来治理比拟不便,redis-config.yaml apiVersion: v1kind: ConfigMapmetadata: name: redis-config namespace: defaultdata: update-node.sh: | #!/bin/sh REDIS_NODES="/data/nodes.conf" sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${MY_POD_IP}/" ${REDIS_NODES} exec "$@" redis.conf: |+ port 7001 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 #cluster-announce-ip ${MY_POD_IP} #cluster-announce-port 7001 #cluster-announce-bus-port 17001 logfile "/data/redis.log"阐明:2个文件,node-update.sh用来redis启动时执行脚本,具体前面再介绍为何要减少一个启动脚本;redis.conf为redis启动配置文件。 2、redis长久化存储pv,pv应用nfs服务存储,集群6个节点别离创立6个pv不同存储,动态创立pv文件redis-pv.yaml apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv0 labels: pv: nfs-pv0spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster0---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv1 labels: pv: nfs-pv1spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster1---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv2 labels: pv: nfs-pv2spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster2---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv3 labels: pv: nfs-pv3spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster3---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv4 labels: pv: nfs-pv4spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster4---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv5 labels: pv: nfs-pv5spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster53、应用StatefulSet创立redis-cluster集群节点和headless service ...

February 8, 2021 · 2 min · jiezi

关于redis-cluster:Docker-Redis集群搭建

最早看Redis集群搭建的文章,还是多开几个虚拟机或者单机多开几个端口的办法,起初发现其实用docker更加简略不便。 1.拉取镜像docker search redisdocker pull redis2.生成配置文件mkdir redis-clustercd redis-clustervim redis-cluster.tmplport ${PORT}masterauth 123456requirepass 123456cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000cluster-announce-ip 192.168.10.83cluster-announce-port ${PORT}cluster-announce-bus-port 1${PORT}appendonly yes参数形容(1)port(端口号)(2)masterauth(设置集群节点间拜访明码,跟上面统一)(3)requirepass(设置redis拜访明码)(4)cluster-enabled yes(启动集群模式)(5)cluster-config-file nodes.conf(集群节点信息文件)(6)cluster-node-timeout 5000(redis节点宕机被发现的工夫)(7)cluster-announce-ip(集群节点的汇报ip,避免nat,事后填写为网关ip后续须要手动批改配置文件)(8)cluster-announce-port(集群节点的汇报port,避免nat)(9)cluster-announce-bus-port(集群节点的汇报bus-port,避免nat)(10) appendonly yes(开启aof)3.生成配置文件和数据目录执行以下命令,按模板生成文件以及文件夹for port in `seq 7001 7006`; do \ mkdir -p ./${port}/conf \ && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \ && mkdir -p ./${port}/data; \done 4.创立6个redis容器docker run -d --net=host -v /redis-cluster/7001/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7001/data:/data --restart always --name=redis-7001 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7002/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7002/data:/data --restart always --name=redis-7002 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7003/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7003/data:/data --restart always --name=redis-7003 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7004/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7004/data:/data --restart always --name=redis-7004 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7005/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7005/data:/data --restart always --name=redis-7005 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7006/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7006/data:/data --restart always --name=redis-7006 redis redis-server /etc/redis/redis.conf或者for port in `seq 7001 7006`; do \ docker run -d --net=host -v /redis-cluster/${port}/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/${port}/data:/data --restart always --name=redis-${port} redis redis-server /etc/redis/redis.conf \donedocker ps ...

December 31, 2020 · 1 min · jiezi