当前位置: 首页 > article >正文

引入redis缓存+本地缓存示例(Guava实现)

目录

  • 项目结构
  • 流程
  • 代码

项目结构

在这里插入图片描述

流程

先调用本地缓存进行查找,没有查看redis缓存,没有查数据库,同时添加到redis和本地缓存中
在这里插入图片描述

代码

StudentServiceImpl

package com.wunaiieq.tmp_redis_20241217.service;

import com.wunaiieq.tmp_redis_20241217.entity.Student;
import com.wunaiieq.tmp_redis_20241217.mapper.StudentMapper;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.common.cache.*;
import org.springframework.data.redis.core.RedisTemplate;


import java.util.concurrent.TimeUnit;


@Service
public class StudentServiceImpl implements StudentService{


    @Autowired
    private StudentMapper studentMapper;
    
    @Autowired
    private RedisService redisService;


    /**
     * 本地缓存
     */
    private LoadingCache<String, Student> Cache = CacheBuilder.newBuilder()
            //设置并发级别为16,并发级别是指可以同时写缓存的线程数
            .concurrencyLevel(16)
            //设置缓存容器的初始容量为1000
            .initialCapacity(1000)
            //设置缓存最大容量为10000,超过10000之后就会按照LRU最近虽少使用算法来移除缓存项
            .maximumSize(10000)
            //设缓存1小时没被使用就过期
            .expireAfterAccess(1, TimeUnit.HOURS)
            //设置要统计缓存的命中率
            .recordStats()
            //设置缓存的移除通知
            .removalListener(new RemovalListener<Object, Object>() {
                @Override
                public void onRemoval(RemovalNotification<Object, Object> notification) {
                    System.out.println(notification.getKey() + " 被移除了,原因: " + notification.getCause());
                }
            })
            .build(new CacheLoader<String, Student>() {
                @Override
                public Student load(String key) throws Exception {
                    // 如果没有缓存先从redis中获取
                    Student student0 = (Student) redisService.get("user:" + key);
                    if (student0 != null) {
                        return student0;
                    }
                    // 2、redis中没有查询数据库
                    Student student = studentMapper.selectById(key);
                    // 4、加入redis分布式缓存
                    redisService.set("student:" + key, student);
                    return student;
                }
            });


    /**
     * 根据用户id查询用户
     *
     * @param id
     * @return
     */
    @SneakyThrows
    @Override
    public Student getById(Long id) {
        // 1、从本地缓存获取
        Student o = Cache.get(id + "");
        return o;
    }
}

RedisService、RedisConfig
博客链接

Controller

package com.wunaiieq.tmp_redis_20241217.controller;

import com.wunaiieq.tmp_redis_20241217.entity.Student;
import com.wunaiieq.tmp_redis_20241217.service.StudentService;
import com.wunaiieq.tmp_redis_20241217.service.StudentServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Studentcontroller {
    @Autowired
    private StudentServiceImpl studentServiceImpl;
    @GetMapping("/getByid")
    public Student getStudent(long id){
        return studentServiceImpl.getById(id);
    }
}


StudentService

package com.wunaiieq.tmp_redis_20241217.service;

import com.wunaiieq.tmp_redis_20241217.entity.Student;
import lombok.SneakyThrows;

public interface StudentService {
    @SneakyThrows
    Student getById(Long id);
}

StudentMapper

package com.wunaiieq.tmp_redis_20241217.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wunaiieq.tmp_redis_20241217.entity.Student;

public interface StudentMapper extends BaseMapper <Student>{
}


http://www.kler.cn/a/444624.html

相关文章:

  • Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题
  • fastAPI接口的请求与响应——基础
  • Android 获取屏幕物理尺寸
  • Envoy 进阶指南(下):深入探究Envoy服务和架构
  • fpga系列 HDL:Quartus II PLL (Phase-Locked Loop) IP核 (Quartus II 18.0)
  • python实现word转html
  • 二、Jmeter Web压测
  • 解决 Git Permission denied 问题
  • 数据结构与算法-05堆优先队列-02
  • [Unity]Unity跨平台开发之Android简介
  • webpack常用配置讲解
  • 零基础学安全--wireshark简介
  • 健身达人微信小程序的设计与实现ssm+论文源码调试讲解
  • 视频监控/远程视频监控汇聚系统Liveweb网络监控解决方案
  • 【前端】CSS
  • excel 使用vlook up找出两列中不同的内容
  • Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览
  • electron窗口锁定、解锁、解决阴影问题
  • 37. Three.js案例-绘制部分球体
  • 科技查新报告需要多长时间能完成?
  • 第10章:CSS最佳实践 --[CSS零基础入门]
  • 构建一个rust生产应用读书笔记四(实战5)
  • 大模型和呼叫中心的结合如何提高自动化水平?
  • L2tp环境搭建笔记- Openwrt平台
  • Redis bitmaps 使用
  • 国标GB28181网页直播平台EasyGBS:网络摄像机中的音频及音频编码技术解析