
缓存中间件
文章平均质量分 89
狂奔的蜗牛Evan
hello world
展开
-
springboot源码探究3--spring cache探究 默认SimpleCacheConfiguration
题外话:这里还有个有意思的需要探究的源码:@Conditional,在spring容器加载时候的实现的步骤,上面根据debug显示最终执行完剩下GenericCacheConfiguration,NoOpCacheConfiguration,SimpleCacheConfiguration。那么咱们就debug看看,是不是这样(不好意思,持有怀疑态度去面对前辈)再在方法上写上下面的注解,就可以直接用了,通过debug调试可以发现,第二次触发,没有再走下面return的dao层的方法,返回的是缓存中的数据。转载 2024-03-12 23:28:39 · 277 阅读 · 0 评论 -
SpringBoot整合SpringCache详解
明明我们项目中使用最多的缓存技术就是Redis,用Redis就完全就可以搞定缓存的问题了,为什么还有一个,以及和Redis之间的区别。转载 2024-03-08 22:42:23 · 306 阅读 · 0 评论 -
Redis基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概览Redis提供的高级能力,并在部署、维护、性能调优等多个方面进行更深入的介绍和指导。本文适合使用Redis的普通开发人员,以及对Redis进行选型、架构设计和性能调优的架构设计人员。目录 概述 Redis的数据结构和相关常用命令 数据持久化 内存管理与数据淘汰机制 Pipelining 事务与Scripting Red转载 2021-12-20 22:54:16 · 352 阅读 · 0 评论 -
内存耗尽后Redis会发生什么(内存回收、过期策略、淘汰策略)
前言作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当Redis服务器的内存耗尽后,如果继续执行请求命令,Redis会如何处理呢?内存回收使用Redis服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以给键值对设置有效期。Redis中可以通过4个独立的命令来给一个键设置过期时间: expire key ttl:将key值的过期时间设置为ttl秒。 pexpire key ttl:将key...转载 2021-12-20 22:26:43 · 300 阅读 · 0 评论 -
Redis低成本高可用方案设计(Sentinel)
关于Redis高可用方案,看到较多的是keepalived、zookeeper方案。keepalived是主备模式,意味着总有一台浪费着。zookeeper工作量成本偏高。本文主要介绍下使用官方sentinel做redis高可用方案的设计。阅读目录: Redis Sentinel 故障转移消息接收的3种方式 整体流程图 总结 Redis SentinelSentinel介绍Sentinel是Redis官方为集群提供的高可用解决方案。在实际项目中可以使用转载 2021-12-16 23:16:38 · 174 阅读 · 0 评论 -
【Redis】Redis使用“:”对key进行分类存储
通常存在redis中的key值是这个样子的,只看key值,我们很难知道这个key值是干什么的,有什么用处。所以需要我们对key值进行一定的分类:使用“:”冒号来体现层次。例如:set intern:user:user_code 123456 得到形式如下:原文地址:https://blog.csdn.net/n950814abc/article/details/94199597...转载 2021-08-25 11:02:51 · 778 阅读 · 0 评论 -
【Redis】缓存的三大问题及其解决方案
Redis经常用于系统中的缓存,这样可以解决目前IO设备无法满足互联网应用海量的读写请求的问题。一、缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起id为-1的数据或者特别大的不存在的数据。有可能是黑客利用漏洞攻击从而去压垮应用的数据库。1. 常见解决方案对于缓存穿透问题,常见的解决方案有以下三种: 验证拦截:接口层进行校验,如鉴定用户权限,对ID之类的字段做基础的校验,如id<=0的字段直接拦截; 缓存空数据:当数据库查询到的数据为空时,也将转载 2021-07-12 15:31:11 · 165 阅读 · 0 评论 -
架构:进程缓存和缓存服务,如何抉择?
概述我们所说的缓存分为进程内部缓存(系统内部缓存)和 缓存服务(如redis/memcache)。计算机服务从原来的单体结构,到多实例,到现在流行的微服务,缓存服务变得原来越流行了。进程缓存先说说进程缓存,它将数据存储在站点、服务的进程内。在Web的发展历史上,这样的方式备受欢迎。比如早期常用的.Net的 System.Web.Caching.这种实现载体很简单,比如一个带锁的HasTable,或者一个List对象。使用简单便捷,能存储数据、html页面片段、文件,甚至任何对象。在...转载 2021-07-05 23:28:48 · 221 阅读 · 0 评论 -
秒杀商品超卖事故:Redis分布式锁请慎用!
前言基于Redis使用分布式锁在当今已经不是什么新鲜事了。本篇文章主要是基于我们实际项目中因为redis分布式锁造成的事故分析及解决方案。背景:我们项目中的抢购订单采用的是分布式锁来解决的。有一次,运营做了一个飞天茅台的抢购活动,库存100瓶,但是却超卖了!要知道,这个地球上飞天茅台的稀缺性啊!!!事故定为P0级重大事故...只能坦然接受。整个项目组被扣绩效了~~事故发生后,CTO指名点姓让我带头冲锋来处理,好吧,冲~事故现场经过一番了解后,得知这个抢购活动接口以前从来没有出现过这种情.转载 2021-04-26 10:11:15 · 669 阅读 · 0 评论 -
以商品超卖为例讲解Redis分布式锁
以商品超卖为例讲解Redis分布式锁本案例主要讲解Redis实现分布式锁的两种实现方式:Jedis实现、Redisson实现。网上关于这方面讲解太多了,Van自认为文笔没他们好,还是用示例代码说明。一、jedis实现该方案只考虑Redis单机部署的场景1.1 加锁1.1.1 原理jedis.set(String key, String value, String nxxx, String expx, int time)key: 使用key来当锁,因为key是唯一的;.转载 2021-04-26 09:52:19 · 280 阅读 · 0 评论 -
分布式锁之Redis实现 (以及Redisson可重入锁源码)
在Java中,关于锁我想大家都很熟悉。在并发编程中,我们通过锁,来避免由于竞争而造成的数据不一致问题。通常,我们以synchronized 、Lock来使用它。但是Java中的锁,只能保证在同一个JVM进程内中执行。如果在分布式集群环境下呢?一、分布式锁分布式锁,是一种思想,它的实现方式有很多。比如,我们将沙滩当做分布式锁的组件,那么它看起来应该是这样的:加锁在沙滩上踩一脚,留下自己的脚印,就对应了加锁操作。其他进程或者线程,看到沙滩上已经有脚印,证明锁已被别人持有,则等待。解锁把脚转载 2021-04-25 17:10:24 · 343 阅读 · 0 评论 -
【架构】深入浅出百亿请求高可用Redis(codis)分布式集群揭秘
摘要:作为noSql中的kv数据库的王者,redis以其高性能,低时延,丰富的数据结构备受开发者青睐,但是由于redis在水平伸缩性上受限,如何做到能够水平扩容,同时对业务无侵入性是很多使用redis的开发人员都会面临的问题,而redis分布式解决方案的一个开源产品【codis】较好的弥补了这一弱势,本文主要讲解codis是如何做到对业务无感知,平滑迁移,迁移性能高,迁移异常处理,高可用以及常见的redis的避坑指南,虽然codis目前随着公司的nosql产品越来越成熟,生命周期也即将结束,不过鉴于还有很多转载 2021-04-25 16:36:16 · 616 阅读 · 0 评论 -
Redis高可用,高性能,架构演进史
Redis高可用,高性能,架构演进史介绍上个礼拜,我搭建了一个mongo分片集群,发现分布式系统保证高可用和高性能的套路都差不多。高性能就是做分片(可以类比为分库分表,将数据分到不同服务器上),在Kafka中叫分区,在mongodb中叫shard,在HDFS上叫DataNode。而保证高可用的方式就是做交叉备份。然后我很好奇Redis是怎么部署的。上测试环境查看集群的状态info replication输出如下,好吧,没有做高可用,一个master节点开跑。# Replicati转载 2021-04-25 16:06:28 · 164 阅读 · 0 评论 -
Spring Redis中使用Lua脚本实现高并发原子操作
Spring Redis中使用Lua脚本实现高并发原子操作1. 前言在上一文中我对 Lua 语言的一些简单的语法及其在 Redis 中的操作进行了介绍,但是在 Java 开发中我们还需要进一步的学习才能使这种技术落地。今天就结合Spring Data Redis这个我们经常使用的 Redis 开发组件来实际尝试一下 Lua 脚本。2. Lua 实现抽奖模拟一个抽奖场景,从奖池中进行随机抽奖。规则如下:中奖的人只能从奖池中抽取。 每个人只能中奖一次。 中奖总人数不能超过奖项的设置数。转载 2021-04-25 15:43:34 · 361 阅读 · 0 评论 -
Redis中Lua脚本入门介绍(redis原子性调用)
一网打尽Redis Lua脚本并发原子组合操作1. 前言Redis 是高性能的 KV 内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO 地理位置信息计算。Redis 提供了丰富的命令来供我们使用以实现一些计算。Redis 的单个命令都是原子性的,有时候我们希望能够组合多个 Redis 命令,并让这个组合也能够原子性的执行,甚至可以重复使用。Redis 开发者意识到这种场景还是很普遍的,就在 2.6 版本中引入了一个特性来解决这个问题,这就是 Redis 执行转载 2021-04-25 15:19:18 · 632 阅读 · 0 评论 -
Spring Boot Redis 实现分布式锁,真香!!
之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis、Zookeeper 中间件,另外还支持 JDBC。本篇栈长以 Redis 为例(这也是用得最多的方案),教大家如何利用 Spring Boot 集成 Redis 实现缓存,如何简单、快速实现 Redis 分布式锁。分布式锁介绍Spring Boot 实现 Redis 分布式锁在spring-integration这个项目中,参考:https://docs.spring.io/..转载 2021-01-05 23:59:11 · 1050 阅读 · 0 评论 -
Spring Boot 如何快速集成 Redis?
Spring Boot 如何快速集成 Redis?没错,栈长本文教你,让大家少走弯路!添加依赖使用像 Redis 这类的NoSQL数据库就必须要依赖spring-data-redis这样的能力包,开箱即用,Spring Boot 中都封装好了:引入spring-boot-starter-data-redis:<dependency><groupId>org.springframework.boot</groupId><artifac...转载 2021-01-05 23:24:51 · 145 阅读 · 0 评论 -
Spring Boot 如何快速集成 Redis 哨兵?
前面的分享栈长介绍了如何使用 Spring Boot 快速集成 Redis,上一篇是单机版,也有粉丝留言说有没有 Redis Sentinel 的集成教程,这篇开搞!Redis Sentinel 介绍Redis Sentinel:哨兵,放哨,看中文名字就知道它是一种 Redis 高可用解决方案,主要是针对 Redis 主从模式实现主从节点监控、故障自动切换。没有 Redis Sentinel 架构之前,如果主节点挂了,需要运维人员手动进行主从切换,然后更新所有用到的 Redis IP 地址参数再转载 2021-01-05 23:11:28 · 169 阅读 · 0 评论 -
大白话布隆过滤器-BloomFilter
本文是站在小白的角度去讨论布隆过滤器,如果你是科班出身,或者比较聪明,又或者真正想完全搞懂布隆过滤器的可以移步。不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛身在互联网,做着开发的,无人不知,无人不晓,哪怕对技术不是很关心的小伙伴也听过它的名号。我也花了不少时间去研究布隆过滤器,看了不少博客,无奈不是科班出身,又没有那么聪明的头脑,又比较懒...经过“放弃,拿起,放弃,拿起”的无限轮回,应该算是了解了布隆过滤器的核心思想,所以想给大家分享下。布隆过滤器的应用我们先来看下布隆过转载 2021-01-05 17:33:38 · 202 阅读 · 0 评论 -
布隆过滤器-BloomFilter
概述本文主要介绍:BloomFilter原理 使用Google Guava的BloomFilterBloomFilter原理BloomFilter主要用于检索一个元素是否在集合中。优点是空间效率和查询效率比较高。缺点是存在误判率。实现1.定义一个位数组2.添加元素使用k个哈希函数映射到位数组中,把位数组指定下标设置为13.判断元素是否在集合中对元素使用k个哈希函数计...转载 2019-12-11 15:58:03 · 361 阅读 · 0 评论 -
缓存,确实很香,却也很受伤!
缓存的使用,是一个逐渐演进的过程。问一下你自己,最直接的使用缓存的原因是什么?无它,唯快而已!追溯一下自己最开始使用缓存的场景,一些数据库里存储的不变的配置信息,服务启动时,直接加载到本地公共模块,方便其它功能模块共享使用。这便是最基本,最简单的本地缓存应用。一、服务与缓存所谓的服务,简而言之,一层应用 + 一层数据,应用从数据层获取数据然后加工输出。数据层,通常我们指的是持久化介质上的持久化存储。它有多种形式的,可以是文件,或者数据库。数据存储在持久化介质上,而应用运行与内存中转载 2021-01-05 17:09:16 · 97 阅读 · 0 评论 -
第十二章 redis-cluster搭建(redis-3.2.5)
redis集群技术redis2.x使用客户端分片技术 redis3.x使用cluster集群技术一、环境os:centos7 ip:10.211.55.4 redis:3.2.5 gem-redis:3.2.2二、搭建集群1、本机下载redis-3.2.5.tar.gzredis官网:https://redis.io/download2、从本机拷贝到10.211.55.4scp redis-3.2.5.tar.gz root@10.211.55.4:/opt/3、进入10转载 2020-06-17 18:19:28 · 249 阅读 · 0 评论 -
第十一章 自己实现一致性hash算法
关于一致性hash算法的意义以及其相对于简单求余法(除数求余法)的好处,查看第六章 memcached剖析注意:真实的hash环的数据结构是二叉树,这里为了简便使用了列表List1、一致性hash算法的使用地方memcached服务器 Jedis分片机制2、真实服务器节点没有虚拟化的一致性hash算法实现ServerNode:真实服务器节点 1 package hash; 2 3 /** 4 * server节点 5 */ 6 public cl..转载 2020-06-16 17:28:19 · 304 阅读 · 0 评论 -
第十章 Redis持久化--RDB+AOF
注:本文主要参考自《Redis设计与实现》1、Redis两种持久化方式RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中直接存储的是key-values的二进制形式,对于恢复数据也快) 缺点:在save配置条件之间若发生宕机,此间的数据会丢失 AOF 执行机制:将对数据的每一条修改命令追加到aof文件 优点:数据不容易丢失 缺点:性能较低(每一条修改操作都转载 2020-06-16 17:24:48 · 209 阅读 · 0 评论 -
第八章 Redis数据库结构与读写原理
注:本文主要参考自《Redis设计与实现》1、数据库结构每一个redis服务器内部的数据结构都是一个redisDb[],该数组的大小可以在redis.conf中配置("database 16",默认为16),而我们所有的缓存操作(set/hset/get等)都是在redisDb[]中的一个redisDb(库)上进行操作,这个redisDb默认是redisDb[0]。注意:可以通过"select 1"来选择接下来的操作在redisDb[1]上进行操作 在实际使用中,我们只在redisDb转载 2020-06-16 17:05:59 · 354 阅读 · 0 评论 -
第六章 memcached剖析
注:本篇博客参考于两本书。《memcached全面剖析》,该书籍市面上应该没有,我传到了百度云盘,链接如下:http://pan.baidu.com/s/1qX00Lti 《大型网站技术架构:核心原理与案例分析》前提:本文是基于memcached1.4版本的,之前的版本与该版本在一些地方是不一样的(eg.《memcached全面剖析》的memcached1.2的内存管理方式就与1.4不同) 在看本文之前,最好先看一下memcached在实际开发中怎么进行操作的,链接《第八章 企业项目开发--分转载 2020-06-16 17:01:48 · 254 阅读 · 0 评论 -
第一章 常用的缓存技术
1、常见的两种缓存本地缓存:不需要序列化,速度快,缓存的数量与大小受限于本机内存 分布式缓存:需要序列化,速度相较于本地缓存较慢,但是理论上缓存的数量与大小无限(因为缓存机器可以不断扩展)2、本地缓存Google guava cache:当下最好用的本地缓存 Ehcache:spring默认集成的一个缓存,以spring cache的底层缓存实现类形式去操作缓存的话,非常方便,但是欠缺灵活,如果想要灵活使用,还是要单独使用Ehcache Oscache:最经典简单的页面缓存3、分布式缓存转载 2020-06-16 16:47:53 · 248 阅读 · 0 评论 -
Redis过期策略
注:本文主要参考自《Redis设计与实现》1、设置过期时间expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, String value)--字符串独有的方式具体的使用方式:查看"java企业项目开发实践"的第九章 企业项目开发--分布式缓存Redis(1)和第十章 企业项目开发--分布式缓存Redis(2)注意:除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间 如果没有设置时转载 2020-06-16 16:34:21 · 172 阅读 · 1 评论 -
Redis内存淘汰策略,看这一篇就够了!
Redis作为当前最常用的开源内存数据库,性能十分高,据官方数据表示Redis读的速度是110000次/s,写的速度是81000次/s 。而且Redis支持数据持久化,众多数据结构存储,master-slave模式数据备份等多种功能。但是长期将Redis作为缓存使用,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降。此时如何淘汰无用数据释放空间,存储新数据就变得尤为重要了。对此,Redis在生产环境中,采用配置参数maxmemo转载 2020-06-16 16:30:50 · 262 阅读 · 0 评论 -
redis持久化、可用性及压力过大问题的解决
通过学习整理其他优秀资源,本文解决三个问题:redis如何持久化? 生产环境中,redis的可用性如何保证? redis中遇到存到存储上限如何解决?一、redis持久化redis是基于内存的, 内存特点是断电易失。就必然涉及到持久化操作。redis持久化有两种方式:快照(rdb)和日志(aof)。1.快照和日志快照类似于序列化和反序列化过程。把数据序列化成二进制放到磁盘,加载时把磁盘当中的数据直接反序列化,读过来,不需要执行什么。日志:redis每用一个操作(写、修改),就把操作写转载 2020-06-16 16:17:42 · 1239 阅读 · 0 评论 -
redis pool config的配置参数 - JedisPoolConfig
redis pool config的配置参数1、获取jedis实例时,实际上可能有两类错误。一类是pool.getReource(),得不到可用的jedis实例;另一类是jedis.set/get时出错也会抛出异常;为了实现区分,所以根据instance是否为null来实现,如果为空就证明instance根本就没初始化,也就不用return给pool;如果instance不为null,则...转载 2018-11-29 09:32:25 · 23975 阅读 · 2 评论 -
关于redis的主从、哨兵、集群
关于redis主从、哨兵、集群的介绍网上很多,这里就不赘述了。一、主从通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有...转载 2018-11-20 18:35:21 · 149 阅读 · 0 评论