iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Redis与本地缓存的结合实现
  • 275
分享到

Redis与本地缓存的结合实现

2024-04-02 19:04:59 275人浏览 安东尼
摘要

目录前言设计示例Redis懒加载缓存流程图代码示例优点缺点总结Redis结合本地缓存流程图代码示例优点缺点总结后记前言 我们开发中经常用到Redis作为缓存,将高频数据放在Redis

前言

  • 我们开发中经常用到Redis作为缓存,将高频数据放在Redis中能够提高业务性能,降低Mysql等关系型数据库压力,甚至一些系统使用Redis进行数据持久化,Redis松散的文档结构非常适合业务系统开发,在精确查询,数据统计业务有着很大的优势。但是高频数据流处理系统中,Redis的压力也会很大,同时I/0开销才是耗时的主要原因,这时候为了降低Redis读写压力我们可以用到本地缓存,Guava为我们提供了优秀的本地缓存api,包含了过期策略等等,编码难度低,个人非常推荐。

设计示例

Redis懒加载缓存

数据在新增到mysql不进行缓存,在精确查找进行缓存,做到查询即缓存,不查询不缓存

流程图

代码示例

// 伪代码示例 Xx代表你的的业务对象 如User Goods等等
public class XxLazyCache {

    @Autowired
    private RedisTemplate<String, Xx> redisTemplate;
    
    @Autowired
    private XxService xxService;// 你的业务service
    
    
    public Xx getXx(int id) {
        // 1.查询缓存里面有没有数据
        Xx xxCache = getXxFromCache(id);
        if(xxCache != null) {
            return xxCache;// 卫语句使代码更有利于阅读
        }
        // 2.查询数据库获取数据 我们假定到业务这一步,传过来的id都在数据库中有对应数据
        Xx xx = xxService.getXxById(id);
        // 3.设置缓存、这一步相当于Redis缓存懒加载,下次再查询此id,则会走缓存
        setXxFromCache(xx);
        return xx;
        }
    }
    
    
    public void deleteXxFromCache(long id) {
        String key = "Xx:" + xx.getId();
        redisTemplate.delete(key);
    }
    
    private void setXxFromCache(Xx xx) {
        String key = "Xx:" + xx.getId();
        redisTemplate.opsForValue().set(key, xx);
    }
    
    private Xx getXxFromCache(int id) {
        // 通过缓存前缀拼装唯一主键作为缓存Key 如Xxx信息 就是Xxx:id
        String key = "Xx:" + id;
        return redisTemplate.opsForValue().get(key);
    }
    
}
// 业务类
public class XxServie {
    @Autowired
    private XxLazyCache xxLazyCache;
    // 查询数据库
    public Xx getXxById(long id) {
        // 省略实现
        return xx;
    }
    
    public void updateXx(Xx xx) {
        // 更新Mysql数据 省略
        // 删除缓存
        xxLazyCache.deleteXxFromCache(xx.getId());
    }
    
    public void deleteXx(long id) {
        // 删除MySQL数据 省略
        // 删除缓存
        xxLazyCache.deleteXxFromCache(xx.getId());
    }
}
// 实体类
@Data
public class Xx {
    // 业务主键
    private Long id;
    // ...省略
}
复制代码

优点

  • 保证最小的缓存量满足精确查询业务,避免冷数据占用宝贵的内存空间
  • 对增删改查业务入侵小、删除即同步
  • 可插拔,对于老系统升级,历史数据无需在启动时初始化缓存

缺点

  • 数据量需可控,在无限增长业务场景不适用
  • 微服务场景不利于全局缓存应用

总结

  • 空间最小化
  • 满足精确查询场景
  • 总数据量可控推荐使用
  • 微服务场景不适用

Redis结合本地缓存

微服务场景下,多个微服务使用一个大缓存,流数据业务下,高频读取缓存对Redis压力很大,我们使用本地缓存结合Redis缓存使用,降低Redis压力,同时本地缓存没有连接开销,性能更优

流程图

业务场景

在流处数处理过程中,微服务对多个设备上传的数据进行处理,每个设备有一个code,流数据的频率高,在消息队列发送过程中使用分区发送,我们需要为设备code生成对应的自增号,用自增号对kafka中topic分区数进行取模,这样如果有10000台设备,自增号就是0~9999,在取模后就进行分区发送就可以做到每个分区均匀分布,这个自增号我们使用redis的自增数生成,生成后放到redis的hash结构进行缓存,每次来一个设备,我们就去这个hash缓存中取,没有取到就使用自增数生成一个,然后放到redis的hash缓存中,这时候每个设备的自增数一经生成是不会再发生改变的,我们就想到使用本地缓存进行优化,避免高频的调用redis去获取,降低redis压力,下面链接为我写的关于kafka分区消费的文章,大家可以去看看 Kafka分区发送及消费实战

代码示例


public class DeviceIncCache {

    
    private Cache<String, Integer> localCache = CacheBuilder.newBuilder()
        .concurrencyLevel(16) // 并发级别
        .initialCapacity(1000) // 初始容量
        .maximumSize(10000) // 缓存最大长度
        .expireAfterAccess(1, TimeUnit.HOURS) // 缓存1小时没被使用就过期
        .build();

    @Autowired
    private RedisTemplate<String, Integer> redisTemplate;
    
    
    private static final String DEVICE_INC_COUNT = "device_inc_count";
    
    
    private static final String DEVICE_INC_VALUE = "device_inc_value";
    
    
    public int getInc(String deviceCode){
        // 1.从本地缓存获取
        Integer inc = localCache.get(deviceCode);
        if(inc != null) {
            return inc;
        }
        // 2.本地缓存未命中,从redis的hash缓存获取
        inc = (Integer)redisTemplate.opsForHash().get(DEVICE_INC_VALUE, deviceCode);
        // 3. redis的hash缓存中没有,说明是新设备,先为设备生成一个自增号
        if(inc == null) {
            inc = redisTemplate.opsForValue().increment(DEVICE_INC_COUNT).intValue;
            // 添加到redis hash缓存
            redisTemplate.opsForHash().put(DEVICE_INC_VALUE, deviceCode, inc);
        }
        // 4.添加到本地缓存
        localCache.put(deviceCode, inc);
        // 4.返回自增数
        return inc;
    }
    
}

优点

  • redis保证数据可持久,本地缓存保证超高的读取性能,微服务共用redis大缓存的场景能有效降低redis压力
  • guava作为本地缓存,提供了丰富的api,过期策略,最大容量,保证服务内存可控,冷数据不会长期占据内存空间
  • 服务重启导致的本地缓存清空不会影响业务进行
  • 微服务及分布式场景使用,分布式情况下每个服务实例只会缓存自己接入的那一部分设备的自增号,本地内存空间最优
  • 在示例业务中,自增数满足了分布区发送的均匀分布需求,也可以满足统计设备接入数目的业务场景,一举两得

缺点

  • 增加编码复杂度,不直接
  • 只适用于缓存内容只增不改的场景

总结

  • 本地缓存空间可控,过期策略优
  • 适用于微服务及分布式场景
  • 缓存内容不能发生改变
  • 性能优

后记

redis提供了丰富的数据类型及api,非常适合业务系统开发,统计计数(increment,decrement),标记位(bitmap),松散数据(hash),先进先出、队列式读取(list);guava缓存作为本地缓存,能够高效的读取的同时,提供了大量api方便我们控制本地缓存的数据量及冷数据淘汰;我们充分的学习这些特性能够帮助我们在业务开发中更加轻松灵活,在空间与时间上找到一个平衡点。

到此这篇关于Redis与本地缓存的结合实现的文章就介绍到这了,更多相关Redis本地缓存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Redis与本地缓存的结合实现

本文链接: http://www.lsjlt.com/news/164213.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis与本地缓存的结合实现
    目录前言设计示例Redis懒加载缓存流程图代码示例优点缺点总结Redis结合本地缓存流程图代码示例优点缺点总结后记前言 我们开发中经常用到Redis作为缓存,将高频数据放在Redis...
    99+
    2024-04-02
  • 本地缓存与redis缓存有什么区别
    这篇文章主要介绍本地缓存与redis缓存有什么区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本地缓存与redis缓存有以下几种不同:1、读写速度,不考虑并发问题,本地缓存自然是最...
    99+
    2024-04-02
  • Spring 如何结合Redis数据库实现缓存
    这篇文章将为大家详细讲解有关 Spring 如何结合Redis数据库实现缓存,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 依赖包安装pom.xml 加入:<!-- redis c...
    99+
    2023-05-31
    spring redis 缓存
  • redis缓存原理与实现
    redis 缓存是一种内存中键值对存储,通过将常用数据存储在内存中,提升应用程序性能。其实现原理包括哈希表、跳跃表、异步 i/o、内存映射、复制和持久化等技术,带来提高性能、减少延迟、提...
    99+
    2024-04-19
    redis 数据丢失 键值对
  • 怎么清除本地redis缓存
    要清除本地Redis缓存,可以通过以下几种方法:1. 使用redis-cli命令行工具:打开终端,输入redis-cli命令进入Re...
    99+
    2023-09-01
    redis
  • java本地缓存如何实现
    Java本地缓存可以通过多种方式实现,以下是其中几种常用的方法:1. 使用HashMap:可以使用java.util.HashMap...
    99+
    2023-10-21
    java
  • Java实现本地缓存、分布式缓存及多级缓存
    以下均为自己参考其它博主文章或自己理解整理而成,如有错误之处,欢迎在评论区批评指正! 0. 缓存简介        像MySql等传统的关系型数据库已经不能适用于所有的业务场景,比如电商系统的秒杀场景,APP首页的访问流量高峰场景,很容易造...
    99+
    2023-09-17
    java
  • Redis和本地缓存如何使用
    今天小编给大家分享一下Redis和本地缓存如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。众所周知,缓存最主要的目的就...
    99+
    2023-07-04
  • C#实现自由组合本地缓存、分布式缓存和数据查询
    一、背景介绍: 我们在进行数据存储的时候,有时候会加入本地缓存、分布式缓存以及数据库存储三级的结构,当我们取值的时候经常是像下面这样的流程: 1.先取本地缓存,如果值存在直接返回 2...
    99+
    2024-04-02
  • SpringBoot怎么整合Spring Cache实现Redis缓存
    今天小编给大家分享一下SpringBoot怎么整合Spring Cache实现Redis缓存的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2023-07-02
  • 详解redis与spring的整合(使用缓存)
    1、实现目标通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)  2、所需jar包注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错。因为commons...
    99+
    2023-05-31
    spring redis
  • golang函数缓存与第三方存储结合实践
    函数缓存是一种优化技术,用于避免重复计算,提高性能。当缓存大小超出内存限制时,可以通过结合第三方存储来扩展缓存容量,例如使用 redis。实践中,可以将缓存大量查询结果到 redis 中...
    99+
    2024-05-05
    缓存 第三方存储 redis git golang
  • MySQL与redis缓存怎么实现同步
    MySQL与redis缓存怎么实现同步?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、方案1(UDF)场景分析:当我们对MySQL数据库进行数据操作时,同时将...
    99+
    2023-06-14
  • Redis整合Spring及结合使用缓存的示例分析
    Redis整合Spring及结合使用缓存的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Redis介绍什么是Red...
    99+
    2024-04-02
  • 利用Java如何实现本地缓存
    本篇文章给大家分享的是有关利用Java如何实现本地缓存,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用场景在 Java 应用中,对于访问频率高,更新少的数据,通常的方案是将这...
    99+
    2023-05-31
    java 本地缓存 ava
  • Vuex结合storage实现用户信息本地存储方式
    目录首先安装插件库good-storage在你写离线存储逻辑部分的地方引入good-storage接下来是定义vuex的代码部分在外部组件中的操作如下自己学习的过程中遇到用户新的填写...
    99+
    2024-04-02
  • Vuex怎么结合storage实现用户信息本地存储
    这篇文章主要介绍“Vuex怎么结合storage实现用户信息本地存储”,在日常操作中,相信很多人在Vuex怎么结合storage实现用户信息本地存储问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vuex怎么结...
    99+
    2023-06-30
  • 怎么实现redis缓存
    这篇文章主要介绍了怎么实现redis缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么实现redis缓存文章都会有所收获,下面我们一起来看看吧。1、使用宝塔面板先搭建好微擎...
    99+
    2024-04-02
  • redis缓存实现原理
    redis 缓存机制通过键值对存储、内存存储、过期策略、数据结构、复制和持久化来实现。它遵循获取数据、缓存命中、缓存不命中、写入缓存、更新缓存的步骤,提供快速的数据访问和高性能的缓存服务...
    99+
    2024-04-19
    redis 数据访问 键值对
  • Redis和本地缓存使用的技巧有哪些
    这篇文章主要介绍“Redis和本地缓存使用的技巧有哪些”,在日常操作中,相信很多人在Redis和本地缓存使用的技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redi...
    99+
    2022-11-30
    redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作