Redis数据库/缓存

本文介绍了Redis的简介、SpringBoot项目中的入门配置,包括连接参数、线程池设置,并详细讨论了雪崩、击穿、穿透问题及其解决方案,如分布式缓存、随机过期时间、缓存标记和BloomFilter等技术应用。
摘要由CSDN通过智能技术生成


简介

redis是一个非关系型数据库,nosql,键值对数据库,是用Hibernate写的,自带二级缓存,可当session用,缓存的数据一定是不更改或者不频繁更改的数据

入门配置

安装见详情文档(我有)

  1. 在SpringBoot项目的pom.xml文件中添加redis依赖,或在创建时直接勾选
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  1. 配置application.properties
# redis基础配置
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.post=6379
# 连接超时时间 单位毫秒
spring.redis.timeout=3000

# redis线程池设置
# 连接池中的最大空闲连接,默认值是8
spring.redis.jedis.pool.max-idle=200
# 连接池中的最小空闲连接,默认值是0
spring.redis.jedis.pool.min-idle=200
# 如果赋值为-1,则表示为不限制,pool已经分配了max-active个jedis实例
spring.redis.pool.max-active=2000
# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时
spring.redis.pool.max-wait=1000
  1. 控制层小例子
@RestController
public class TestController {

	@Autowired
	private RedisTemplate redisTemplate;
	
	@PostMapping("/save/{key}")
	public Object save(@PathVariable String key,String value) {
		redisTemplate.opsForValue().set(key, value);	//设置键值对并存入redis
		return null;
	}
	
	@GetMapping("/get/{key}")
	public Object get(@PathVariable String key) {
		return redisTemplate.opsForValue().get(key);	//通过键获取值
	}
}

额外补充的配置

AppConfig 类

package com.chinasofti.demo.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component	//注册为bean,Spring会自动在启动时实例化该类并将其纳入Spring容器中
public class AppConfig implements ApplicationContextAware {
	//实现了ApplicationContextAware接口,表示要获取Spring应用上下文(ApplicationContext)的引用
	private static ApplicationContext applicationContext;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext=applicationContext;
	}

	public static Object getBean(String name) {//该静态方法用于从Spring容器中获取指定名称的Bean实例。
		//它通过调用applicationContext.getBean(name)来实现,利用之前保存的应用上下文引用来获取相应的Bean实例。
		return applicationContext.getBean(name);//
	}
}
//通过这段代码,可以在任何地方通过调用AppConfig.getBean方法来获取Spring容器中的Bean对象,
//而不需要每次都手动获取ApplicationContext对象

RedisConfig 类

package com.chinasofti.demo.config;

import java.net.UnknownHostException;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;

@Configuration // 通过该注解,告诉Spring框架这是一个配置类,需要被扫描并加载到Spring容器中
public class RedisConfig {

	@Bean
	// 会从上下文中自动注入redisConnectionFactory
	public RedisTemplate<Object, Object> redisTemplate(LettuceConnectionFactory connectionFactory)
			throws UnknownHostException {
		
		RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
		redisTemplate.setConnectionFactory(connectionFactory); //将注入的LettuceConnectionFactory设置为RedisTemplate的连接工厂
		//设置key,value的序列化   默认序列化是Jdk
		redisTemplate.setKeySerializer(new JdkSerializationRedisSerializer());
		//将序列化的对象转成json的序列化
		redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
		return redisTemplate;
	}
	/*
	 * 这段代码配置了一个名为redisTemplate的Bean,它是一个RedisTemplate实例,用于操作Redis数据库。
	 * 在方法中,通过注入LettuceConnectionFactory对象,将其设置为RedisTemplate的连接工厂,
	 * 并设置了key和value的序列化方式。这样在其他类中,可以通过@Autowired注解将redisTemplate自动注入,
	 * 从而方便地在代码中操作Redis数据库
	 */
}

雪崩、击穿、穿透的解决

面试会问!

雪崩
原理概述:当缓存中的大量数据同时失效或者缓存服务器发生故障时,大量的请求会直接打到数据库上,导致数据库压力剧增,严重时会造成数据库宕机(数据库服务器无法提供服务的状态),甚至崩溃(数据库系统无法正常工作或数据损坏的状态)

解决方案:

  • 使用分布式缓存,将缓存数据分散到多个节点上,降低单个节点失效的影响
  • 在设置过期时间的时候,加一个随机值来错开缓存过期时间,避免大量缓存同时失效
  • 添加缓存标记:记录缓存的是否失效,如果缓存标记失效,则更新数据缓存

击穿
原理概述:​当一个特定的缓存key失效或者不存在时,大量的请求会直接打到数据库上,导致数据库压力剧增

解决方案:

  • 双重检测锁机制(双重判断缓存是否为空)
  • 使用互斥锁(例如分布式锁)来保护对数据库的访问,只允许一个请求去查询数据库,其他请求等待查询结果
  • 在缓存中设置短暂的空值(null)缓存,避免大量请求直接打到数据库上

双重检测锁机制:
在这里插入图片描述

穿透
原理概述:当请求查询一个不存在于缓存和数据库中的数据时,大量的请求会直接访问到数据库上,导致数据库压力剧增

解决方案:

  • 使用布隆过滤器(Bloom Filter)等技术来过滤掉一部分无效的请求,减轻数据库压力
  • 对于频繁发生穿透的key,可以在应用层进行预先判断,避免无效的数据库查询
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不掉发的陳不錯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值