当前位置: 首页 > news >正文 郑州国际装备制造业会展网站的建设景点网站建设 news 2025/10/27 19:11:16 郑州国际装备制造业会展网站的建设,景点网站建设,河南营销型网站,搏彩网站开发建设java面试八股文之------Redis夺命连环25问#x1f468;#x1f393;1.为什么redis这么快#x1f468;#x1f393;2.redis的应用场景#xff0c;为什么要用#x1f468;#x1f393;3.redis6.0之前为什么一直不使用多线程#xff0c;6.0为甚么又使用多线程了1.为什么redis这么快2.redis的应用场景为什么要用3.redis6.0之前为什么一直不使用多线程6.0为甚么又使用多线程了4.redis有哪些高级功能5.怎理解redis中的事务6.redis的过期策略与内存淘汰机制7.什么是缓存穿透如何避免8.什么是缓存雪崩如何避免9.使用redis如何实际分布式锁10.怎么使用redis实现消息队列11.什么是bigkey会有什么影响12.redis如何解决key冲突13.怎么提高缓存命中率14.redis的持久化方式以及各自的区别原理15.为什么redis需要把所有数据放到内存中16.如何保证缓存与数据库双写一致性17.redis集群方案怎么做18.redis集群方案什么情况下会导致整个集群不可用19.说一说redis的hash槽的概念20.redis集群会有写操做丢失吗为什么21.redis常见性能问题和解决方案22.热点数据和冷数据是什么23.什么情况下可能会导致redis阻塞24.什么时候选择redis、什么时候选择memcached25.Redis使用过程中碰到的问题这篇文章用以介绍redis的面试常见问题若是redis使用经验不多的建议先熟练掌握redis再看这篇面试问题redis学习练气到化虚。这两篇学习完足以应对95%以上的redis面试场景了希望对路过的朋友有所帮助。 1.为什么redis这么快 1.纯内存访问 IO一直是影响效率的主要因素redis是纯内存读写较快据说可以达到11w次/s 2.IO多路复用 单线程程序在处理多客户端请求时定然会碰到请求阻塞问题也就是说单线程服务端同时只能处理一个客户端请求其余请求进来只能阻塞等到其他请求处理完毕后才能继续处理。redis如果使用这种模式无疑做不到读写效率高的特点redis采用IO多路复用来解决了这一问题IO这里是指客户端与服务端建立的socket复用指的是共用一个线程。redis通过多个客户端的IO共用一个线程来解决请求阻塞问题这样就可以实现多请求的非阻塞式响应了具体流程如下 1.一个 socket 客户端与服务端连接时会生成对应一个套接字描述符(套接字描述符是文件描述符的一种)每一个 socket 网络连接其实都对应一个文件描述符。 2.多个客户端与服务端连接时Redis 使用 「I/O 多路复用程序」 将客户端 socket 对应的 FD 注册到监听列表(一个队列)中。当客服端执行 read、write 等操作命令时I/O 多路复用程序会将命令封装成一个事件并绑定到对应的 FD 上。 3.「文件事件处理器」使用 I/O 多路复用模块同时监控多个文件描述符fd的读写情况当 accept、read、write 和 close 文件事件产生时文件事件处理器就会回调 FD 绑定的事件处理器进行处理相关命令操作。 4.整个文件事件处理器是在单线程上运行的但是通过 I/O 多路复用模块的引入实现了同时对多个 FD 读写的监控当其中一个 client 端达到写或读的状态文件事件处理器就马上执行从而就不会出现 I/O 堵塞的问题提高了网络通信的性能。如上图Redis 的 I/O 多路复用模式使用的是 「Reactor 设置模式」的方式来实现。 3.单线程避免上下文切换 线程切换是需要耗费cpu资源的单线程反而更快即使6.0以后redis在处理读写操作时依然是单线程 4.渐进式rehash 说渐进式rehash之前必须先说说redis中键值对的数据结构如下图所示 redis存储键值对是通过数组和链表的形式进行存储的因为redis底层就是大的一个Hash表所以他会面临java中HashMap一样的扩容问题Hash数据结构的扩容避免不了的就是Rehash的过程而当Redis数据量非常大时若是没有一个好的ReHash策略将会导致Redis的非常慢可以想象几十万的键同时在重新计算hash值这将导致Redis的存取大受限制因为正常情况下数据异动期间读写都是不能进行的那Redis是怎么做ReHash的呢。 事实上redis在库里并不是一张大的hash表而是两张大的hash表目的就是为了扩容来准备的。一张h0一张h1h1大小是h0已使用元素数量*2的大小。.当需要扩容时会从h0中逐个寻找元素进行迁移到h1中。且在迁移过程中写操作将不会出现在h0中这样保证了h0中的数据元素只会越来越少但是读操作会优先h0进行h0若是读取不到元素将会去h1中进行寻找数据元素。h0在迁移元素之前会维护一个索引用以指示是否需要迁移索引为-1时就不需要迁移索引为0开始迁移该索引每次都会支持待迁移元素这样可以保证元素迁移不会有遗漏。同时这种渐进式的迁移方式也保证了读写可以同时进行不会影响到数据的存取效率。 需要注意的是redis的rehash不光只有扩容还有缩容当h0元素被删除较多后也会进行缩容。 5.缓存时间戳 说这个之前要先说下获取系统时间这个操作获取系统时间一般需要调用系统时间这个需要切换上下文一般很消耗时间和资源比如java里的system.currentTimeInMillis。所以redis没有这么干他是有一个定时任务会没毫秒更新一下redis的时间缓存redis在做TTL操作时都是从缓存中去读取数据而不是调用系统时间这样无疑节省了很多额外的上下文切换的时间。 2.redis的应用场景为什么要用 为什么要用redis当然是redis性能好社区活跃使用起来也简单吗那redis都有哪些应用场景呢这个就需要redis支持的所有功能来说这个问题了根据对redis的了解程度这个问题可以回答的深入也可以浅显看对redis的功能掌握多少我们可以先从redis的8中基本数据类型来说string、list、hash、set、zset、bitmap、hyperloglog、geospatial来说redis的使用场景还可以从Redis的分布式锁、事务、消息等来描述redis的用途。这里列举一部分这个问题没有满分如需拓展则需要对redis功能上完全掌握。 1.缓存 缓存这个比较常用缓存一些热点数据缓存一些开关啊等等都是很常见的。常用String类型来作为数据的缓存类型。 2.计数器 redis里面有一个Hyperloglog数据类型他可以作为数据统计使用。几乎所有的统计计数我们都可以使用hyperloglog来完成比如我们统计网站的登录人数当前视频的观看人数等都可以使用hyperloglog不过必须要说的是hyperloglog的计数不是完全准确的当数据量很大时可能会出现些许的误差但误差不会太大不过一般计数场景对数据的强一致性要求都不是太高些许误差是允许的若是要求不允许有误差就可以使用zset了不过效率上肯定不及hyperlogloghyperloglog使用5m就可以set可能需要12G而且hyperloglog占用内存空间相对于set、zset都小的很多所以她是做基数统计的首选。 3.分布式会话 redis提供的有发布订阅的功能publish/subscribe。利用该功能是可以实现分布式会话机制该机制与消息队列没有什么区别。与mq类似的是redis也提供了群发、群收的功能就是利用通配符和群发命令来实现的。 4.排行榜 redis中的Zset默认便有排序功能天然支持排行做排行榜可以首选该数据类型 5.最新列表 这个功能和排行榜类似就是按时间排序的吗 6.分布式锁 redis因为数据操作是单线程所以可以用来做分布式锁。这里简述下。可以利用redis的命令setnx来实现该命令行为是如果存在则设置失败不存在则设置成功。又主要因为redis是单线程数据操作是单线程所以同时肯定只有一个能设置成功但是若是加锁程序宕机可能会碰到死锁问题所以我们需要为锁加过期时间这样可以解决死锁问题如果加了过期时间又会碰到业务没结束锁已失效或者业务结束很久锁依然没有失效的问题所以又需要加入看门狗策略其实就是启动一个守护线程来观察业务的进度来动态调整锁的失效时间。锁失效时间解决了还需要考虑redis集群的问题因为redis的主从不是强一致性万一不同步就会造成多个服务同时上锁的情况这就需要引入redis的RedLock。RedLock要求至少5台实例且每台都是master。RedLock原理如下 1.客户端先获取当前时间戳T1 2..v客户端依次向5个master实例发起加锁命令且每个请求都会设置超时时间毫秒级注意不是锁的超时时间如果某一个master实例由于网络等原因导致加锁失败则立即想下一个master实例申请加锁。 3..v当客户端加锁成功的请求大于等于3个时且再次获取当前时间戳T2当时间戳T2 - 时间戳T1 锁的过期时间。则客户端加锁成功否则失败。 4.加锁成功开始操作公共资源进行后续业务操作 5.加锁失败向所有redis节点发送锁释放命令从这个来看会把分布式锁越做越复杂而且红锁也是一个比较重的锁。一般不建议使用我们可以为业务提供一些兜底的方案来避免锁的过渡重化。 3.redis6.0之前为什么一直不使用多线程6.0为甚么又使用多线程了 redis6.0之前一直是单线程但是依然很快就是咱们上面说的原因基于内存单线程无需上下文切换IO多路复用渐进式rehash缓存时间戳等特特点共同造就了redis比较快的特点我们知道影响redis快慢的主要原因是网络和内存内存我们一般都可以轻易超过标准但是网络却是一直阻塞redis性能的一个关键瓶颈所以redis为了提高网络这方面的性能在6.0引入了多线程且redis的多线程只是用来处理网络数据的读写其实就是处理命令接收命令解析这一阶段是多线程多线程降低了读写负荷相当于。真正命令去执行时还是单线程。所以即使redis支持了多线程我们依然不会碰到线程安全问而且redis支持多线程以后可以充分利用cpu资源。 4.redis有哪些高级功能 1.这个问题可以聊聊redis支持的消息队列功能 redis支持发布订阅可以用来实现消息队列此外我们还可以利用list数据结构来实现消息队列list支持左进右出lpush、rpop这样也是一个队列等。2.还可以从redis支持的事务上聊可以同时聊聊redis的乐观锁 redis支持事务但是不支持原子性和隔离性。redis的事务命令是multi开启、exec提交、discard丢弃。也就是说redis的事务只支持持久性和一致性。且redis的事务在发生运行时异常时不支持回滚比如对string进行操作这种操作只会导致该命令的失败事务中的其他命令仍会继续执行。若是编译异常则会导致整个事务的失败。我们为了让redis的事务具有原子性可以通过redis的乐观锁来实现。redis的乐观锁watch(加锁)、unwatch释放锁。通过watch用来修饰单个命令意思是当该键值对被修改后其他事务里使用这个键的事务将会执行失败这样可以做到事务中操作的数据没有脏写的问题也相当于解决了原子性问题。redis解决不了隔离性问题无论加不加锁隔离性都不支持。3.还可以从redis的特殊数据类型来说一说 比如做基数统计的hyperloglog、buer统计的bitmap、经纬的geospatial等4.这个问题还可以聊聊redis的分布式锁等等 分布式锁上面已经介绍了这里不重复说了 5.怎理解redis中的事务 redis事务 redis支持事务但是不支持原子性和隔离性。redis的事务命令是multi开启、exec提交、discard丢弃。也就是说redis的事务只支持持久性和一致性。且redis的事务在发生运行时异常时不支持回滚比如对string进行操作这种操作只会导致该命令的失败事务中的其他命令仍会继续执行。若是编译异常则会导致整个事务的失败。我们为了让redis的事务具有原子性可以通过redis的乐观锁来实现。redis的乐观锁watch(加锁)、unwatch释放锁。通过watch用来修饰单个命令意思是当该键值对被修改后其他事务里使用这个键的事务将会执行失败这样可以做到事务中操作的数据没有脏写的问题也相当于解决了原子性问题。redis解决不了隔离性问题无论加不加锁隔离性都不支持。redis支持事务但是不支持原子性和隔离性。redis的事务命令是multi开启、exec提交、discard丢弃。也就是说redis的事务只支持持久性和一致性。且redis的事务在发生运行时异常时不支持回滚比如对string进行操作这种操作只会导致该命令的失败事务中的其他命令仍会继续执行。若是编译异常则会导致整个事务的失败。乐观锁watch 我们为了让redis的事务具有原子性可以通过redis的乐观锁来实现。redis的乐观锁watch(加锁)、unwatch释放锁。通过watch用来修饰单个命令意思是当该键值对被修改后其他事务里使用这个键的事务将会执行失败这样可以做到事务中操作的数据没有脏写的问题也相当于解决了原子性问题。redis解决不了隔离性问题无论加不加锁隔离性都不支持。 6.redis的过期策略与内存淘汰机制 redis删除过期键的方式有三种一种是使用自动的过期策略ttl时间一到会自动删除。另一种是惰性删除这种删除方式会在客户端访问过期键时才会进行删除。还有一种则是内存达到redis的maxmemory时会触发的内存淘汰 1.自动过期 redis的自动过期也不是在过期后进行立即删除的首先redis对设置了过期时间的key会被存入一个指定的字典中redis通过定期默认10次/每秒操作这个字典来实现过期键的删除具体操作如下1.从字段中随机取20个key 2.删除这个20个key中已经过期的key 3.如果20个中过期的key超过了1/4则会继续重复1中的操作这里可以引发一个思考问题若是短时间内发生了大面积的key失效会产生什么影响 若是key大面积失效则会导致一直在进行key删除的操作这样会影响读写会造成阻塞问题所以使用Redis时需要考虑键的过期时间设置问题尽量不要将过期时间设置在同一时间附近。 这里还需要提到的是从库的过期策略从库完全依赖于主库的过期主库过期后会同步一条del命令给到从库从库再去删除所以可能回碰到主从不一致的问题。这也是使用redis分布式锁时说的主从可能不会完全有效的原因所以才有RedLock.2.惰性删除 之所以有惰性删除是因为第一种过期策略不会将所有过期key全部删除肯定会有遗漏所以才有了惰性删除惰性删除会在过期key被访问时进行立即删除。然后才会返回客户端key不存在。总结自动过期是集中处理惰性删除则是零散处理各有利弊集中处理是为了解决大面积key失效问题零散处理是为了解决客户端访问问题。3.内存淘汰机制 这种机制主要是为了应对redis内存已经达到最大maxmemory但是所有的键还都没有过期。此时就需要内存淘汰机制来进行介入了因为只靠过期策略已经不足以回收到足够内存了。内存淘汰策略有以下几种lru、ttl、random具体如下noeviction:不对key进行淘汰所有key均可以正常被读、删但是禁止写这是默认的机制会影响到线上业务的运行。 volatile-lru:该策略会尝试淘汰设置了过期时间且最少被使用的key。这里虽然标注了lru但是并不是真正的lru算法而是采用了一种近似lru的算法lru算法是通过维护一个链表将有数据被使用时就将数据移动到表头这样一定时间后链表尾部都是最少使用的数据了。redis的lru是为每个设置了ttl的key分配32bit的内存用以存储调用时的时间戳这样删除时根据时间戳进行其实和lru很是相似所以这里命名为了lru算法。 volatile-ttl:这种策略也会尝试淘汰设置了过期时间的key不过他是依据剩余过期时间最小key来进行淘汰 volatile-random:该策略也是淘汰设置了过期策略的key不过是随机淘汰 allkeys-lru:这种是针对所有键的lru会删除没有ttl的key很危险 allkeys-random:这种也是针对有键的random也会删除没有ttl的key很危险总结以上几种过期策略volatile类的都是基于ttl进行操作allkeys的都是基于所有key的操作很明显我们应该使用基于ttl的这种更安全可靠些。 7.什么是缓存穿透如何避免 1.缓存击穿 说缓存穿透之前先说下缓存击穿缓存击穿一般是指缓存key失效导致的查询越过缓存同一时间大量请求打到了数据库中给系统和数据造成了很大压力的现象。2.缓存穿透 缓存穿透一般是指恶意攻击时请求的查询参数实际上在缓存与数据中均不存在恶意构造虚假参数进行对系统攻击从而造成了大量请求直接穿透了缓存与数据库从而对系统造成了短时间的压力上升缓存穿透对于系统并发和数据库的压力会提升。那如何避免缓存穿透问题呢一般常用的方式是使用布隆过滤器布隆过滤器是1970年由布隆提出来的。它的作用是可以告诉你你查询的对象一定不存在或者可能存在。因为布隆过滤器是利用hash结构来计算查询数据是否存在的所以存在不同值hashcode相等的情况。所以布隆过滤器无法确定一定存在只能告诉你可能存在。显而易见的是布隆过滤器就会存在误判的行为。当然了一般布隆过滤器的实现都是支持误判的参数调整的通过参数调整可以使得误判的概率控制在一个自己可以接受的范围。 那使用布隆过滤器会不会对性能有很大损失呢答案是不会的有因为布隆过滤器使用的是bitmap这种位数据结构来存储数据占用空间比较小若是指定的hashcode的位置上为1则代表可能存在反之一定不存在。从而达到一个过滤的目的。 我们在缓存之前可以加入布隆过滤器在请求到达布隆过滤器之前可以先让请求先从布隆过滤器中走一遍这样就可以过滤掉大量的缓存穿透问题。避免了被大量恶意攻击的可能。 8.什么是缓存雪崩如何避免 服务器瘫痪引起的缓存雪崩 缓存雪崩一般是有两种情况一种是服务器挂掉了导致缓存信息失效所有请求均打到了数据库上。另一种则是指缓存key的大面积失效。 无论是哪一种现象造成的雪崩对数据库来说都是灾难性的。那怎么解决这个问题呢为了解决服务器宕机的风险我们可以对redis采用主从、主从哨兵、主从集群等模式进行扩展从而降低redis单机宕机的风险。key大面积失效引起的缓存雪崩 而对于redis的key大面积失效问题这就需要我们在设置key失效时间时进行注意了不能将key的失效时间设置的很接近可以为他们的失效时间在某个点再加上一个随机的时间。只需要错开一点对于redis来说就会好上很多因为redis支持的数据读写很高只需要很微小的错开redis就能避免缓存雪崩的出现。 9.使用redis如何实际分布式锁 这个问题上面已经说了这里就不重复说了只简述下大概 使用setnx命令为其设置失效时间增加看板狗一般使用lua脚本动态对失效时间进行调整避免死锁此外该场景依然不能解决全部问题还需要引入RedLock。 10.怎么使用redis实现消息队列 1.发布订阅list实现消息队列 redis支持发布订阅也就是消息队列的模型与rabbit和kafka等消息队列的使用没啥区别。都是publish发布消息subscribe订阅消息同时redis还支持群发与群收的功能以及取消订阅等。redis胜在快速若是需要做个网络即时聊天窗口是可以考虑使用redis的。 此外还需要考虑消息阻塞的问题此时还需要listlist数据结构支持左进右出的命令即lpush、rpop这样就可以看成是一个消息队列了。外来消息可以先存入list中然后通过消费list中的信息将信息通过publish和subscribe进行传输。这样就可以实现一个消息队列了。 11.什么是bigkey会有什么影响 bigkey是指key对应的value占用的内存比较大例如一个string类型的value最大可以是512m一个列表类型的value最多可以存储2的23次方-1的元素。所以bigkey可以分为字符串bigkey和非字符串的bigkey。一般对于字符串类型数据超过10kb就认为是一个bigkey列表则没有明确说法。不过一般说bigkey最好是要结合系统并发来说的因为系统并发不够及时1mb的string对象可能也不会有大问题但是若是并发比较高可能1kb的对象就会产生危害。下面说下bigkey的危害 1.内存空间不均匀造成内存空间使用不均匀2.超时阻塞操作bigkey时阻塞redis的风险提高3.网络阻塞网络流量变大高并发容易出现请求响应慢等问题 12.redis如何解决key冲突 key冲突造成的原因其实就是redis使用不规范造成了key的冲突。那与之相对的我们应该规范使用redis的key。怎么规范呢如下 1.业务上隔离不同业务使用不同库或者集群在一个库里就需要key的设计上考虑2.key的设计业务模块服务key名如mdm-customer-id3.分布式锁这种场景是解决多客户端同时操作一个key的问题此时很可能会出现最终值不是想要的值我们可以通过加锁或者为信息增加时间戳的操作。加时间戳就是操作之前判断下时间戳是否是需要操作不需要则不操作。 13.怎么提高缓存命中率 1.数据提前加载比如系统启动时进行提前加载数据可以避免请求进来是大量打到数据库2.增加缓存的存储空间提高缓存数据增加缓存命中率3.适当调整缓存的数据类型4.提升缓存的更新频率可以通过canal、mq等中间件来实现提升缓存的更新频率 14.redis的持久化方式以及各自的区别原理 RDB 所有基于内存的数据库都需要持久化策略不仅仅是redis只要是基于内存就必须有持久化的策略因为内存是断电即失的。在redis中支持两种持久化的策略一种是RDB持久化一种是AOF持久化默认的情况下就是使用RDB进行持久化RDB的配置就是上面 snapshotting 快照配置这里的所有配置都是用来控制RDB持久化的AOF持久化的控制都在append only mode中默认全部关闭我们一般都是使用RDB进行持久化而不是使用AOF先来看看RDB是如何进行持久化的 如上图所示就是RDB进行持久化的一个流程 1在snapshotting中的save 可以配置 多少时间内发生了多少次操作就会触发持久化一般我们都是使用默认的那三个当触发持久化机制时主线程会fork一个子线程来讲进行复制数据将数据写入到一个临时RDB文件中。 2当快照完全写入后就会去替换掉原来的RDB文件默认的RDB文件是dump.rdb这个在snapshotting中也是可以配置的 RDB文件在哪里: 在snapshotting里面有个配置叫dir上面介绍snapshotting时已经写过默认是当前文件夹下与redis-server同位置为什么不是config的位置?因为redis-server会将配置文件加载过来相当于是在redis-server所在的文件执行rdb文件通常需要进行备份以预防以外丢失rdb文件的情况。 怎么替换RDB文件: 我们要是想要替换RDB文件直接将其放在当前RDB文件的目录下即可redis启动时会默认加载dump.rdb 哪些场景会触发RDB操作: 1执行save命令手动执行一个save命令与配置文件中配置多少秒达到多少次执行save效果一样此时会触发RDB操作。 2我们配置的save多少秒内达到多少次操作也会触发RDB操作。 3执行fulushAll操作也会生成RDB文件清空数据库redis默认生成一个rdb文件。 4关闭redis的时候默认生成一个RDB文件但是若是使用kill命令杀死redis进程则不会生成RDB文件所以我们应该绝对禁止使用kill来停止redis。 RDB持久化的优缺点: 1RDB的优点主线程操作数据不影响子线程的数据持久化效率比较高大数据量时数据恢复比较快。 2RDB的缺点每次持久化都会有时间间隔极端情况下可能会丢失最近一次的数据当然这个时间可以配置尽量减少风险。 AOF AOF是Redis支持的另一种持久化操作RDB是记录的redis中的值那AOF是怎么持久化数据的呢AOF全称是Append Only File追加文件的意思AOF通过追加每次对redis执行的写操作来保存用户所有对redis进行的写操做只要我们在redis中有写操作就会被保存到appendonlyfile.aof文件中当我们想要恢复数据时redis就会从新读取aof文件中保存的所有命令当然了aof默认是关闭我们若是想要使用AOF的话需要在append only mode模块进行修改配置在上面介绍redis的配置文件时已经介绍了这个配置这里就不在重复赘述了。 上面的一套流程还是比较复杂的我们不需要完全记住只需要记住父进程fork了一个子进程子进程负责根据存储快照将命令写入到临时aof写入完通知主线程主线程会将临时的命令写入redis的缓存收到子进程完成的消息回去追加aof文件最后会将新的aof文件替换为新的aof文件。 万一aof文件损坏了怎么办: 当aof文件损坏了的话我们重启redis是不会成功的此时我们可以使用redis-check-aof 来修复aof文件注意这个修复会删除掉aof文件中不可以执行的部分肯定会有数据丢失但是相比丢失所有数据已经好了很多。 AOF的优点和缺点: 优点每次修改都可以同步不是默认的但是支持文件的完整性会更好 缺点aof因为保存的是命令恢复起来会很慢aof因为都是io操作也比较慢所以默认都是使用RDB。 总结redis的两种持久化策略: 可以看到RDB是存储数据的方式保存起来AOF是存储命令的方式存储起来在大数据的情况下AOF恢复数据会很慢但是他对数据的一致性支持更好RDB在极端情况下回丢失最近一次保存的数据。 15.为什么redis需要把所有数据放到内存中 首先必须明确的是内存的IO相较于磁盘来说会非常非常的快在内存越来越不值钱的现在使用内存来处理数据也是很好的选择这也是redis为什么越来越流行的原因了 16.如何保证缓存与数据库双写一致性 使用缓存就会面临这种问题在使用redis做数据缓存时我们都是先查reids查不到再查数据库若是从数据库查到了则更新到redis。若是有数据更新进来我们一般是先删缓存在做数据插入此时存在一个可能更新数据时刚删除完缓存数据其他客户端的查询请求也进来了此时更新请求开始更新数据库数据在未提交事务之前数据被另一个客户端的查询请求查到了查到了一个自然就会将数据更新到redis中然后更新请求提交事务数据库数据就变了。此时缓存与数据库的数据就不一致了。这时就出现了双写不一致的情况。而在在高并发的场景下这个问题很场景。那要怎么避免这个问题呢一般采用的是延时双删策略。 1.更新请求进来删除缓存2.开启事务操作数据提交事务3.再次删除缓存事务提交后再操作 通过延时双删可以解决这种双写不一致的问题不过还是可能出现短暂的双写不一致但是可以保证不会大面积出现问题。 17.redis集群方案怎么做 1.reids3.0-redis5.0的集群方案 启动集群配置模式开启cluster-enalbed yes 此外还需要指定当前的配置文件cluster-config-file node-6379.config 指定集群节点之前的超时时间cluster-node-timeout 5000 开启aof 集群启动后使用ps查看会看能都是cluster结尾的进程 然后需要ruby环境redis的集群需要依赖ruby实现需要安装ruby环境redis内置了一个redis-trib.rb文件用以实现集群。伪操作如下 redis-trib.rb create --replicas 1 ip1:8001 ip2:8002 ip3:8003 ip4:8004 ip5::8005 ip6:8006 解释下上面的参数redis-trib.rb create --replicas 固定命令用以实现集群1标识集群中主节点与从结点的比例是1:1后面所有机器就是用来分配集群的根据主节点算下数据这里是3那前三台就是主节点后三台是从节点。且主节点内第一个对应从节点第一个他俩构成主从模式。 进入redis使用cluster info 可以查看集群信息 使用cluster nodes 可以。 注意若是使用客户端访问redis集群时登录单台客户端需要加-c参数不然不会有集群操作效果。结果展示 2.redis5.0以后的集群方案 redis5.0以后搭建集群省去了ruby环境的构建redis已经内置支持了集群功能redis配置功能不变只需要将最后一步的构建集群命令改成如下即可 redis-cli --cluster create ip1:8001 ip2:8002 ip3:8003 ip4:8004 ip5::8005 ip6:8006 --cluster-replicas 1 3.redis集群的弊端 1.key的批量操作受限msetmget等批量操作集群模式下只支持相同slot值的key执行此操作 2.事务支持受限若是事务的key分散在多个结点上则不支持事务 3.不支持多数据空间redis单机下支持的16个库集群中只支持db0 4.复制结构支持一层也就是不支持从节点还有自己的从节点但是redis集群的扩容和缩容会比较麻烦因为需要从新指定hash槽的分配等。 18.redis集群方案什么情况下会导致整个集群不可用 1.集群中的节点挂掉以后没有从节点接替那会导致整个集群不可用所以我们必须保证每个主节点都有从节点根本原因是因为槽找不到存储位置需要说的是即使有从节点在故障转移期间redis集群也是不可用的状态。cluster-require-full-coverage:no可以解决该问题。2.即使上面配置了no当半数主节点都不可用时集群还是会不可用。 19.说一说redis的hash槽的概念 说redis集群就必须聊的是redis的hash槽的概念在集群模式下redis将集群中所有主节点的存储空间分为0到16383个槽每个节点都会负责一定量的槽如果是三个节点一个节点的槽数量大概就是5460.redis底层采用高质量的hash算法虚拟一致性hash算法来确定数据的存储应该分散在具体哪个槽从而确定集群模式下当前数据应该存储在哪个分区里也就是哪个节点下。 为什么槽要设置为136834主要原因是为了控制节点数量不能太大这个槽梳理支持1000节点以下的集群而节点达到1000以上时节点之前的ping、pong将会很慢所以槽的数量也大概支持到了这个位置。 20.redis集群会有写操做丢失吗为什么 可能因为redis无论是集群还是主从他们的主从之间数据的同步都是异步的在极端情况下主节点写入完成就会返回客户端若是此时主节点内宕机了那从节点将无法获取到写入的数据此时就会有写丢失的情况。 21.redis常见性能问题和解决方案 1.持久化性能问题持久化无论是rdb还是aof都是会消耗性能的一般可以采用主不做持久化使用从来做持久化即可。2.主从应该在同一个局域网下搭建避免跨网络这样主从同步时网络开销就会增大3.在主库压力很大时就不要增加从库了只会增大主库的压力4.主从复制的机构不用采用网状或者树状尽量使用线性结构可以减刑redis主库压力 22.热点数据和冷数据是什么 访问频次较高的数据称为热数据相反则是冷数据。热数据我们就需要考虑将热点数据放到redis缓存中了可以提高系统性能。 23.什么情况下可能会导致redis阻塞 1.客户端阻塞比如执行keys、hgettall、smembers等这些命令时间负责度都是O(n).可能会阻塞2.BIGkey的删除比如zset等耗时较久可能会造成阻塞3.清空库操作如flushdb 、flushall等操作4.AOF日志写操作子线程写AOF或RDB都有可能在数据量比较大时造成问题5.从库加载RDB文件rdb文件加载也会耗时很久6.redis所在服务器性能问你题 24.什么时候选择redis、什么时候选择memcached 1.Redis功能更加强大支持数据类型更多memcached支持数据类型较少只有key-value2.Redis拥有持久化数据安全性更高memcached不支持持久化3.Redis内存管理更健全支持key的过期、内存淘汰等机制更适合数据存储memcashed做缓存会比redis更好4.Redis支持IO多路复用单线程memcached支持非阻塞式的IO多路复用多线程5.Redis支持事务、主从、消息、集群等memcached拓展性不好 25.Redis使用过程中碰到的问题 这个问题就仁者见仁了其实就说说自己工作中碰到的问题可以根据实际情况说如果并发量不大的系统可能并不会碰到集群的问题单点的等可以说说故障转移故障恢复连接中断key使用问题等等这个随意发挥了。希望25问可以帮助到路过的朋友 文章转载自: http://www.morning.brwp.cn.gov.cn.brwp.cn http://www.morning.bpmdn.cn.gov.cn.bpmdn.cn http://www.morning.zckhn.cn.gov.cn.zckhn.cn http://www.morning.rxnl.cn.gov.cn.rxnl.cn http://www.morning.qjlnh.cn.gov.cn.qjlnh.cn http://www.morning.bswxt.cn.gov.cn.bswxt.cn http://www.morning.trfrl.cn.gov.cn.trfrl.cn http://www.morning.thzgd.cn.gov.cn.thzgd.cn http://www.morning.jzbjx.cn.gov.cn.jzbjx.cn http://www.morning.kggxj.cn.gov.cn.kggxj.cn http://www.morning.qwdlj.cn.gov.cn.qwdlj.cn http://www.morning.knpmj.cn.gov.cn.knpmj.cn http://www.morning.ltffk.cn.gov.cn.ltffk.cn http://www.morning.gfhng.cn.gov.cn.gfhng.cn http://www.morning.mpwgs.cn.gov.cn.mpwgs.cn http://www.morning.kongpie.com.gov.cn.kongpie.com http://www.morning.rdnpg.cn.gov.cn.rdnpg.cn http://www.morning.lmmkf.cn.gov.cn.lmmkf.cn http://www.morning.wwthz.cn.gov.cn.wwthz.cn http://www.morning.qmfhh.cn.gov.cn.qmfhh.cn http://www.morning.mxhgy.cn.gov.cn.mxhgy.cn http://www.morning.qrhh.cn.gov.cn.qrhh.cn http://www.morning.hbdqf.cn.gov.cn.hbdqf.cn http://www.morning.tkxyx.cn.gov.cn.tkxyx.cn http://www.morning.ntwfr.cn.gov.cn.ntwfr.cn http://www.morning.wyctq.cn.gov.cn.wyctq.cn http://www.morning.hjjfp.cn.gov.cn.hjjfp.cn http://www.morning.kwwkm.cn.gov.cn.kwwkm.cn http://www.morning.zlxkp.cn.gov.cn.zlxkp.cn http://www.morning.pynzj.cn.gov.cn.pynzj.cn http://www.morning.hhpbj.cn.gov.cn.hhpbj.cn http://www.morning.monstercide.com.gov.cn.monstercide.com http://www.morning.grqlc.cn.gov.cn.grqlc.cn http://www.morning.nssjy.cn.gov.cn.nssjy.cn http://www.morning.mxlwl.cn.gov.cn.mxlwl.cn http://www.morning.lylkh.cn.gov.cn.lylkh.cn http://www.morning.xdjwh.cn.gov.cn.xdjwh.cn http://www.morning.dwwbt.cn.gov.cn.dwwbt.cn http://www.morning.pljxz.cn.gov.cn.pljxz.cn http://www.morning.dhpjq.cn.gov.cn.dhpjq.cn http://www.morning.mrlkr.cn.gov.cn.mrlkr.cn http://www.morning.gdljq.cn.gov.cn.gdljq.cn http://www.morning.hgscb.cn.gov.cn.hgscb.cn http://www.morning.qbksx.cn.gov.cn.qbksx.cn http://www.morning.qwzpd.cn.gov.cn.qwzpd.cn http://www.morning.lxdbn.cn.gov.cn.lxdbn.cn http://www.morning.jhkzl.cn.gov.cn.jhkzl.cn http://www.morning.knnhd.cn.gov.cn.knnhd.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.thrgp.cn.gov.cn.thrgp.cn http://www.morning.trsfm.cn.gov.cn.trsfm.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.mgbcf.cn.gov.cn.mgbcf.cn http://www.morning.qnhpq.cn.gov.cn.qnhpq.cn http://www.morning.dxxnq.cn.gov.cn.dxxnq.cn http://www.morning.dwfxl.cn.gov.cn.dwfxl.cn http://www.morning.qtryb.cn.gov.cn.qtryb.cn http://www.morning.sxbgc.cn.gov.cn.sxbgc.cn http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn http://www.morning.yqqgp.cn.gov.cn.yqqgp.cn http://www.morning.c7630.cn.gov.cn.c7630.cn http://www.morning.rfgc.cn.gov.cn.rfgc.cn http://www.morning.kqqk.cn.gov.cn.kqqk.cn http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn http://www.morning.pqqzd.cn.gov.cn.pqqzd.cn http://www.morning.sqyjh.cn.gov.cn.sqyjh.cn http://www.morning.btpll.cn.gov.cn.btpll.cn http://www.morning.xbkcr.cn.gov.cn.xbkcr.cn http://www.morning.lsjgh.cn.gov.cn.lsjgh.cn http://www.morning.bqxxq.cn.gov.cn.bqxxq.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.burpgr.cn.gov.cn.burpgr.cn http://www.morning.spdyl.cn.gov.cn.spdyl.cn http://www.morning.rckmz.cn.gov.cn.rckmz.cn http://www.morning.ypcd.cn.gov.cn.ypcd.cn http://www.morning.mqxrx.cn.gov.cn.mqxrx.cn http://www.morning.pudejun.com.gov.cn.pudejun.com http://www.morning.ypbp.cn.gov.cn.ypbp.cn http://www.morning.fwzjs.cn.gov.cn.fwzjs.cn http://www.morning.yktr.cn.gov.cn.yktr.cn 查看全文 http://www.tj-hxxt.cn/news/254615.html 相关文章: 网页制作与设计站点应该怎么建网页的六个基本元素 导航网站的好处针对网站开发者的问答网站 深圳企业网站模板电子商务网站建设策划书模板 网站开发案例pdf网络推广整合平台 我先做个网站怎么做的鞍山网站设计制作 茂名市建设银行网站网站构思 做图片网站侵权吗深圳注册贸易公司网上注册流程 网站加速器手机版潜江资讯网手机版官网 网站做效果图流程高校服务地方专题网站建设 西安网站建设熊掌伊滨区网站建设 上海网站开发工程师教育直播平台网站建设费用 雷神代刷网站推广网络 企业网站 长春网站建设排名修改WordPress文章发布模板 有没有一种网站做拍卖厂的wordpress能外链的主题 c语言开发网站后端富阳设计网站 内蒙古生产建设兵团四师三十四团知青网站Wordpress更改登录入口 499可以做网站姐妹直播视频tv 好看的免费网站模板下载 迅雷下载地址北京app制作公司 跨境电子商务网页制作与网站建设柳州门户网站建设公司排名 铭万做的网站怎么样如何使用二级域名做网站 英文网站建设口碑好滨州建设工程备案网站 廊坊建设网站壁纸网站设计制作专业 做策划的人经常浏览的网站肇庆做网站 烟台房地产网站建设研发app公司 国外域名注册网站 中文网站建设怎么进后台 营销型网站建设多少钱花钱做网站不给源码 天津网站建设电焊机wordpress optimizer 微信机器人网站开发网站建设要咨询哪些内容 甘肃肃第八建设集团网站wordpress新用户添加管理员权限 做网站经验全国二级建造师查询网站