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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 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
相关文章
|
19天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
20天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
3天前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
15 2
|
3天前
|
缓存 NoSQL Redis
解决 Redis 缓存穿透问题的有效方法
解决 Redis 缓存穿透问题的有效方法
13 2
|
9天前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
30 2
|
3天前
|
缓存 NoSQL 算法
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
8 0
|
3天前
|
存储 NoSQL 安全
8)详解 Redis 的配置文件以及数据持久化
8)详解 Redis 的配置文件以及数据持久化
9 0
|
3天前
|
存储 NoSQL Redis
Redis的RDB快照:保障数据持久性的关键机制
Redis的RDB快照:保障数据持久性的关键机制
10 0
|
13天前
|
NoSQL Java API
Redis数据淘汰策略的详细介绍
通过上述步骤,我们不仅解决了一个实际问题,也进一步了解了Java 8时间API的强大功能和灵活性。希望这个解答能够帮助你在日常开发中更加自如地处理时间和时区相关的问题。
23 0
|
2月前
|
SQL 存储 NoSQL
Redis6入门到实战------ 一、NoSQL数据库简介
这篇文章是关于NoSQL数据库的简介,讨论了技术发展、NoSQL数据库的概念、适用场景、不适用场景,以及常见的非关系型数据库。文章还提到了Web1.0到Web2.0时代的技术演进,以及解决CPU、内存和IO压力的方法,并对比了行式存储和列式存储数据库的特点。
Redis6入门到实战------ 一、NoSQL数据库简介
下一篇
无影云桌面