Redis缓存那些坑:击穿、穿透、雪崩与数据一致性
又是这几个老生常谈的问题,在正式开始学习 Redis 之前,我就知道这几个问题,在无数个老哥的面试经验里面看到过这四个问题,让我一直觉得在简历上写熟悉 Redis 就只需要准备这几个问题就行了,但是实际上好像并没有面试官会问这几个问题,至少对我来说是这样的。
在之前的博客里面也大概讲过前三个问题,但是当时就是把别人写的八股文给复制下来了,今天还是想要在重新记录一下。
Redis 三兄弟用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了。
当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就奔溃的了,所以为了避免用户直接访问数据库,会用 Redis 作为缓存层。
因为 Redis 是内存数据库,我们可以将数据库的数据缓存在 Redis 里,相当于数据缓存在内存,内存的读写速度比硬盘快好几个数量级,这样大大提高了系统性能。
引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。
这三个问题也是面试中很常考察的问题,我们不光要清楚地知道它们是怎么发生,还需要知道如何解决它们。
缓存雪崩通常我们为了保证缓存中 ...
红黑树是什么?——一个“清朝”的遗留问题
今天来学我们的老朋友——红黑树。为什么今天的标题透着一股诡异的气息,清朝的遗留问题,其实是笔者从大一就开始说要去学一直到现在都没学的一个知识点。
为什么最近突然想起来这个老朋友了?最近 Java 的基础知识也学得差不多了,所以开始看一些 Java 的集合框架,学的过程中我又看到了这个老朋友。做事实在是太拖拉了,都两年多了才开始学一些基础的东西,被秒挂也不是什么稀奇事了。
红黑树为什么必须掌握?来看看,红黑树的广泛的应用
JDK 1.8开始,HashMap也引入了红黑树:当冲突的链表长度超过8时,自动转为红黑树
Java中,TreeMap、TreeSet都使用红黑树作为底层数据结构
Linux底层的CFS进程调度算法中,vruntime使用红黑树进行存储。
多路复用技术的Epoll,其核心结构是红黑树 + 双向链表。
面试过程中,HashMap 常常是面试的重点, 而且会以连环炮 的方式进行发问,
所以, 红黑树基本是 面试必须的 要点, 如果 答不上来,面试就有 很大程度 就黄了。笔者就有相似的经历,被面试官突然提起的红黑树硬控了几秒,回忆起三年前的青葱岁月(bushi)。
红黑树 ...
如何设计一个秒杀系统
秒杀活动是指网络商家为促销等目的组织或网上限时抢购活动,这种活动具有瞬时并发量大、库存量少和业务逻辑简单等特点。设计一个秒杀系统需要考虑的因素很多,比如对现有业务的影响、网络带宽消耗以及超卖等因素。
选择学习这部分内容主要是因为秒杀、抽奖这些实际开发中会遇到的问题是面试的高频问题,而且整个设计过程确实涉及了很多方面的内容。本文会讨论秒杀系统的各个环节可能存在的问题以及解决方案。
概述秒杀系统设计是国内系统设计面试的高频题,在面试中,你需要分析架构的瓶颈,潜在问题以及不同方案的优缺点,在本文的最后我们会提到这些面试技巧。开始之前,你需要了解如何设计一个基础的电商系统,秒杀系统只是在电商系统上增加了一些特定条件。现在的电商系统功能繁多,除了最基本的购买商品功能,还有物流跟踪,订单管理,社区交互等功能。不过面试中关注的主要是购买商品功能,我们将其他次要功能归类为其他业务功能,购买商品流程如下:
客户通过客户端下单
如果下单成功则进入支付阶段,否则返回购买失败
进入支付阶段后,如果在一定时间内支付成功则返回购买成功,否则返回购买失败
从0到1000想象你自己从零搭建一个电商平台,一开始平 ...
Redis高可用宝典:三招搞定你的数据堡垒
软件开发通常会提到一个名词 “三高”,即高并发、高性能、高可用。
具体的指标定义,如:高并发方面要求QPS 大于 10万;高性能方面要求请求延迟小于 100 ms;高可用方面要高于 99.99%。
在前面学习 Redis 时,我们也可以看出 Redis 已经实现了前两个“高”。今天,我们就来看一下 Redis 是否实现了第三个“高”——高可用。
什么是高可用?高可用(High Availability,即HA),指的是通过尽量缩短日常维护操作和突发的系统崩溃所导致的停机时间,以提高系统和应用的可用性。一个业务系统如果全年无一时刻不在提供服务,它的可用性可达100%。那么什么样的系统可以称之为高可用呢,业界一般用几个九来衡量系统的可用性,当系统运行时间达到4个九即99.99%时的系统为高可用的,全年宕机时间为52分钟左右。
高可用一般来说有两个含义:一是数据尽量不丢失,二是保证服务尽可能可用。 AOF 和 RDB 数据持久化保证了数据尽量不丢失,而多节点来保证服务尽可能提供服务。单个节点的系统缺点明显,一旦发生故障会导致服务不可用。而且,单个节点处理所有的请求,吞吐量有限,容量也有限。 ...
Java八股文——基础篇(二)
今天是 Java 基础常见八股文的第二篇,主要内容是关于面向对象的,非常重要,一点一点来看吧。
面向对象基础面向对象和面向过程的区别?
⾯向过程 :面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的一次调用就可以。
⾯向对象 :面向对象,把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事件在解决整个问题的过程所发生的行为。 目的是为了写出通用的代码,加强代码的重用,屏蔽差异性。
用一个比喻:面向过程是编年体;面向对象是纪传体。
面向对象编程有哪些特性?面向对象编程有三大特性:封装、继承、多态。
封装:封装是指将数据(属性,或者叫字段)和操作数据的方法(行为)捆绑在一起,形成一个独立的对象(类的实例)。
封装是把一个对象的属性私有化,同时提供一些可以被外界访问的方法。
继承:继承允许一个类(子类)继承现有类(父类或者基类)的属性和方法。以提高代码的复用性,建立类之间的层次关系。
同时,子类还可以重写或者扩展从父类继承来的属性和方法,从而实现多态。
多态:多态允许不同类的对象对同一消息做出响 ...
Redis事件机制:高效运行的秘密武器
对,没错,这又是一篇讲为什么 Redis 如此之快的文章。不过这次的内容于上一篇文章不一样,本文将聚焦在 Redis 的事件机制的基础概念和实现,不在过多提及它对 Redis 速度的影响。
我在之前的文章中多次提过,Redis 是单线程的,你是否想过,一个线程要如何处理来自各个客户端的各种请求呢?它忙的过来吗?
了解 Redis 的都知道,它不光忙得过来,还做的井井有条。其中就多亏了 IO 多路复用,不仅仅是它,事件机制在其中也是一个不错的设计。
关于 IO 多路复用,我们在之前的文章中也提到过很多次了,所以这里就只聚焦在 Redis 的事件机制上。
如果是你,会怎么做?让我们来设计一个 redis,我们要怎么处理请求连接呢?
最笨的方法,那就是来一个客户端就 accept 一次,然后有什么请求就做什么事,先来先做。显然,这样做别说一个线程了,就算有十个线程都不够用的,太慢了。
我们还可以这样设计,来一个我就单独开设一个线程处理它,相当于你一来我就单独找一个人为你服务,而服务的人最终会将请求给到一个处理中心,让处理中心统一去处理,然后将结果返回。但显然 Redis 没有那么多资源让你浪 ...
Redis消息队列:你的数据,随时待命
现如今的互联网应用大多是采用分布式系统机构设计的,所以消息队列已经逐渐成为企业应用系统内部通信的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能。
当前使用较多的 消息队列 有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分数据库如 Redis、MySQL 以及 phxsql ,如果硬搞的话,其实也可实现消息队列的功能。
可能有人觉得,各种开源的 MQ 已经足够使用了,为什么需要用 Redis 实现 MQ 呢?
有些简单的业务场景,可能不需要重量级的 MQ 组件(相比 Redis 来说,Kafka 和 RabbitMQ 都算是重量级的消息队列)
那你有考虑过用 Redis 做消息队列吗?
这一章,我会结合消息队列的特点和 Redis 做消息队列的使用方式,以及实际项目中的使用,来探讨下 Redis 消息队列的方案。
消息队列是什么?消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
通过提供消息传递和消息排队模型,它可以在分布式环境下提供 应用解耦、弹性 ...
Java八股文——基础篇(一)
从开始学习 Java 已经有一个多月了,但实际的学习时长应该也就不到一周,刚开始心血来潮苦学两天,发现单是基础内容就多如牛毛,相比于 Go 的简单语法,实在是太过复杂。
好在不是为了应付考试,所以就先了解了大概的语法内容,后续通过项目和算法题来熟练巩固知识。
关于八股文,这应该是 Java 最好找的学习资料了,但凡是与其他具体内容有关的知识基本都是收费的,感觉不如 Go (bushi)。今天就先记录一部分已经学过的知识吧,以免后面忘记了。
基础概念和常识本节学习 Java 的语言特性内容。
Java 的语言特性Java 有很多优秀的特点,以下是几个比较突出的:
面型对象:封装、继承、多态。
平台无关性: Java 虚拟机实现平台无关性。
支持多线程:C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持;
支持 JIT 编译:JIT 是 Just-In-Time 的缩写,指的是即时编译器,它可以在程序运行时将字节码转换为本地机器码来提高程序运行速度。
“Write Once, Run Anywhere(一次编写 ...
Why Java? Why not Java?
对的,没错,这是一篇记录笔者从零开始学习 Java 的博客,后面还会有更多关于 Java 的博客被记录。
关于 Java 学习过程中的那些基础知识,在这里就不过多的去介绍了,没什么意义,更多还是去聊一下面向对象或者一些新奇的东西。
既然是开篇之作,还是多写一点轻松的内容,其实就是还没有总结完。所以文本就简单写一下我对 Java 的认识吧。
我与 Java关于 Java,应该是除了 C++ 之外我最先了解到的编程语言了,其实在大一上没结束的时候我就已经开始准备选择一个语言进行学习,为以后找工作打算了。
大一的我提起 Java,觉得不够有趣,选择 Python;大二的我提起 Java,嗤之以鼻,想着学了它,那我和大专的学生有什么区别;大三的我提起 Java,想到被 Go 语言的实习打击的惨样,悲从中来,后悔没有早点学。呜呜呜……
就像这个系列里的分类一样,我对 Java 的态度从”Java?狗都不学“ 到 ”Java!!!世界上最好的语言“。很抽象,但没办法。
不知道你有没有想过,世界上有那么多编程语言,每种语言都有自己的特性,为什么 Java 能如此流行,在各行各业都被广泛使用,兴趣才 ...
Redis家族再添新成员:探索Bitmaps、HyperLogLog和Geo的魅力
在之前的博客中,我们已经学习了 Redis 中的五种基础数据结构和六种底层数据结构。随着 Redis 在江湖上的名气越来越大,又有不少的英雄豪杰加入了 Redis 这一大帮派。
这个家族又迎来了三位新的成员:Bitmaps、HyperLogLog 和 Geo,三者各怀绝技,进一步巩固了Redis在数据江湖中的地位。
接下来就让我们来看一下这三位的实力把。
Bitmaps :位操作的巧匠根据官网介绍:
Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type which is treated like a bit vector. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to set up to 2^32 different bits.
Bitmap 不是 Redis 中的实际数据类型,而是在 String ...