Redis缓存穿透-布隆过滤器
Redis缓存穿透-布隆过滤器缓存穿透我举个博客中的案例来说,我现在有一个博客详情页,然后博客详情页中的内容假设是存储在Redis中的,然后通过博客的Uid进行获取,正常的情况是:用户进入博客详情页,然后通过uid获取redis中缓存的文章详情,如果有内容就直接访问,如果不存在内容,那么需要访问数据库,然后从数据库中查询我们的博客详情后,然后在存储到redis中,最后在把数据返回给我们的页面。
但是可能存在一些非法用户,他可能会模拟出很多不存在的key,然后通过该key去请求后台,首先redis的缓存没有命中,那么就去请求数据库,最后数据库没有查询出该内容,这样很多个非法的请求直接打在数据库中,可能会导致数据库直接宕机,无法对外提供服务。这就是我们所说的缓存穿透问题
简单的解决方法针对这个情况,我们有一种简单的解决方法就是,在数据库没有查询该条数据的时候,我们让该key缓存一个 空数据,这样用户再次以该key请求后台的时候,会直接返回null,避免了再次请求数据库。
布隆过滤器什么是布隆过滤器?布隆过滤器的巨大作用 ,就是能够迅速判断一个元素是否存在一个集合中。因此次他有如下几个使用场 ...
Redis常见问题二
剖析在以前,如果前几年的时候,一般来说,redis如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis,或者twemproxy,都有。有一些redis中间件,你读写redis中间件,redis中间件负责将你的数据分布式存储在多台机器上的redis实例中。
这两年,redis不断在发展,redis也不断的有新的版本,redis cluster,redis集群模式,你可以做到在多台机器上,部署多个redis实例,每个实例存储一部分的数据,同时每个redis实例可以挂redis从实例,自动确保说,如果redis主实例挂了,会自动切换到redis从实例顶上来。
现在redis的新版本,大家都是用redis cluster的,也就是redis原生支持的redis集群模式,那么面试官肯定会就redis cluster对你来个几连炮。要是你没用过redis cluster,正常,以前很多人用codis之类的客户端来支持集群,但是起码你得研究一下redis cluster吧。
Redis集群模式的工作原理单机瓶颈Redis在单机架构下的瓶颈:master节点的数据和s ...
Redis常见问题一
剖析Redis最基本的一个内部原理和特点就是NIO异步的单线程工作模型。Memcache是早些年个大互联网公司常用的缓存方案,但是现在近几年都是使用的redis,没有什么公司使用Memcache了。
注意:Redis中单个Value的大小最大为512MB,redis的key和string类型value限制均为512MB
Redis和Memcache的区别从Redis作者给出的几个比较
Redis拥有更多的数据结构
Redis相比Memcache来说,拥有更多的数据结构和支持更丰富的数据操作,通常在Memcache里,你需要将数据拿到客户端来进行类似的修改,在set进去。这就大大增加了网络IO的次数和体积,在Redis中,这些复杂的操作通常和一般的set/get一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis是不错的选择
Redis内存利用率对比
使用简单的key-value存储的话,Memcache的内存利用率更高,而Redis采用Hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcache
性能对比
由于Re ...
通俗理解多种IO模型
通俗理解多种IO模型前言我们以故事来讲我们经常遇到的多种IO模型,首先故事的情节是
老李去买火车票,三天后买到一张退票,其中往返车站耗时1小时。
里面主要包含的人员有:老李,黄牛,售票员,快递员
多种IO模型阻塞IO模型老李去火车站买票,排了三天队买到一张退票
耗费:在火车站等了三天,其它一件事都没做
非阻塞IO模型老李去火车站买票,每隔12个小时去火车站问有没有退票,然后在三天后买到一张票。
耗费:往返车站6次,路上6小时,其它时间做了很多事
IO复用模型select 和 poll老李去火车站买票,委托黄牛,然后每个6小时打电话给黄牛咨询,黄牛在三天内买到票,然后老李去火车站交钱取票。
耗费:花费时间打电话17次,并往返火车站2次,黄牛手续费100元
epoll老李去火车站买票,委托黄牛,黄牛买到票后立即通知老李去领,然后老李去火车站交钱领取
耗费:无需打电话,但是还需要往返火车站2次,黄牛手续费100元
信号驱动IO模型老李火车站买票,给售票员留下电话,有票后,售票员打电话通知老李,然后老李去火车站交钱领票
耗费:往返车站2次,路上2小时,不需要黄牛费,以及打 ...
从底层了解IO多路复用模型
从底层了解IO多路复用模型前言当我们去面试的时候,问到了 redis,nginx,netty他们的底层模型分别是什么?
redis -> epoll
nginx-> epoll
netty-> epoll?
需要从操作系统的层面上来谈
BIO当我们开机的时候,首先被加载进内存的是我们的Kernel(内核),内核是用于管理我们的硬件的,同时内核还会创建一个GDT表,然后划分两个空间(用户空间和内核空间),同时空间中的内容是开启了保护模式,无法被修改的。
同时还有一个CPU的概念,CPU有自己的指令集,并且指令集是分了几个级别的,分别是从0~3的,Kernel属于0级别。APP只能用级别为3的指令集。
从上面我们可以知道,我们的应用程序是无法直接访问我们的Kernel的,也就是程序不能直接访问我们的磁盘,声卡,网卡等设备,只有内核才可以访问,那我们怎么办?
只有APP通过调用Kernel提供的 syscall(系统软中断和硬中断)来获取硬件中的内容。
软中断
硬中断:硬中断指的是我们的键盘,按下一个按键的时候,就会触发我们的硬中断,也就是内核会有一个中断号,然后得到 ...
巧用Iterator的remove提高多重循环的效率
在开发中,经常会遇到需要多重循环封装值的情况,在一对多等情境下巧用Iterator的remove可以显著提高多重循环的效率。
例:多重目录,一级目录对应多个二级目录
1234567891011121314151617181920212223242526272829303132333435public List<FirstSubject> getSubjectList() { List<FirstSubject> list = new ArrayList<FirstSubject>(); QueryWrapper<Subject> firstSubjectWrapper = new QueryWrapper<>(); QueryWrapper<Subject> secondSubjectWrapper = new QueryWrapper<>(); firstSubjectWrapper.eq("parent_id",&qu ...
IDEA优化——终端
前提:powershell已经配置好了oh-my-posh(参照之前powershell的文章)
1.将IDEA中的终端改为powershell
添加字体
设置IDEA中的终端字体为导入的字体
oh-my-posh 的主题建议设置为 aliens(如何设置,参见之前powershell的文章)
Linux_磁盘分区、挂载
1 Linux 分区1.1 原理介绍
Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux中每个分区都是用来组成整个文件系统的一部分。
Linux 采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
示意图
1.2 硬盘说明
Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘
对于 IDE 硬盘,驱动器标识符为“ hdx~ ”,其中“hd”表明分区所在设备的类型,这里是指 IDE 硬盘了。“x”为盘号(a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘),“ ~ ”代表分区,前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例,hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区,hdb2表示为第二个 IDE 硬盘上的第二个主分区或扩展分区。
对于 SCSI 硬盘则标识为“sdx~”,SCSI 硬盘是用“sd ...
Linux_定时任务调度
1 crond 任务调度crontab 进行 定时任务的设置
1.1 概述任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等
个别用户工作:个别用户可能希望执行某些程序,比如对 mysql 数据库的备份。
1.2 基本语法1crontab [选项]
1.3 常用选项
1.4 快速入门123456789设置任务调度文件:/etc/crontab设置个人任务调度。执行 crontab –e 命令。接着输入任务到调度文件如:*/1 * * * * ls –l /etc/ > /tmp/to.txt意思说每小时的每分钟执行 ls –l /etc/ > /tmp/to.txt 命令
5 个占位符的说明
特殊符号的说明
特殊时间执行案例
1.5 应用实例
案例 1:每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
1*/1 * * * * date >> /tmp/mydate
案例 2:每隔 1 分钟, 将当前日期和日历 ...
Linux_组管理和权限管理
1 Linux 组基本介绍在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件有所有者、所在组、其它组的概念。
所有者
所在组
其它组
改变用户所在的组
2 文件/目录 所有者一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。
2.1 查看文件的所有者1ls –ahl
2.2 修改文件所有者1chown 用户名 文件名
要求:使用 root 创建一个文件 apple.txt ,然后将其所有者修改成 tom
1chown tom apple.txt
3 组的创建3.1 基本指令1groupadd 组名
创建一个组, ,monster
1groupadd monster
创建一个用户 fox ,并放入到 monster 组中
1useradd -g monster fox
4 文件/目录 所在组当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。
4.1修改文件/目录所在的组1chgrp 组名 文件名
使用 root 用户创建文件 orange.txt ...