首页 > 数据库 >缓存击穿 redis

缓存击穿 redis

时间:2023-11-15 18:13:27浏览次数:34  
标签:缓存 redis 击穿 employee import opsForHash redisTemplate

缓存穿透

1、缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。

解决缓存穿透的方法一般有两种,第一种是缓存空对象,第二种是使用布隆过滤器。

 

缓存击穿

2、缓存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。

解决缓存击穿的方法也有两种,第一种是设置key永不过期;第二种是使用分布式锁。

 

试试双重检查 来避免 缓存击穿

 

import cn.hutool.json.JSONUtil;
import com.jin.pagehelper.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.math.BigInteger;
import java.util.Date;

@SuppressWarnings("all")
@Service
public class RedisService {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    @PostConstruct
    public void init() {
        if (redisTemplate.opsForHash().hasKey("employee", "1")) {
            redisTemplate.opsForHash().delete("employee", "1");
        }
    }

    public void setValueTest() {
        redisTemplate.opsForHash().put("employee", "1",
                JSONUtil.parse(
                        new Employee()
                                .setEmployeeId(BigInteger.valueOf(1))
                                .setFirstName("jin")
                                .setLastName("jin")
                                .setHireDate(new Date())
                )
        );
        System.out.println("ok");

    }

    public void getOps() throws InterruptedException {
        Object object = redisTemplate.opsForHash().get("employee", "1");
        if (object == null) {
            synchronized (this) {
                object = redisTemplate.opsForHash().get("employee", "1");
                if (object == null) {
                    System.out.println("redis没有,只能从数据库找");
                    setValueTest();
                } else {
                    System.out.println("并发情况下,从redis拿到了");
                }
            }

        } else {
            System.out.println("正常情况下,从redis拿到了");
        }
    }


}

 

自己模拟一个并发情况,做试验。

     ExecutorService executorService = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 10; i++) {
            executorService.submit(() -> {
                try {
                    redisService.getOps();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
        }

 

 

标签:缓存,redis,击穿,employee,import,opsForHash,redisTemplate
From: https://www.cnblogs.com/wuyicode/p/17834426.html

相关文章

  • Redisson分布式锁的实现
    分布式锁在多线程环境下,如果多个线程同时访问共享资源(数据库),往往会发生数据竞争。要想在某一线程访问资源时,令其他线程阻塞等待,就需要使用分布式锁,确保共享资源同时只有一个线程访问。实现思路:向Redis中插入同一key:A插入key,如果成功则获取到锁,B再来插入式发现key已经存在了,则......
  • MySql与Redis双写方案
    一、简介    有两种同步方案:通过MySQL自动同步刷新Redis,MySQL触发器+UDF函数实现。解析MySQL的binlog实现,将数据库中的数据同步到Redis 。二、方案一:UDF    2.1、场景分析        当我们对MySQL数据库进行数据操作时,同时将相应的数据同步到......
  • redis 集群部署
    在生产环境不存在单体果奔的数据库,且云厂商rds等高可用数据库性价比极低,因此很多场景需要我们使用实例自建集群。本章介绍如何从0开始搭建redis7三主三从基础集群环境与故障迁移模拟测试。预备姿势vm模拟环境vmwarecetos7.9//关闭防火墙与selinuxredis7|6均可xsh......
  • Redis数据结构之动态字符串SDS
    动态字符串SDS我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:V获取字符串长度的需要通过运算V非二进制安全V不可修改Redis构建了一种新的字......
  • Redis
    Redis1、什么是Redis?Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三个特点:202⚫Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。⚫Redis不仅仅支持简单的......
  • 服务器docker中redis和mysql连不上解决方法
    问题描述mysql报错:ERROR2013(HY000):LostconnectiontoMySQLserverat'readinginitialcommunicationpacket',systemerror:0redis报错:(总之就是本地连不上docker中的redis)通过本地Windows下telnet连服务器端口,会直接跳到没有输入telnet的画面,本地Windows能够ssh到......
  • SpringBoot系列之集成Redission入门与实践教程
    Redisson是一款基于java开发的开源项目,提供了很多企业级实践,比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用软件环境:JDK1.8SpringBoot2.2.1Maven3.2+Mysql8.0.26redisson-spring-boot-starter3.15.......
  • Cygwin工具制作Redis服务端Window版本
    文章目录前言一、cygwin是什么?二、cygwin安装Redis源码编译前言在学习到redis,经常需要用到一个redis服务端,如果有买服务器或者本机可以支持经常开虚拟机,也是可以的,如果不具备这些条件,还是本机window系统直接安装一个redis服务端方便。不过新的版本,在微软维护的redis版本库已经很......
  • Redis系列之常见数据类型应用场景
    文章目录String简单介绍常见命令应用场景Hash简单介绍常见命令应用场景List简单介绍常见命令应用场景Set简单介绍常见命令应用场景SortedSet(Zset)简单介绍常见命令应用场景Bitmap简单介绍常见命令应用场景附录Redis支持多种数据类型,比如String、hash、list、Set、SortedSet、S......
  • Redis系列之实现分布式自增主键
    软件环境JDK1.8SpringBoot2.2.1Maven3.2+Mysql8.0.26redis6.2.14MybatisPlus3.4.3.4开发工具IntelliJIDEAsmartGit一、实现原理使用Redis来实现分布式的主键自增主要是依赖于Redis的INCR命令,调用INCR命令的对应key,其数值是实现递增加一,所以利用这个性质,将redis独立部署起来......