大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“redis常问的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis常问的问题有哪些”吧!
创新互联建站长期为成百上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为芦溪企业提供专业的网站制作、成都网站设计,芦溪网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
存储方式
Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。memcached本身是为缓存而设计的服务器,因此没有考虑数据的永久性问题。
Redis有部份存在硬盘上,这样能保证数据的持久性。停电后可恢复。
数据支持类型
Memcache对数据类型支持相对简单。>>Redis有5种数据类型。线程
Memecache高性能的分布式内存缓存服务器,由于 redis 只使用单核,而 memcached 可以使用多核,value大小
redis最大可以达到1GB,而memcache只有1MB
纯内存操作
核心是基于非阻塞的 IO 多路复用机制
单线程反而避免了多线程的频繁上下文切换问题
官方现实QPS可达10W/sredis 缓存雪崩
问题:目前电商首页以及热点数据都会去做,一==缓存 ==般缓存都是定时任务去刷新,或者是查不到之后去查数据库然后更新的,定时任务刷新就有一个问题。如果所有redis缓存在同一时间失效了,此时正好双十一秒杀活动则会导致前端所有请求直接打到DB上,如过挂的是一个用户服务的库,那其他依赖他的库所有的接口几乎都会报错,如果没做熔断等策略基本上就是瞬间挂一片的节奏,
==解决方法==:在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值就好了,setRedis(Key,value,time + Math.random() * 10000);
redis 缓存穿透,缓存击穿
==缓存穿透==:指缓存和数据库中的数==都没有==据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
==解决方法==:在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截,IP单位请求次数限制等操作。从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值具体取啥问产品,或者看具体的场景,缓存有效时间可以设置短点,如30秒。
==缓存击穿==:这个跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,简单理解为子弹穿透一个物体。
==解决方法==:设置热点key用不过期。
Bloom Filter:防止==缓存穿透==的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
分布式锁实现原理, 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
如果在setnx之后,执行expire之前进程意外crash或重启维护, 那么就需要把setnx和expire合成一条指令来用。
使用keys指令可以扫出指定模式的key列表。
如果这个redis正在给线上的业务提供服务,那么使用key指令会导致线程阻塞。(redis是单线程的,执行key指令期间,线上服务会卡顿,直到指令执行完成,服务才会恢复)。
在这种场景下,就可以使用==scan==指令,该指令可以的提==无阻塞==取出指定模式的key列表,但是会有一定重复的概率,可以在客户端做一次去重就好了, 但是整体花费的时间会比直接使用keys指令长。
一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。(如果不用sleep, list还有个指令==blpop==, 在没有消息的时候, 他会阻塞住直到有消息到来)。
如果要生产一次消费多次,则需要使用pub/sub主题订阅者模式,可以实现1:N的消息队列。(在消费者下线的情况下,生产的消息会丢失。在这种情况下, 就得使用更专业的消息队列了,例如RabbitMQ)
RDB:你给出两个词汇就可以了,==fork==和==cow==。fork是指redis通过创建子进程来进行RDB操作,cow指的是=copy on write===,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。
AOF:保存等其实锁增修的RESP指令,一般为全量数据,恢复起来较慢也。并且 服务器重启顺序 ==先AOF后RDB==
可以将多次IO往返的时间缩减为一次, 前提是pipeline执行的指令质检没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是piepline批次指令的数目。
redis的同步机制是如何操作的?
redis可以使用主从同步, 从从同步。第一次同步时, 主节点做一次bgsave, 并同时将后续修改操作记录到内存buffer, 待完成后将rdb文件全量同步到复制节点, 复制节点接受完成后, 将rdb镜像加载到内存。加载完成后, 再通知主节点将修改期间的操作 记录同步到复制节点进行重放就完成了同步过程。
redis sentinal着眼于高可用, 在master宕机时会自动将slave提升为master, 继续提供服务。
redis cluster着眼于扩展性,在单个redis内存不足时, 使用cluster进行分片存储
一般避免以上情况发生我们从三个时间段去分析下:
事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL 被打死。
事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
感谢各位的阅读,以上就是“redis常问的问题有哪些”的内容了,经过本文的学习后,相信大家对redis常问的问题有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!