首页 > 数据库 >redis本地缓存

redis本地缓存

时间:2022-10-10 17:48:28浏览次数:45  
标签:缓存 数据库 redis lettuce 雪崩 本地 数据

我不想带给你负面情绪,但又想让你知道我的不开心。

为了系统性能的提升,一般会将部分数据放入缓存中,加快访问速度。而db承担数据罗盘工作。

哪些数据适合放在缓存

  • 及时性、数据一致性要求不高的

  • 访问量大且更新频率不高的数据(读多、写少

springboot整合redis

  1. 导入需要的依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 在配置文件中配置redis主机地址

spring:
redis:
  host:
  port:
  1. 使用时进行自动注入RedisTemplate(如下:使用示例)

ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
String catalogJson = ops.get("catalogJson");
// 每次查询先在缓存中进行查找,有的话直接查询缓存
if (catalogJson == null) {
   // 缓存没有,去数据库中查询,查询之后把结果放在缓存中
   Map<String, List<Catalog2Vo>> categoriesDb = getCategoriesDb();
   String toJSONString = JSON.toJSONString(categoriesDb);
   ops.set("catalogJson",toJSONString);
   return categoriesDb;
}
// 从redis中查出的是json数据,需要进行一层转换(序列化与反序列化)
Map<String, List<Catalog2Vo>> listMap = JSON.parseObject(catalogJson, new TypeReference<Map<String, List<Catalog2Vo>>>() {});
return listMap;

Jedis替换lettuce

当进行压力测试时后期出现堆外内存溢出OutOfDirectMemoryError

产生原因:

  1. springboot2.0以后默认使用lettuce作为操作redis的客户端,它使用netty进行网络通信。

  2. lettuce的bug导致netty堆外内存溢出。netty如果没有指定堆外内存,默认使用XMS的值,可以使用 -Dio.netty.maxDirectMemory进行设置。

解决方案:由于是lettucebug造成,不要直接使用-Dio.netty.maxDirectMemory去调大虚拟机堆外内存,治标不治本。

  1. 升级lettuce客户端。但是没有解决的

  2. 切换使用jedis

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <exclusions>
       <exclusion>
           <groupId>io.lettuce</groupId>
           <artifactId>lettuce-core</artifactId>
       </exclusion>
   </exclusions>
</dependency>
<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
</dependency>

缓存失效

缓存穿透(查询一个永不存在的数据)

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大

解决:缓存空对象(加一个短暂的过期时间)、布隆过滤器、mvc拦截器。

缓存雪崩(大面积key同时失效)

缓存雪崩是指在我们设置缓存时key采用了相同的过期时间,导致缓存在某一时刻同时失效请求全部转发到DB,DB瞬时压力过重雪崩

解决方案:

  • 规避雪崩:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

  • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同缓存数据库中。

  • 设置热点数据永远不过期。

  • 出现雪崩:降级 熔断

  • 事前:尽量保证整个 redis 集群的高可用性,发现机器宕机尽快补上。选择合适的内存淘汰策略。

  • 事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL崩掉

  • 事后:利用 redis持久化机制保存的数据尽快恢复缓存

缓存击穿(单点key被高频访问)

缓存雪崩和缓存击穿不同的是:

  • 缓存击穿 指 并发查同一条缓存中没有的数据。缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

  • 缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

  • 设置热点数据永远不过期。

  • 加互斥锁:业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db去数据库加载,而是先使用缓存工具的某些带成功操作返回值的操作(比如RedisSETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。

缓存击穿怎么加锁

加本地锁synchronized(this),不能解决分布式服务的问题,有几台机器就会放掉几个线程。

锁时序问题:之前的逻辑是查缓存没有,然后取竞争锁查数据库,这样就造成多次查数据库。

解决方法:竞争到锁后,再次确认缓存中没有,再去查数据库,第一个线程查到之后放到缓存中,后续的查询就可以查缓存了

如何复制微服务

模拟多台机器服务

右键点击服务,copy configuration

在program arguments: --server.port=10003
 

标签:缓存,数据库,redis,lettuce,雪崩,本地,数据
From: https://www.cnblogs.com/l12138h/p/16776558.html

相关文章

  • Redis都有哪些使用场景
    聊聊Redis现状Redis作为一种内存型的非关系型的数据库,不管在互联网大厂,小厂,大项目和小项目中,几乎都会被使用。为什么Redis会受到如此青睐呢?关于这个问题,可能很多的程序员......
  • Redis都有哪些使用场景
    聊聊Redis现状Redis作为一种内存型的非关系型的数据库,不管在互联网大厂,小厂,大项目和小项目中,几乎都会被使用。为什么Redis会受到如此青睐呢?关于这个问题,可能很多的程序员只......
  • 【Redis】常用命令
    查看内存#redis-cli127.0.0.1:6379>auth123456127.0.0.1:6379>infomemory结果#Memoryused_memory:42030440used_memory_human:40.08Mused_memory_rss:463......
  • CentOS配置本地yum源
    title:CentOS配置本地yum源categories:[CentOS]tags:CentOStop:20CentOS配置本地yum源为了方便测试与开发,常常需要在虚拟机上安装各种开发环境,如果没有yum源......
  • k8s中部署redis集群(三主三从)
    1环境说明主机名系统版本IP地址cpu/内存/磁盘用途软件版本k8s_nfsCentOS7.5172.16.1.602核/2GB/60GBnfs存储nfs-utils-1.3.0-0.68k8s-master1CentOS7.5172.16.1.812核/2GB/......
  • 本地部署安装Calico网络
    2 本地部署安装Calico网络(1)官方文档:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises(2)我这里集群使用的calico版本......
  • C# 获取本地IP地址
    1///<summary>2///获取本地的IP地址3///</summary>4///<returns></returns>5publicstaticstringGetAddressIP()6{7stringAddressIP=st......
  • 什么是缓存雪崩?服务器雪崩的场景与解决方案
    目录什么是应用服务雪崩雪崩效应产生的几种场景缓存雪崩的解决方案雪崩的整体解决方案熔断设计隔离设计超时机制设计如何提前发现雪崩 什么是应用服务雪......
  • Redis理论
    什么是RedisRedis(RemoteDictionaryServer)是使用C语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。Redis可以存储键和五种不同类型的值之间的映射。键......
  • jsp操作本地数据库
    @目录环境准备检查驱动下载驱动配置Tomcat配置idea开始上手测试连接主界面显示列出全部学生模块实现条件查询学生模块实现添加学生模块实现条件删除学生模块实现条件修改学......