首页 > 数据库 >Redis 缓存数据库查询的实现

Redis 缓存数据库查询的实现

时间:2024-09-24 21:13:24浏览次数:1  
标签:缓存 globalShip mmsi Redis 查询 数据库

Redis 缓存数据库查询的实现

1. 需求背景

  • 数据库表 globalship 存储大量船舶信息,每次查询船舶信息时,使用 mmsi 作为查询条件。
  • 由于数据量大,直接查询数据库性能较差,计划引入 Redis 缓存优化查询速度。
  • 目标:通过 mmsi 查询船舶信息,若 Redis 中存在缓存则直接返回,否则查询数据库,并将结果缓存到 Redis。

2. 实现思路

  1. 先查询 Redis 缓存:根据 mmsi 在 Redis 中查找船舶信息。如果找到,直接返回缓存结果。
  2. 查询数据库:如果 Redis 中没有对应的缓存,则查询数据库,获取船舶信息。
  3. 缓存结果到 Redis:将数据库查询的结果写入 Redis,并设置缓存的过期时间,防止数据长期占用 Redis 内存。
  4. 返回结果:返回缓存或数据库查询的结果。

3. Redis 缓存代码实现

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

@Service
public class GlobalShipService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private GlobalShipRepository globalShipRepository; // 假设这是数据库操作接口

    private static final String REDIS_PREFIX = "globalship:"; // Redis 键的前缀
    private static final long CACHE_EXPIRATION = 1; // 缓存过期时间,单位:小时

    public GlobalShip getShipByMmsi(Long mmsi) {
        String redisKey = REDIS_PREFIX + mmsi;
        
        // 1. 查询 Redis 缓存
        GlobalShip globalShip = (GlobalShip) redisTemplate.opsForValue().get(redisKey);
        
        if (globalShip != null) {
            // 缓存命中,直接返回
            return globalShip;
        }
        
        // 2. 如果缓存没有命中,查询数据库
        globalShip = globalShipRepository.findByMmsi(mmsi);
        
        if (globalShip != null) {
            // 3. 数据库查询结果缓存到 Redis,设置缓存过期时间
            redisTemplate.opsForValue().set(redisKey, globalShip, CACHE_EXPIRATION, TimeUnit.HOURS);
        }
        
        // 4. 返回结果(缓存或数据库查询结果)
        return globalShip;
    }
}

4. 代码实现关键点

  • Redis 缓存查询redisTemplate.opsForValue().get(redisKey),根据 mmsi 查询 Redis。
  • 数据库查询globalShipRepository.findByMmsi(mmsi),当 Redis 中没有数据时,查询数据库。
  • 缓存写入redisTemplate.opsForValue().set(redisKey, globalShip, CACHE_EXPIRATION, TimeUnit.HOURS),将数据库查询结果写入 Redis,设置 1 小时的缓存过期时间。

5. 优化措施

  • 防止缓存穿透:如果数据库查询结果为空,可以缓存一个标志,防止重复查询同样的无效数据。例如,缓存空对象或特定标志。
if (globalShip == null) {
    redisTemplate.opsForValue().set(redisKey, "NOT_FOUND", CACHE_EXPIRATION, TimeUnit.HOURS);
}
  • 缓存雪崩防护:给不同的缓存键设置随机过期时间,避免大量缓存同时过期,导致 Redis 负载过高。
long expirationTime = CACHE_EXPIRATION + new Random().nextInt(30); // 随机过期时间,1小时到1小时30分钟
redisTemplate.opsForValue().set(redisKey, globalShip, expirationTime, TimeUnit.HOURS);
  • 批量查询和缓存:如果可以,尽量减少单条查询和缓存,使用批量查询和缓存的方式,提高性能。

6. 注意事项

  • 缓存更新策略:当数据库中的数据发生变化时,需要更新 Redis 中的缓存,可以采用写操作后清除对应缓存或定时刷新缓存的机制。
  • 缓存大小控制:要注意控制 Redis 的内存使用,设置合理的过期时间和内存淘汰策略,防止 Redis 被大量缓存数据占用。

7. 适用场景

  • 适用于数据量大、查询频繁但数据变化不频繁的场景,如船舶信息、商品信息等场景。

标签:缓存,globalShip,mmsi,Redis,查询,数据库
From: https://www.cnblogs.com/echohye/p/18430031

相关文章

  • 在windows上使用docker创建mysql数据库
    可以以下步骤在Windows上使用Docker创建MySQL数据库:安装Docker:确保Windows上已安装DockerDesktop。拉取MySQL镜像:打开终端,运行以下命令:dockerpullmysql启动MySQL容器:使用以下命令启动一个MySQL容器(替换your_password为你的密码):dockerrun--namemysql-container......
  • 在Windows上使用Docker创建Redis
    在Windows上使用Docker创建Redis并设置密码拉取Redis镜像通过终端执行以下命令来获取Redis的官方镜像:dockerpullredis启动Redis容器并设置密码使用--requirepass选项来设置Redis密码。例如,启动Redis并将密码设置为your_password:dockerrun--nameredis-container-d......
  • SQL Server2012保姆安装教程----带你快速上手数据库创建
    目录1.前言2.安装准备3.参考文章4.安装过程 5.快速上手5.1如何连接服务器5.2创建数据库5.3添加新的文件5.4属性介绍5.5创建表的引入1.前言我之前使用的就是mysql数据库,这个数据库使用的比较多,我学的初期也是这个;但是我们学校的课程使用的是sql server,同是数......
  • 架构师手写代码:分享数据库原子性与一致性实现方案(不再背概念)
    数据库事务的原子性和一致性是数据库管理系统(DBMS)中确保数据完整性和可靠性的两个关键属性。下面是这两个属性的基本概念和实现逻辑:肖哥弹架构跟大家“弹弹”数据库设计技巧,关注公号回复'mvcc'获得手写数据库事务代码欢迎点赞,点赞,点赞。关注公号Solomon肖哥弹架构获取......
  • SqlEs-像使用数据库一样使用Elasticsearch
    SqlEsSqlEs是Elasticsearch的客户端JDBC驱动程序,支持采用sql语法操作Elasticsearch。SqlEs构建在RestHighLevelClient,屏蔽了RestHighLevelClient接口的复杂度,可以像使用数据一样使用Elasticsearch。社区架构特性零入侵应用无需改造,可以无缝集成到现有业务应用。J......
  • redis常用命令
    Redis基操redis不区分大小写,而且redis是单线程数据库(不支持多线程),故redis是基于内存操作,cup不是redis的性能瓶颈,其瓶颈是网络带宽和机器内存一、常用数据库级别指令selectindex切换不同数据库:redis初始数据库有16个,默认使用的是第零个数据库,不同数据库可以存不同的......
  • 如何解决海洋CMS数据库安装错误问题?
    当遇到海洋CMS数据库安装错误的问题时,可以采取以下步骤来诊断和解决问题:1.检查数据库连接信息确保你在安装过程中输入的数据库连接信息(如主机名、用户名、密码、数据库名)是正确的。如果输入错误,将会导致连接失败。2.确认数据库服务器状态确认MySQL数据库服务正在运行。可以......
  • 数据库练习
    1、查询所有学生信息,显示的内容包含:编号,姓名,班级,性别,出生日期,年龄,成绩SELECTid,NAME,clazz,gender,score,bir,TIMESTAMPDIFF(YEAR,bir,NOW())ageFROMinfo;2、查询每个班的学生人数各有几人SELECTclass,COUNT(*)ASstudent_numberFROMinfoGROUPBYclass;......
  • 在虚拟机Linux上运行redis,同时使用Another RedisDesktop Manager图形化界面工具连接
    VMwareWorkstationPro虚拟机启动Centos7MobaXterm连接虚拟机输入个人密码Redis启动进入Redis文件目录cd/usr/local/src/redis-6.2.6Redis自启动systemctlenableredissystemctlstartredis查看Redis进程ps-ef|grepredis进入Redis操作redis-cli-h......
  • docker 环境快速安装 redis
    Redis介绍Redis全称为RemoteDictionaryServer(远程数据服务),是一款开源的基于内存的键值对存储系统,其主要被用作高性能缓存服务器使用,当然也可以作为消息中间件和Session共享等。Redis独特的键值对模型使之支持丰富的数据结构类型,即它的值可以是字符串、哈希、列表、集合、......