Redis 击穿&穿透&雪崩&spring data redis

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 概念:redis作为缓存,设置了key的过期时间,key在过期的时候刚好出现并发访问,直接击穿redis,访问数据库解决方案:使用setnx() ->相当于一把锁,设置的时候,发现设置过期,加锁,只有获得锁的人才可以访问DB,这样就能防止击穿。

2.png

Redis 击穿&穿透&雪崩&spring data redis

一、常见概念

  • 击穿:
  • 概念:redis作为缓存,设置了key的过期时间,key在过期的时候刚好出现并发访问,直接击穿redis,访问数据库
  • 解决方案:使用setnx() ->相当于一把锁,设置的时候,发现设置过期,加锁,只有获得锁的人才可以访问DB,这样就能防止击穿。
  • 逻辑:
1. get key
2. setnx
3. if ok addDB
   else sleep 
        go to 1
  • question1:如果第一个加锁的人挂了? 可以设置过期时间
  • question2:如果第一个加锁的人没挂,但是锁超时了? 可以使用多线程,一个线程取库,一个线程监控前一个线程是否存活,更新锁时间。
  • 穿透:
  • 概念:从业务接收查询的是你系统根本不存在的数据,这时候刚好从redis穿透到数据
  • 解决方案:使用布隆过滤器,不存在的数据使用bitmap进行拦截
  • 1.使用布隆过滤器。从客户端包含布隆过滤器的算法。
  • 2.直接redis集成布隆模块。
  • question1:布隆过滤器只能查看,不能删除?解决方案:换cuckoo过滤器。
  • 雪崩:
  • 概念:大量的key同时失效,造成雪崩。
  • 解决方案:在失效的基础上,再加入一个时间(1-5min)

二、SpringDataRedis

客户端连接,我们可以使用Jedis、lettuce、redisson...但是,我们在技术选型时,鉴于多方面考虑,选用SpringDataRedis

1.创建一个SpringBoot项目,勾选Spring Data Redis,也可以直接引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.使用序列化的方式,进行set和get值(乱码)
ValueOperations vo = redisTemplate.opsForValue();
vo.set("Hello","china");
System.out.println(vo.get("Hello"));
3.使用StringRedisTemplate来调整乱码情况
ValueOperations<String, String> svo = stringRedisTemplate.opsForValue();
svo.set("a","b");
System.out.println(svo.get("a"));
4.Hash操作
HashOperations<String,Object,Object> hash=stringRedisTemplate.opsForHash();
hash.put("sean","name","steve yu");
hash.put("sean","age","20");
hash.put("sean","sex","M");
System.out.println(hash.get("sean","name"));;
System.out.println(hash.get("sean","age"));;
System.out.println(hash.get("sean","sex"));;
5.对象操作(这边需要引入Spring Json)
HashOperations<String,Object,Object> hash=stringRedisTemplate.opsForHash();
hash.put("sean","name","steve yu");
hash.put("sean","age","20");
hash.put("sean","sex","M");
System.out.println(hash.get("sean","name"));;
System.out.println(hash.get("sean","age"));;
System.out.println(hash.get("sean","sex"));;
//5.对象转哈希存储操作
Person p=new Person();p.setAge(15);p.setName("steve yu");
Jackson2HashMapper jm = new Jackson2HashMapper(objectMapper, false);
stringRedisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
stringRedisTemplate.opsForHash().putAll("sean01",jm.toHash(p));
Map<Object, Object> map = stringRedisTemplate.opsForHash().entries("sean01");
System.out.println(map);
Person person = objectMapper.convertValue(map, Person.class);
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
1月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
24天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
70 5
|
1月前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
58 2
|
1月前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
71 10
|
1月前
|
缓存 监控 NoSQL
Redis 缓存穿透的检测方法与分析
【10月更文挑战第23天】通过以上对 Redis 缓存穿透检测方法的深入探讨,我们对如何及时发现和处理这一问题有了更全面的认识。在实际应用中,我们需要综合运用多种检测手段,并结合业务场景和实际情况进行分析,以确保能够准确、及时地检测到缓存穿透现象,并采取有效的措施加以解决。同时,要不断优化和改进检测方法,提高检测的准确性和效率,为系统的稳定运行提供有力保障。
58 5
|
1月前
|
缓存 监控 NoSQL
Redis 缓存穿透及其应对策略
【10月更文挑战第23天】通过以上对 Redis 缓存穿透的详细阐述,我们对这一问题有了更深入的理解。在实际应用中,我们需要根据具体情况综合运用多种方法来解决缓存穿透问题,以保障系统的稳定运行和高效性能。同时,要不断关注技术的发展和变化,及时调整策略,以应对不断出现的新挑战。
53 4
|
2月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
154 2
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
49 0
|
7天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
132 85