首页 > 其他分享 >数据查询慢问题以及实现缓存预热

数据查询慢问题以及实现缓存预热

时间:2023-07-08 22:56:49浏览次数:47  
标签:缓存 Java Redis 查询 预热 yupi 分布式

数据查询慢问题

解决办法:使用缓存技术,提前把数据从数据库中取出来,就可以更快的进行读写。

1. 缓存的实现

  • Redis(分布式缓存)
  • memcached(分布式)
  • Etcd(云原生架构的一个分布式存储,存储配置,扩容能力)

  • ehcache(单机)
  • 本地缓存(Java 内存 Map)
  • Caffeine(Java 内存缓存,高性能)
  • Google Guava

Redis

NoSQL 数据库
key - value 存储系统(区别于 MySQL,他存储的是键值对)

Redis 数据结构

String 字符串类型: name: "yupi"
List 列表:names: ["yupi", "dogyupi", "yupi"]
Set 集合:names: ["yupi", "dogyupi"](值不能重复)
Hash 哈希:nameAge: { "yupi": 1, "dogyupi": 2 }
Zset 集合:names: { yupi - 9, dogyupi - 12 }(适合做排行榜)


bloomfilter(布隆过滤器,主要从大量的数据中快速过滤值,比如邮件黑名单拦截)
geo(计算地理位置)
hyperloglog(pv / uv)
pub / sub(发布订阅,类似消息队列)
BitMap (1001010101010101010101010101)

Jedis

独立于 Spring 操作 Redis 的 Java 客户端
要配合 Jedis Pool 使用

Lettuce

高阶 的操作 Redis 的 Java 客户端
异步、连接池

Redisson

分布式操作 Redis 的 Java 客户端,让你像在使用本地的集合一样操作 Redis(分布式 Redis 数据网格)

JetCache

对比

  1. 如果你用的是 Spring,并且没有过多的定制化要求,可以用 Spring Data Redis,最方便
  2. 如果你用的不是 SPring,并且追求简单,并且没有过高的性能要求,可以用 Jedis + Jedis Pool
  3. 如果你的项目不是 Spring,并且追求高性能、高定制化,可以用 Lettuce,支持异步、连接池

  • 如果你的项目是分布式的,需要用到一些分布式的特性(比如分布式锁、分布式集合),推荐用 redisson

2. 设计缓存的key

不同的用户看到的数据不同,可能为节约资金,一个redis要给多个项目进行使用,所以缓存的key一定不能和其他项目的冲突

systemId:mouduleId:functinoId:objectId

redis内存不能无限增加,一定要设置过期时间!

缓存预热

为什么要进行缓存预热?
因为网站主页第一个用户访问还是很慢,也能一定程度上保护数据库

1. 优点:

  解决上述问题,可以让用户始终访问的很快。

2. 缺点:

  - 增加开发成本,需要额外的开发和设计
  - 预热的时机和时间需要选择好,如果设置错了,有可能缓存的数据不对或很久之前的(比如你缓存的数据是七天之前的数据)
  - 需要占用额外的空间(redis可能只有4个G,运行项目时可能需要3个G,但是你缓存的数据量太大,占用了2个G,那么服务会崩掉)

3. 怎么缓存预热?

  - 定时
  - 模拟触发(手动触发)

4. 实现

  用定时任务实现,每天刷新所有用户的推荐列表
  注意点:
    -  缓存预热的意义(新增少,总用户多)
    - 缓存的空间不能太大,要预留给其他缓存空间
    - 缓存数据的周期

5. 定时任务的实现

参考:https://www.cnblogs.com/techgy/p/17524127.html

标签:缓存,Java,Redis,查询,预热,yupi,分布式
From: https://www.cnblogs.com/techgy/p/17538043.html

相关文章

  • mysql 查询jason格式数据
    简单查询。很多时候有复杂结构,我们存储为json格式,但字段很复杂。 假设有一个名为data的JSON字段,可以使用以下语法提取其中的值。SELECTdata->'$.key'FROMtable_name; 使用JSON_CONTAINS函数可以过滤JSON数组中包含特定值的记录。例如,假设有一个名为data的JSON字段,其......
  • 页面显示查询耗时
    执行耗时接口,页面显示计时器lettt=document.querySelector('.spanTimer')asHTMLElement;letnum=0;tt.innerText=num+'秒';letmin='';letsec='';lettimeOut=setInterval(function(){//开启定时器num++;if(num<......
  • PostgreSQL 简单查询
    对于数据库中数据的常见操作,可以简称为增删改查(CRUD,Create、Retrieve、Update、Delete)。其中,使用最多,也最复杂的功能当属数据查询。根据SQL标准,查询语句使用SELECT关键字表示。单表查询简单查询开始,来看一个示例selectfirst_name,last_namefromemployees;有SQL基础的都......
  • 如何实现MySQL大表查询慢的具体操作步骤
    MySQL大表查询慢的问题解决流程对于MySQL大表查询慢的问题,我们可以采取以下流程进行解决。以下表格展示了整个流程,以及每一步需要做的事情和相应的代码。步骤操作代码1检查索引SHOWINDEXFROMtable_name;2优化查询语句EXPLAINSELECT*FROMtable_nameWHERE......
  • mysql 慢查询处理
    mysql执行EXPLAINSELECT`post`.*,`category_post`.`category_id`FROM`mj_portal_post``post`INNERJOIN`mj_portal_category_post``category_post`ON`post`.`id`=`category_post`.`post_id`WHERE`post`.`post_status`=1AND`post`.`post_type`=1AND`post`......
  • (MySQL)开启慢查询日志
    MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量slow_query_log。showvariableslike'slow_query_log';修改/etc/my.ini如果要开启慢查询日志,需要在MySQL的配置文件(E:\ProgramData\MySQL\MySQLServer8.0\my.ini)中配置如下信息:#开启MySQL慢日志查询开关slow_......
  • ZHR_EMP_INQUIRY-人员信息查询
    *&---------------------------------------------------------------------**&ReportZHR_EMP_INQUIRY*&*&---------------------------------------------------------------------**&*&*&-------------------------------------------......
  • 若依前端,菜单栏切换时刷新问题[页面菜单切换时,页面总是重新刷新,导致页面输入的查询参
    前端页面菜单切换时,页面总是重新刷新,导致页面输入的查询参数重载清空这样切换时,页面就刷新了,解决方法在这里1,页面代码,这里指定namename:"Item",注意name的首字母必须大写2,页面代码,这里指定idid="item"注意,id的首字母必须小写3,页面配置,这里的路由地址必须配置和name一......
  • 在 Spring Boot 中使用 Dataway 配置数据查询接口
     Dataway介绍Dataway是基于DataQL服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过Dataway提供的UI界面完成。UI会以Jar包方式提供并集成到应用中并和应用共享同......
  • [推荐]ORACLE SQL:经典查询练手(不懂装懂,永世饭桶!)
    [推荐]ORACLESQL: 经典查询练手(不懂装懂,永世饭桶!)——通过知识共享树立个人品牌。  本文与大家共同讨论与分享ORACLESQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与分享......