Redis入门到通关之Redis缓存数据实战

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: Redis入门到通关之Redis缓存数据实战

☃️什么是缓存?


缓存就像自行车,越野车的避震器

举个栗子: 越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样;

同样,实际开发中,系统也需要"避震器", 防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪;

这在实际开发中对企业讲,对产品口碑,用户评价都是致命的; 所以企业非常重视缓存技术;

缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地.


❄️❄️为什么要使用缓存

一句话:因为 响应速度快, 用户体验用

缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的 服务器读写压力

实际开发过程中,企业的数据量,少则几十万,多则几千万,这么大数据量,如果没有缓存来作为"避震器",系统是几乎撑不住的,所以企业会大量运用到缓存技术;

但是缓存也会增加代码复杂度和运营的成本:

  • 数据一致性成本
  • 代码维护成本
  • 运维成本

❄️❄️如何使用缓存

实际开发中,会构筑多级缓存来使系统运行速度进一步提升,例如: 本地缓存与redis中的缓存结合使用

浏览器缓存:主要是存在于浏览器端的缓存

应用层缓存: 可以分为tomcat本地缓存,比如之前提到的map,或者是使用redis作为缓存

数据库缓存: 在数据库中有一片空间是 buffer pool,增改查数据都会先加载到mysql的缓存中

CPU缓存: 当代计算机最大的问题是 cpu性能提升了,但内存读写速度没有跟上,所以为了适应当下的情况,增加了cpu的L1,L2,L3级的缓存


☃️缓存实战


当我们查询热点信息时, 我们如果直接去数据库查, 高并发下那响应时间肯定慢, 所以我们需要增加缓存.


❄️❄️缓存模型和思路

标准的操作方式就是查询数据库之前先查询缓存,如果缓存数据存在,则直接从缓存中返回,如果缓存数据不存在,再查询数据库,然后将数据存入 Redis


❄️❄️演示代码

public Result get(Long id){
    if( id < 0 ){
        return Result.ok(null);
    }
    String key = "XXXX:" + id;
    //  先从redis缓存查
    String value = redisTemplate.opsForValue().get(key);
    //  判断是否存在
    if( StringUtils.isNotBlank(value) ){
        //  存在直接返回
        return Result.ok(JSON.parse(value, WorkTicket.class));
    }
    //  不存在去数据库查
    WorkTicket workTicket = workTicketService.getById(id);
    //  不存在 返回空
    if( workTicket == null ){
        return Result.ok(null);
    }
    //  写入缓存
    redisTemplate.opsForValue().set(key, JSON.toJSONString(workTicket));
    return Result.ok(workTicket);
}


☃️缓存更新策略


缓存更新是Redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向Redis插入太多数据,此时就可能会导致缓存中的数据过多,所以Redis会对部分数据进行更新,或者把他叫为淘汰更合适。

内存淘汰: Redis自动进行,当Redis内存达到咱们设定的 max-memery 的时候,会自动触发淘汰机制,淘汰掉一些不重要的数据(可以自己设置策略方式)

超时剔除: 当我们给Redis设置了过期时间 ttl 之后,Redis 会将超时的数据进行删除

主动更新: 我们可以手动调用方法把缓存删掉,通常用于解决缓存和数据库不一致问题

业务场景

低一致性需求:使用内存淘汰机制。

高一致性需求:主动更新,并以超时剔除作为兜底方案。


❄️❄️数据库缓存不一致解决方案


由于我们的 缓存的数据源来自于数据库, 而数据库的 数据是会发生变化的, 因此,如果当数据库中 数据发生变化,而缓存却没有同步, 此时就会有 一致性问题存在, 其后果是:

用户使用缓存中的过时数据,就会产生类似多线程数据安全问题,从而影响业务,产品口碑等;怎么解决呢?有如下几种方案

人工编码方式:缓存调用者在更新完数据库后再去更新缓存,也称之为双写方案

由系统本身完成: 数据库与缓存的问题交由系统本身去处理

调用者只操作缓存: 其他线程去异步处理数据库,实现最终一致

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6天前
|
缓存 NoSQL Java
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
25 0
|
1天前
|
NoSQL Redis
redis使用jackson序列化数据配置文件
redis使用jackson序列化数据配置文件
14 5
|
2天前
|
存储 缓存 NoSQL
SpringBoot配置第三方专业缓存技术Redis
SpringBoot配置第三方专业缓存技术Redis
9 4
|
2天前
|
分布式计算 NoSQL 大数据
MaxCompute产品使用问题之数据在redis里可以通过接口调用到大数据计算吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5天前
|
存储 缓存 NoSQL
springboot redis-cache 自动刷新缓存
springboot redis-cache 自动刷新缓存
|
21小时前
|
存储 缓存 NoSQL
redis缓存优化
采用获取一次缓存,如果为空的情况,获取分布式锁,让一个线程去重建缓存,另外的线程未获取到锁的情况,休眠短时间,然后再自旋获取缓存。
8 0
|
1天前
|
缓存 NoSQL Redis
SpringBoot2.4.5使用redis缓存
SpringBoot2.4.5使用redis缓存
8 0
|
2天前
|
NoSQL Java 关系型数据库
非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载
非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载
5 0
|
7月前
|
缓存 NoSQL 安全
Redis缓存雪崩、击穿、穿透解释及解决方法,缓存预热,布隆过滤器 ,互斥锁
Redis缓存雪崩、击穿、穿透解释及解决方法,缓存预热,布隆过滤器 ,互斥锁
209 5
|
8月前
|
缓存 NoSQL 数据库
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
44 0