
跟着大宇学Redis
小大宇
能与优秀的人为伍自然就会变优秀
展开
-
Java内存缓存-通过Map定制简单缓存
场景在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中,相对从数据库中读取,读缓存效率会有很大提升。在集群环境下,常用的分布式缓存有Redis、Memcached等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache)。使用Map来实现一个简单的缓存功能import java.lang.ref.SoftReference;import java.util.Optional;import jav原创 2021-08-03 10:30:13 · 464 阅读 · 0 评论 -
跟着大宇学Redis--------目录帖
与君共勉 故不积跬步,无以至千里。不积小流,无以成江海。骐骥一跃不能十步,驽马十驾功在不舍。 谁都是从HelloWorld开始学习的,即使是架构师,也是一样。从头开始学Redis目录贴 第一节 Redis常见业务场景 第二节 String典型场景 第三节 List典型场景 第四节 List作为消息中间件 第五节 唯一性与无序性的好朋友Set 第六节 Sorted...原创 2020-12-09 13:49:35 · 592 阅读 · 1 评论 -
【夯实Redis】Redis持久化
Redis两种持久化策略 RDB:周期性的备份缓存数据。 AOF:AOF是将所有的Redis的写命令记录到文件("appendonly.aof")中,这个文件叫做AOF文件。备份文件如何处理 RDB备份方式会产生。参考文档 Redis持久化之RDB Redis持久化之AOF...原创 2020-12-03 15:41:56 · 301 阅读 · 0 评论 -
【夯实Redis】Redis线程模型
一、Redis线程模型 Redis 内部使用文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。 它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中. 事件处理器用来处理具体的请求。文件事件处理器的结构包含 4 个部分:多个 socket IO 多路复用程序 请求队列 事件处理器 二、Redis为什么...原创 2020-11-26 11:44:04 · 582 阅读 · 0 评论 -
【夯实Redis】Redis并发竞争问题
目录悲观锁解决方案乐观锁解决方案 多个系统实例同时并发的更新一个KEY,那么本来应该先到数据库的数据结果后来到了,只要顺序错了,数据库错了。悲观锁解决方案 使用MySQL悲观锁。 使用Redis锁 在操作数据库之前,先获取Redis的分布式锁。确保同一时刻只有同一个系统实例在操作某个KEY。别的系统实例都不允许写。乐观锁解决方案 在读某个KEY的时候,会把这...原创 2020-11-23 17:49:19 · 276 阅读 · 0 评论 -
【夯实Redis】Jmeter?限流?
一、测试环境(1) MySQL服务器一台(2)应用系统(3)JMeter压力测试工具测试结果系统并发数量与响应时间 并发数量 响应时间 10 44ms 50 253ms 100 4.4s 200 29.77s 更多... 系统渐渐无响应 系统在并发量逐渐增加后,系统渐渐不可用,最后变成无响应,可以模拟出线上已经宕机。 如何才能保护我们的系统,防止在缓存击穿后保护我们的数据库系统呢?...原创 2020-11-17 16:30:43 · 565 阅读 · 0 评论 -
【夯实Redis】缓存穿透?缓存击穿?缓存雪崩?
目录一、缓存穿透二、缓存击穿三、缓存雪崩一、缓存穿透 缓存穿透是指缓查询一个数据库一定不存在的数据。 如果如果查询一个不存在的key,此流程会查询一次Redis缓存,再查询一次DB。 如果短时间内出现大量请求,那么会对我们的Redis缓存系统以及数据库造成巨大的压力,甚至宕机。 解决方案: (1)为不存在的KEY也设置一个"空字符串"到缓存里面去,并设置过期时间。这样下次在查询相同KEY的时候,在缓存失效之...原创 2020-11-16 16:45:00 · 324 阅读 · 0 评论 -
【夯实Redis】Redis过期策略与内存淘汰机制有哪些?
目录一、过期策略二、淘汰机制一、过期策略 Redis采用 定期删除策略 + 定时删除策略。定时删除策略 在为一个key设置过期时间的同时,也为这个key设置一个倒计时的定时器,时间到了以后定时器把Key删除。 优点:有了定时器自动删除过期的Key,那么可以保证内存快速释放。 缺点:有可能创建了太多的定时器,可能会影响Redis性能。CPU全被用于计时与删除Key了。惰性删除策略 查询某个Key的时候...原创 2020-11-13 15:11:17 · 419 阅读 · 0 评论 -
【夯实Redis】如何保证数据库与缓存双写一致性?
一、更新操作 数据库与缓存双写一致性问题普遍出现在更新操作中。先更新数据库,再更新缓存 一般来说,不这么推荐。原因是有些缓存数据是多张数据表联合计算出来的,那么就要求在每次更新以后就要同步计算出新的值,然后更新缓存,这样效率很低。如果是写入场景比较多的业务,那么这种方式会很大程度的降低系统性能。先更新数据库,再删除缓存 如果先更新数据库,再删除缓存的话,还是有可能造成数据库与缓存双写不一致性。 例如,线程A在更新操作成功之前...原创 2020-11-13 10:53:14 · 831 阅读 · 0 评论 -
【夯实Redis】如何使用内存缓存与Redis缓存实现多级缓存?
目录多级缓存实现方案参考实例代码多级缓存实现方案 首先看一下流程图。客户端在获取数据的时候,首先向当前服务所在内存请求缓存数据。如果内存中有缓存数据则直接返回缓存数据。如果没有内存缓存,则向分布式缓存Redis服务器请求数据。如果Redis中存在缓存,则将Redis中的缓存写入内存缓存,并向客户端返回缓存数据。如果Redis中也没有数据,那么只能查询数据库了。查询完数据,需要把此次查询结果分别写入Redis中 与 内存中。 整体流程图如下,可以实现Java内存缓...原创 2020-11-11 17:17:11 · 1511 阅读 · 1 评论 -
【夯实Redis】缓存到底是为了啥?
一、高性能 二、高并发三、常见弊端原创 2020-11-10 17:22:34 · 298 阅读 · 1 评论 -
Redis哨兵(Sentinel)
一、哨兵模式概述 哨兵模式想解决什么问题 在Redis集群部署的背景下,如果主服务器宕机,那么需要人工手动将从服务器切换成主服务器。这会导致一段时间内Redis服务器(的数据槽)不能用。 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。 哨兵模式的作用 监听主节点与从节点状态...原创 2020-06-01 16:52:40 · 375 阅读 · 0 评论 -
Redis监听Key失效
之前我使用过使用Redisson这种Redis的框架实现过延时发送。今天突然好奇,在SpringBoot中,Redis能监听到Key失效事件吗?经过查资料,答案是肯定的,可以监听Key失效,但是有缺陷,监听事件里面只能拿到Key,不能拿到这个Key对应的Value。所以说,在生成这个Key的时候,需要把这个Key对应的Value存放到数据库中,以便在失效事件中再去查询一下数据库。 Redis的Key失效事件在SpringBoot中可以做一些订阅功能,比如延时发送邮件等。......原创 2020-05-26 16:42:01 · 5386 阅读 · 3 评论 -
Redis常见挑战汇总
Redis在同一时刻出现大量缓存过期(缓存击穿挑战) 大量缓存在同一时刻过期,并且有大量的请求直接发送到数据库上,其本质上就是缓存击穿。很多缓存数据都是由定时任务刷出来的,所有它们的失效时间都很集中。如果正好在失效的时候出现大量的请求,这些请求就直接打在数据库上了,数据库可能会压力骤增而宕机。解决办法有两个,在批量加入缓存数据的时候,为失效时间加入一个随机值。另外就是RateLimiter等组件来限流,防止短时间出现大量的请求进入系统。 刻意练...原创 2020-05-26 09:56:22 · 378 阅读 · 0 评论 -
Redis持久化之AOF
一、定义 AOF是将所有的Redis的写命令记录到文件中,这个文件叫做AOF文件。二、开启############################## APPEND ONLY MODE ###############################appendonly yes #默认的是no #是否开启appendfilename "appendonly.aof" #文件名称# appendfsync always a...原创 2020-05-14 17:18:55 · 357 阅读 · 0 评论 -
Redis持久化之RDB
一、RDB是什么 Redis一旦断电或者宕机,那么内存数据库中的数据将会全部丢失。 为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能。Redis 支持两种形式的持久化,一种是RDB快照(snapshotting),另外一种是AOF。二、RDB自动配置 在 redis.conf 配置文件中的 SNAPSHOTTING 下,有默认如下的配置。 这里是用来配置触发 Redis的持久化条件,也就是什么时候将...原创 2020-05-12 17:57:32 · 298 阅读 · 0 评论 -
第十一节 缓存雪崩、热点数据失效
一、缓存雪崩概念 缓存雪崩可以理解为Redis宕机,所有缓存都失效了。所有请求都瞬间打在了数据库上。 解决方法:(1)使用RateLimiter组件等进行请求限流(2)搭建Redis主从服务器二、热点数据失效 热点数据失效:热点数据集体失效。 解决办法:(1)热点数据永不失效。(2)限流。...原创 2020-03-07 15:48:26 · 338 阅读 · 0 评论 -
第十节 缓存击穿
一、缓存击穿概念 缓存击穿是大量的请求同时查询同一个缓存,但是此时缓存突然失效了,那么顺理成章的,这些大量的请求就会去查询数据库。这样的后果是,短时间内数据库会出现大量的查询请求,有可能会让数据库压力过大而宕机。二、实例代码 ...原创 2020-03-07 15:42:41 · 343 阅读 · 0 评论 -
第九节 缓存穿透
一、缓存穿透概念 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。 因此,如果如果查询一个不存在的key,此流程会查询一次Redis缓存,再查询一次DB。如果被别有用心的人利用,或者说短时间内出...原创 2020-03-07 14:47:52 · 357 阅读 · 0 评论 -
第八节 缓存失效
一、业务场景 用户添加了一个订单。将订单通过订单编号存储到Redis中,形成 【订单号----未支付订单】 这种缓存。 存放在Redis中的订单,有过期时间。如果超过指定的缓存时间,则从Redis中删除此缓存。 有一个定时任务,以一定的周期向数据库中查询没有支付的订单。拿到了这些订单数据,通过订单编号去Redis中对比。 ...原创 2020-02-19 20:29:59 · 525 阅读 · 0 评论 -
第七节 数据字典:Hash哈希
一、心法 Redis hash 是一个 string 类型的 field 和 value 的映射表,当然这里的string类型是指将数据序列化后的字符串。 常见业务场景就是来缓存键值对。我举个例子,有一个班级里有三十个学生,每个学生都有唯一的学号,那么就能够使用Redis的hash进行存储。班级作为标识这些学生一个共性(key),也就是说可以通过这个班级来找到这...原创 2020-02-18 21:53:24 · 560 阅读 · 0 评论 -
第六节 SortedSet典型排行榜场景
一、心法 Zset或者说是SortedSet,是Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。 SortedSet不能重复,拥有一个权重score来从小到大排序。...原创 2020-02-16 20:55:51 · 1761 阅读 · 0 评论 -
第五节 唯一性与无序性的好朋友Set
一、Set典型应用场景 Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。从实际业务角度来考虑其应用场景。首先,Set它是一个集合,自然能够存放多个对象。多个对象之间各不相同,另外存放的顺序也是不固定的。 典型的应用场景就是来做唯一性校验。如果某张表有个字段是唯一的,例如用户绑定的电话号码、手机号,那...原创 2020-02-16 15:37:25 · 435 阅读 · 0 评论 -
第四节 List作为消息中间件
一、基本依据 Redis的List是一个队列。对于队列这种数据结构来说,有两个非常重要的特性。可左进右出,亦可右进左出。那么,基于这种特点,就能够通过Redis的List实现基本的消息中间件。 从具体的代码上来看,可以先把一些数据使用 leftPush方法加入Redis的队列中。再通过同一key从Redis中指定队列中取出来,这个方法叫做rightPop。...原创 2020-02-15 17:05:04 · 894 阅读 · 2 评论 -
第三节 List典型场景
一、心法 可以从Redis的List类型的数据结构来考虑其实际业务场景。Redis的List这种数据结构与Java中的List集合大致不离其宗。实际上就是一个容器来存放多组数据。从其数据结构的特点上来看,符合"一对多"的特点。因此,我们可以迅速联想到,可以使用Redis来缓存"一对多"的热点数据。例如,在电商系统中,可以用于缓存某个用户的历史订单,又比如可以缓存多...原创 2020-02-12 15:58:59 · 464 阅读 · 0 评论 -
第二节 String典型场景
一、快速引入Redis SpringBoot中快速集成Redis的三个步骤。导入依赖,增加配置文件,增加配置代码 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring...原创 2020-02-09 11:53:55 · 671 阅读 · 0 评论 -
第一节 Redis常见业务场景
前言 以前在实习的时候,去Redis官网学了不少命令。不过现在看来,当初只是学到了一些简单的命令。等到实际工作中,在SpringBoot中也快速的集成了Redis。但是到底Redis应用在哪些实际场景中,我之前一直没有深入研究过。现在,我想好好研究一下Redis,因为在实际项目中,引入一个中间件是一件十分谨慎的事情。作为研发负责人,一旦吃不透某种技术,在生产库上出现问题,若无人能...原创 2020-02-04 18:04:05 · 672 阅读 · 0 评论 -
使用Redis客户端
1 运行Redis Redis安装步骤:https://www.jianshu.com/p/e16d23e358c0 命令行切换到Redis安装目录,输入 redis-server.exe redis.windows.conf Creating Server TCP listening socket 127.0.0.1:6379: bind...原创 2018-11-12 23:01:16 · 531 阅读 · 0 评论