iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java分布式缓存方案
  • 841
分享到

java分布式缓存方案

2024-04-02 19:04:59 841人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、从数据说起2.1. 同步使用加载2.2. 延迟异步加载二、本地缓存三、远程缓存四、内存网格五、缓存常见问题1. 缓存穿透2. 缓存击穿3. 缓存雪崩番外:一、从数据说起 我

一、从数据说起

我们再做缓存之前需要把数据先分好类

按变化频率:

  • 静态数据:一般不变的,类似于字典表
  • 准静态数据:变化频率很低,部门结构设置,全国行政区划数据
  • 中间状态数据:一些计算的可复用中间数据,变量副本,配置中心的本地副本

按使用频率:

  • 热数据:使用频率高的
  • 读写比大的:读的频率远大于写的频率

这些数据就比较适合使用缓存。

缓存无处不在。内存可以看作是cpu和磁盘之间的缓存。cpu与内存的处理速度也不一致,所以出现了L1&L2 Cache

缓存的本质:系统各级之间处理速度不匹配,利用空间换时间。

缓存加载时间

1. 启动时全量加载

2. 懒加载

2.1. 同步使用加载

先看缓存里是否有数据,没有的话从数据库读取。读取的数据,先放到内存,然后返回给调用方。

2.2. 延迟异步加载

从缓存里获取数据,不管有没有都直接返回。

策略1:如果缓存为空的话,则发起一个异步线程负责加载。

策略2:异步线程负责维护缓存的数据,定期或根据条件触发更新。

缓存过期策略

  • 按FIFO或LRU
  • 固定时间过期
  • 根据业务进行时间的加权。

二、本地缓存

1.Map 缓存


public static final Map<String,Object> CACHE=new HashMap();
CACHE.put("key","value");

2.Guava缓存


Cache<String,String> cache = CacheBuilder.newBuilder() .maximumSize(1024) .expireAfterWrite(60,TimeUnit.SECONDS) .weakValues() .build();
cache.put("Word","Hello Guava Cache");
System.out.println(cache.getIfPresent("word"));


3.spring Cache

  • 基于注解和aop,使用方便
  • 可以配置Condition和SPEL,非常灵活
  • 需要注意:绕过Spring的话,注解无效

核心功能:@Cacheable、@CachePut、@CacheEvict

本地缓存的缺点:

  • 集群环境中,如果每个节点都保存一份缓存,导致占用内存变大
  • JVM中长期存在,会影响GC
  • 缓存数据的调度处理,影响业务线程,争夺资源

三、远程缓存

1.Redis
Redis是一个开源的使用ANSI C语言编写的,基于内存也可以持久化的key-value数据库,并提供多种语言的api
2. Memcached

memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。

四、内存网格

  1. Hazelcast
  2. lgnite

五、缓存常见问题

1. 缓存穿透

问题描述:大量并发查询不存在的KEY,导致都直接把压力透传到数据库上。

分析:因为数据库里没有值,所以没有建立缓存,导致一直打到数据库上。

解决办法:

  1. 缓存空值的KEY
  2. Bloom过滤或RoaringBitmap判断KEY是否存在
  3. 完全以缓存为准,使用延迟异步加载的方式去加载数据库数据到缓存。

Bloom过滤器示例:
(引入guava依赖)


public static void main(String[] args) {
        BloomFilter<CharSequence> filter = BloomFilter.create(
                Funnels.stringFunnel(Charsets.UTF_8),//Funnels.integerFunnel(), //数据格式
                1000000,//预计存入数据量
                0.01);//误判率

        System.out.println(filter.mightContain("abcdefg"));
        filter.put("abcdefg");
        System.out.println(filter.mightContain("abcdefg"));
    }

RoaringBitmap示例:
引入依赖:


<dependency>
			<groupId>org.roaringbitmap</groupId>
			<artifactId>RoaringBitmap</artifactId>
			<version>0.8.1</version>
		</dependency>

public static void test3(){
        Roaring64NavigableMap roaring64NavigableMap = Roaring64NavigableMap.bitmapOf(3, 4, 5, 90);
        //是否包含
        boolean contains = roaring64NavigableMap.contains(3);
        long l = roaring64NavigableMap.rankLong(3);
        System.out.println(l);
        System.out.println(contains);
    }

2. 缓存击穿

问题:当某个KEY失效的时候,正好有大量并发请求访问这个KEY

分析:跟缓存穿透比较像,这个是属于偶然的

解决办法:

  1. KEY的更新的时候添加全局互斥
  2. 完全以缓存为准,使用延迟异步加载的策略

3. 缓存雪崩

问题:当某一个时刻发生大规模的缓存失效的情况,会有大量请求打到数据库,导致数据库压力过大而宕机

分析:一般来说,由于更新策略、或者数据热点、缓存服务宕机等原因,导致缓存数据同时大规模不可以。

解决办法:

  1. 缓存更新、失效策略在时间上做到比较均匀
  2. 使用的热数据尽量分散到不同机器上
  3. 多台机器做主从复制,实现高可用
  4. 实现熔断限流机制,对系统进行负载能力控制
  5. 使用本地缓存兜底

番外:

布隆过滤器:

目标就是要基于过滤器已存储生成的原始元数据,进行比较过滤,如果是在原始元数据集合里面的,一定会被发现。也有可能不是里面的被误杀。

BloomFilter 会开辟一个m位的bitArray(位数组),开始所有数据都部署为0,当一个元素过来的时候,通过多个hash函数计算出不同的值,然后根据hash值找到对应的下标处,将里面的值改为1.

优点:使用计算,节省存储空间。

缺点:有失误率。不是在过滤器原始表里的数据也会被误算进去。

使用场景:目标就是要基于过滤器已存储生成的原始元数据,进行比较过滤,如果是在原始元数据集合里面的,一定会被发现。布隆过滤器核心正确的使用就是进行过滤禁止,进行正确的否定。

举例:如我们有100万个黑名单的url地址,过来一个地址我们算出来不在里面,那就肯定可以放行。

BitMap:

BitMap的基本思想是用一个bit位来标记某个元素对应的值,这样就可以大大节省空间。

在Java中一个int占4个字节,也就是32bit。按int存储和按位存储的大小差距是32倍。

那么怎么表示一个数呢?可以使用1表示存在,0表示不存在。

如下面:表示{2,6}

一个byte只有8个位置,如果想表示13怎么办呢?只能再用一个byte了,就成了一个二维数组了

1个int占32位,那么我们只需要申请一个int数组长度为 int tmp[1+N/32] 即可存储,其中N表示要存储的这些数中的最大值

使用场景:

把数放进去之后,遍历一遍,把值是1的都取出来就排好序了。

  • 2.快速去重

20亿个整数中找出不重复的整数的个数?

内存不足以容纳这20亿个整数。我们怎么表示数字的状态呢?一个数的状态可以分为3种,不存在、存在一次、存在两次及以上。这就需要两个bit来表示。00代表不存在,01代表一次,11代表两次及以上。

接下来我们就把这20亿个整数放进去,如果状态为00,就改为01,如果状态为01就改为11.如果状态为11,就不动了。都放完后,遍历取出值为01的,就是不重复的数据的个数。。

  • 3. 快速查找

给定一个整数M,M/32就能得到int数组的下标,M%32就知道在这个下标里面的具体位置。

如13,就能算出在int[0]里面的第13个

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

--结束END--

本文标题: java分布式缓存方案

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

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

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

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

下载Word文档
猜你喜欢
  • java分布式缓存方案
    目录一、从数据说起2.1. 同步使用加载2.2. 延迟异步加载二、本地缓存三、远程缓存四、内存网格五、缓存常见问题1. 缓存穿透2. 缓存击穿3. 缓存雪崩番外:一、从数据说起 我...
    99+
    2022-11-12
  • Java编程中常用的分布式缓存解决方案有哪些?
    Java编程中常用的分布式缓存解决方案有哪些? 随着互联网的发展,越来越多的应用程序需要处理大量数据,而且这些数据需要在多个节点之间共享。因此,分布式缓存成为了一个非常重要的话题。在Java编程中,有很多种分布式缓存解决方案,本文将会介绍其...
    99+
    2023-10-05
    缓存 分布式 编程算法
  • Redis分布式缓存:微信抢红包解决方案
    目录一、场景分析二、技术方案三、案例实战一、场景分析 微信抢红包已经在我们生活中很常见的场景了,特别是年底公司开年会和春节2个时间段,长辈领导都发红包,手都点抽筋了,也没抢到多少。 ...
    99+
    2022-11-12
  • Java实现本地缓存、分布式缓存及多级缓存
    以下均为自己参考其它博主文章或自己理解整理而成,如有错误之处,欢迎在评论区批评指正! 0. 缓存简介        像MySql等传统的关系型数据库已经不能适用于所有的业务场景,比如电商系统的秒杀场景,APP首页的访问流量高峰场景,很容易造...
    99+
    2023-09-17
    java
  • 利用Redis实现分布式缓存穿透解决方案
    利用Redis实现分布式缓存穿透解决方案随着互联网业务的不断发展,数据访问量也在不断增加,为了提高系统的性能和用户体验,缓存技术逐渐成为了必不可少的一部分,其中Redis作为一种高效、可扩展的缓存中间件方案,备受开发者的青睐。在使用Redi...
    99+
    2023-11-07
    redis 分布式缓存 缓存穿透
  • 利用Redis实现分布式缓存失效解决方案
    利用Redis实现分布式缓存失效解决方案,需要具体代码示例在分布式系统中,缓存是提高性能和减轻数据库负载的重要组成部分。而缓存的失效是一个常见的问题,当缓存中的数据发生变化时,我们需要及时将缓存失效,保证数据的一致性。Redis是一个高性能...
    99+
    2023-11-08
    分布式 redis 缓存失效
  • java分布式缓存技术有哪些
    Java分布式缓存技术有以下几种:1. Memcached:一个高性能的分布式内存对象缓存系统,能够加速动态网站和分布式应用程序的性...
    99+
    2023-10-20
    java
  • Go语言分布式缓存实现有哪些可行的方案?
    随着互联网应用的不断发展,缓存成为了提高应用性能的重要手段之一。而分布式缓存则是为了应对高并发、大流量、高可用性等问题而出现的。Go语言作为一门高效、简洁、并发性能优秀的语言,被越来越多的人用来实现分布式缓存。那么,Go语言分布式缓存实现...
    99+
    2023-10-20
    缓存 日志 分布式
  • 【分布式】数据库和缓存双写一致性方案解析
    引言为什么写这篇文章?首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新...
    99+
    2023-06-02
  • Java 数组在分布式缓存中的实现方式与优化方法。
    Java 数组在分布式缓存中的实现方式与优化方法 随着互联网技术的发展,分布式缓存成为了解决高并发场景下数据访问性能问题的有效手段。而在分布式缓存中,Java 数组的实现方式和优化方法则成为了开发人员需要重点关注的问题。本文将介绍 Java...
    99+
    2023-06-14
    数组 分布式 缓存
  • redis分布式缓存实现
    第一:Redis 是什么?Redis是基于内存、可持久化的日志型、Key-Value数据库 高性能存储系统,并提供多种语言的API.第二:出现背景数据结构(Data Structure)需求越来越多, 但memcache...
    99+
    2023-06-03
  • 分布式 PHP 缓存方案:如何实现高效的并发访问?
    随着互联网技术的飞速发展,Web 应用程序的并发访问量越来越大,如何实现高效的并发访问成为了一个急需解决的问题。在这个问题中,缓存的作用变得越来越重要。在 PHP 开发中,使用缓存可以大大提高应用程序的性能和响应速度。本文将介绍一种分布式...
    99+
    2023-09-22
    分布式 并发 缓存
  • PHP 分布式缓存方案:如何提高系统的并发性能?
    随着互联网的快速发展,很多网站和应用程序面临的最大问题是高并发访问。为了解决这个问题,开发人员通常会使用缓存技术。PHP 分布式缓存是一种非常有效的缓存技术,可以帮助我们提高系统的并发性能。 什么是 PHP 分布式缓存? PHP 分布式缓...
    99+
    2023-09-22
    分布式 并发 缓存
  • 分布式之数据库和缓存双写一致性方案解析
    先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功...
    99+
    2022-10-18
  • EhCache分布式缓存和缓存集群简介
    本篇内容介绍了“EhCache分布式缓存和缓存集群简介”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 开...
    99+
    2022-10-18
  • Redis分布式缓存与秒杀
    目录一、单点Redis的问题二、RDB三、AOF四、Redis优化秒杀流程1、秒杀步骤:2、Redis优化秒杀步骤:3、秒杀的Lua脚本 4、调用秒杀的lua脚本5、通过线程池,操作阻塞队列五、基于Redis实...
    99+
    2023-04-03
    Redis分布式缓存 Redis分布式秒杀
  • ASP 缓存和 JavaScript:如何实现分布式缓存?
    ASP缓存和JavaScript:如何实现分布式缓存? 在现代Web应用程序中,缓存是一个关键的组成部分,可以大大提高应用程序的性能。常见的缓存类型包括内存缓存、磁盘缓存和分布式缓存。本文将重点介绍ASP缓存和JavaScript如何实现分...
    99+
    2023-07-10
    缓存 javascript 分布式
  • LeetCode中Java缓存问题解决方案分享
    在开发过程中,为了提高程序的性能,缓存是一个非常常见的解决方案。在LeetCode题目中,也存在一些需要用到缓存的问题。然而,如果没有考虑到缓存的实现细节,就可能会导致程序出现错误或者性能下降。本文将介绍LeetCode中Java缓存问题...
    99+
    2023-06-28
    缓存 文件 leetcode
  • Java 数组如何在分布式缓存中使用?
    随着互联网的快速发展,数据量的不断增加,分布式缓存成为了解决高并发、高性能、高可用等问题的一种重要方式。在分布式缓存中,Java 数组是非常常见的数据结构之一。本文将介绍 Java 数组在分布式缓存中的使用方法。 一、Java 数组简介 ...
    99+
    2023-06-14
    数组 分布式 缓存
  • 如何在Java API中实现高效的分布式存储方案?
    在当今互联网时代,数据的存储和处理已经成为了每个人都需要面对的问题。在大数据时代,分布式存储方案已经成为了主流。而在Java API中,我们可以通过使用一些高效的分布式存储技术来实现高效的数据存储和处理。 一、分布式存储技术 分布式存储技术...
    99+
    2023-10-01
    api 分布式 存储
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作