Redis

Redis面试总结

混江龙づ霸主 提交于 2020-11-05 00:33:54
一、Redis介绍 C语言开发的高性能k-v缓存中间件,支持string、set、sorted set、list、hash数据结构。 二、Redis优势 大部分操作都是纯内存操作,速度非常快 数据结构简单,操作方便 单线程,避免了频繁的上下文切换和竞争 多路IO复用模型,非阻塞IO 三、应用场景 计数器、常用缓存、回话缓存、消息队列(lpush、rpop)、分布式锁 四、Redis持久化 两种模式都开启的情况下,重启会优先选择AOF恢复。 RDB(默认):按照一定时间,将内存数据以快照形式保存到硬盘中 优点:只有一个文件,方便持久化;fork子线程来进行持久化,保证了高性能;大数据集时启动比AOF快。 缺点:安全性低、每隔一段时间进行持久化,若持久化过程中出现故障,会导致数据丢失,适合对数据严谨要求不高的场合。 AOF:Redis将每次写命令记录到单独的日志文件中,当重启Redis会从日志文件的命令执行一遍恢复数据 优点:安全性高,每一个写操作都会记录到aof文件中,即使备份过程中出现故障,也可通过redis-check-aof工具修复。aof文件过大时可以进行重写合并一些操作命令。 缺点:比RDB文件大,恢复效率低 五、key删除策略 定时删除+惰性删除 定时删除:定期扫描随机获取一些key,如果过期进行删除。 惰性删除:在访问的时候,发现key已经过期,再删除。 六

Redis缓存击穿、缓存穿透、缓存雪崩

ぐ巨炮叔叔 提交于 2020-11-04 09:37:32
上篇文章谈到了 Redis 分布式锁,实际上就是为了解释为什么做缓存采用 Redis 而不使用 map/guava 。 缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map /guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 JVM 的销毁而结束。而且在多实例状态下缓存不具有唯一性。使用 Redis 作缓存称为分布式缓存,在多实例状态下共用一份缓存数据,缓存具有一致性。 所以说在分布式下最合适的缓存方案就是采用 Redis 实现分布式缓存。 本篇文章主要谈谈 Redis 中很容易出现的三大问题现象:缓存击穿、缓存穿透以及缓存雪崩。不过在介绍这三个问题现象之前,我们首先需要先来了解下 Redis 中 key 的过期淘汰机制。众所周知, Redis 可以对存储在 Redis 中的缓存数据设置过期时间,比如我们获取的短信验证码一般十分钟过期,我们这时候就需要在验证码存进 Redis 时添加一个 key 的过期时间,但是这里有一个需要格外注意的问题就是:并非 key 过期时间到了就一定会被 Redis 给删除。那么 Redis 是如何做到对过期 key 进行删除呢?Redis中对于过期 key的 删除分为两种策略:定期删除和惰性删除。 定期删除: Redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 Key ,检查其是否过期

记一次订单号重复的事故,快看看你的 uuid 在并发下还正确吗?

与世无争的帅哥 提交于 2020-11-04 06:06:46
作者:funnyZpC cnblogs.com/funnyzpc/p/13541713.html 去年年底的时候,我们线上出了一次事故,这个事故的表象是这样的: 系统出现了两个一模一样的订单号,订单的内容却不是不一样的,而且系统在按照 订单号查询的时候一直抛错,也没法正常回调,而且事情发生的不止一次,所以 这次系统升级一定要解决掉。 经手的同事之前也改过几次,不过效果始终不好:总会出现订单号重复的问题, 所以趁着这次问题我好好的理了一下我同事写的代码。 这里简要展示下当时的代码: /** * OD单号生成 * 订单号生成规则:OD + yyMMddHHmmssSSS + 5位数(商户ID3位+随机数2位) 22位 */ public static String getYYMMDDHHNumber (String merchId) { StringBuffer orderNo = new StringBuffer( new SimpleDateFormat( "yyMMddHHmmssSSS" ).format( new Date())); if (StringUtils.isNotBlank(merchId)){ if (merchId.length()> 3 ){ orderNo.append(merchId.substring( 0 , 3 )); } else {

Redis缓存击穿、缓存穿透、缓存雪崩

心不动则不痛 提交于 2020-11-04 06:06:03
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。 上篇文章谈到了Redis分布式锁,实际上就是为了解释为什么做缓存采用Redis而不使用map/guava。缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map /guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 JVM 的销毁而结束。而且在多实例状态下缓存不具有唯一性。使用 Redis 作缓存称为分布式缓存,在多实例状态下共用一份缓存数据,缓存具有一致性。所以说在分布式下最合适的缓存方案就是采用Redis实现分布式缓存。 本篇文章主要谈谈Redis中很容易出现的三大问题现象:缓存击穿、缓存穿透以及缓存雪崩。不过在介绍这三个问题现象之前,我们首先需要先来了解下Redis中key的过期淘汰机制。众所周知,Redis可以对存储在Redis中的缓存数据设置过期时间,比如我们获取的短信验证码一般十分钟过期,我们这时候就需要在验证码存进Redis时添加一个key的过期时间,但是这里有一个需要格外注意的问题就是:并非key过期时间到了就一定会被Redis给删除。那么Redis是如何做到对过期key进行删除呢?Redis中对于过期key的删除分为两种策略:定期删除和惰性删除。 定期删除:Redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 Key

Linux(Centos7)yum安装最新redis

杀马特。学长 韩版系。学妹 提交于 2020-11-04 06:00:06
1、启用EPEL仓库 ## RHEL/CentOS 7 64-Bit ## # wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm # rpm -ivh epel-release-7-5.noarch.rpm 要验证EPEL仓库是否建立成功,可以执行: # yum repolist 2、通过Yum安装Redis # yum -y update # yum install redis 如果redis还不是最新的,不要安装,继续下面的设置 3、安装Remi的软件源,安装命令如下: yum install -y http://rpms.famillecollet.com/enterprise/remi-release/7.rpm 数字为centos版本 4、然后可以使用下面的命令安装最新版本的redis: yum --enablerepo=remi install redis 5、安装完毕后,即可使用下面的命令启动redis服务并设置为开机自动启动: service redis start chkconfig redis on 6、Redis开启远程登录连接 原来是redis默认只能localhost登录,所以需要开启远程登录。解决方法如下: 在redis的配置文件redis

redis缓存穿透、缓存击穿、缓存雪崩

|▌冷眼眸甩不掉的悲伤 提交于 2020-11-04 01:34:17
缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。 解决办法: 预校验 在控制层对查询参数先进行校验,不符合则丢弃。 布隆过滤 将所有可能查询的参数添加到BloomFilter中,一定不存在的记录就会被BloomFilter过滤掉,从而避免了对底层存储系统的查询压力。 缓存空对象 如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 缓存空对象会有两个问题: 空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间 ( 如果是攻击,问题更严重 ),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。 缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。 缓存击穿 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力 解决方案: 设置热点数据永远不过期。 加互斥锁

可能是2020年最全最硬核的Java面试 “备战” 资料(478页)

半城伤御伤魂 提交于 2020-11-03 16:27:20
由于 本人对有深度的系列文章情有独钟 ,所以本仓库 【Java Github 超硬核面试 “备战” 手册】 整理过程中会更加偏重这个方向, 整理中 我也会分享一些近些年自己开发和工作过程中的一些感悟、心得和无奈。 本仓库大部分内容来自我近几年的收集和整理,整体文章思路也是围绕着【面试备战计划】来进行整理的,主体内容包含:职业规划篇,跳槽篇,实操篇,一线大厂面试题篇,以及高频面试必备综合篇 等知识内容。 目录 程序员职业规划篇 职业分析及定位 职业生涯经验和建议 跳槽篇 跳槽是为了什么?不为什么? 什么时间 / 状态下跳槽最合适? 跳槽的节奏和路线图应该是怎样的? 造成面试不通过的核心原因,有哪些? 良好的心态和体态 实操篇 求职简历应该如何写? 怎么“高效”寻找求职渠道? 面试准备及总结 900份简历模板 BATJ一线大厂面试题篇 百度面试篇 腾讯面试篇 京东面试篇 头条面试篇 美团面试篇 华为面试篇 滴滴面试篇 互联网公司高频面试必备综合篇 并发编程面试题汇总 JVM面试题汇总 Netty常被问到的那些面试题汇总 Tomcat面试题整理汇总 Mysql面试题汇总 Spring源码深度解析 Mybatis常见面试题汇总 Nginx那些面试题汇总 Zookeeper面试题汇总 RabbitMQ常见面试题汇总 Kafka面试题汇总 Redis常见面试题汇总 Dubbo面试题

Java岗位最全面的面试题全曝光!史上最全的超硬核Java 面试 “备战” 仓库!

不想你离开。 提交于 2020-11-03 16:26:51
由于本人对有深度的系列文章情有独钟,所以本仓库 【Java Github 超硬核面试 “备战” 手册】 整理过程中会更加偏重这个方向,整理中我也会分享一些近些年自己开发和工作过程中的一些感悟、心得和无奈。 本仓库大部分内容来自我近几年的收集和整理,整体文章思路也是围绕着 【面试备战计划】 来进行整理的,主体内容包含:职业规划篇,跳槽篇,实操篇,一线大厂面试题篇,以及高频面试必备综合篇 等知识内容。 总归一句话:养成一颗奋发的平常心。 目录 程序员职业规划篇 职业分析及定位 职业生涯经验和建议 跳槽篇 跳槽是为了什么?不为什么? 什么时间 / 状态下跳槽最合适? 跳槽的节奏和路线图应该是怎样的? 造成面试不通过的核心原因,有哪些? 良好的心态和体态 实操篇 求职简历应该如何写? 怎么“高效”寻找求职渠道? 面试准备及总结 900份简历模板 BATJ一线大厂面试题篇 百度面试篇 腾讯面试篇 京东面试篇 头条面试篇 美团面试篇 华为面试篇 滴滴面试篇 互联网公司高频面试必备综合篇 并发编程面试题汇总 JVM面试题汇总 Netty常被问到的那些面试题汇总 Tomcat面试题整理汇总 Mysql面试题汇总 Spring源码深度解析 Mybatis常见面试题汇总 Nginx那些面试题汇总 Zookeeper面试题汇总 RabbitMQ常见面试题汇总 Kafka面试题汇总

Github 上超硬核Java 面试 “备战” 仓库,真香~

孤者浪人 提交于 2020-11-03 15:58:22
由于本人对有深度的系列文章情有独钟,所以本仓库 【Java Github 超硬核面试 “备战” 手册】 整理过程中会更加偏重这个方向,整理中我也会分享一些近些年自己开发和工作过程中的一些感悟、心得和无奈。 本仓库大部分内容来自我近几年的收集和整理,整体文章思路也是围绕着【面试备战计划】来进行整理的,主体内容包含:职业规划篇,跳槽篇,实操篇,一线大厂面试题篇,以及高频面试必备综合篇 等知识内容。 总归一句话:养成一颗奋发的平常心 目录 程序员职业规划篇 职业分析及定位 职业生涯经验和建议 跳槽篇 跳槽是为了什么?不为什么? 什么时间 / 状态下跳槽最合适? 跳槽的节奏和路线图应该是怎样的? 造成面试不通过的核心原因,有哪些? 良好的心态和体态 实操篇 求职简历应该如何写? 怎么“高效”寻找求职渠道? 面试准备及总结 900份简历模板 BATJ一线大厂面试题篇 百度面试篇 腾讯面试篇 京东面试篇 头条面试篇 美团面试篇 华为面试篇 滴滴面试篇 互联网公司高频面试必备综合篇 并发编程面试题汇总 JVM面试题汇总 Netty常被问到的那些面试题汇总 Tomcat面试题整理汇总 Mysql面试题汇总 Spring源码深度解析 Mybatis常见面试题汇总 Nginx那些面试题汇总 Zookeeper面试题汇总 RabbitMQ常见面试题汇总 Kafka面试题汇总 Redis常见面试题汇总

聊聊spring-boot-starter-data-redis的配置变更

青春壹個敷衍的年華 提交于 2020-11-03 15:52:00
本文主要研究一下spring-boot-starter-data-redis的配置变更 配置变更 以前是spring-boot的1.4.x版本的(spring-data-redis为1.7.x版本),最近切到2.0.4.RELEASEB版本(spring-data-redis为2.0.5.RELEASE版本),发现配置有变更。 旧版配置 spring.redis.database=0 spring.redis.host=192.168.99.100 spring.redis.port=6379 # spring.redis.password= # Login password of the redis server. spring.redis.pool.max-active=8 spring.redis.pool.max-idle=8 spring.redis.pool.max-wait=-1 spring.redis.pool.min-idle=0 # spring.redis.sentinel.master= # Name of Redis server. # spring.redis.sentinel.nodes= # Comma-separated list of host:port pairs. spring.redis.timeout=10 新版本配置 spring