목차
yii框架缓存知识总结
您可能感兴趣的文章
백엔드 개발 PHP 튜토리얼 yii框架缓存知识总结_PHP教程

yii框架缓存知识总结_PHP教程

Jul 13, 2016 am 09:56 AM
yii 액자 은닉처

yii框架缓存知识总结

缓存是用于提升网站性能的一种即简单又有效的途径。稍微有点规模的网站都会通过存储相对静态的数据至缓存以备所需,这样我们可以省去从数据库查询然后生成这些数据的时间,通过减轻数据库的压力从而提升网站的性能。

Yii作为一个强大的php开源框架,再缓存这块,YII对各种流行的缓存都提供了接口,我们可以根据实际的需要使用不同的缓存。

yii的缓存相关组件存放在yii/framework/caching的目录内,通过查看该目录,我们可以知道yii所支持的都有哪些缓存。下面我们对相关文件做一些简单的介绍:

CMemCache: 使用 PHP memcache 扩展.

CApcCache: 使用 PHP APC 扩展.

CXCache: 使用 PHP XCache 扩展。注意,这个是从 1.0.1 版本开始支持的。

CEAcceleratorCache: 使用 PHP EAccelerator 扩展.

CDbCache: 使用一个数据表存储缓存数据。默认情况下,它将创建并使用在 runtime 目录下的一个 SQLite3 数据库。 你也可以通过设置其 connectionID 属性指定一个给它使用的数据库。

CZendDataCache: 使用 Zend Data Cache 作为后台缓存媒介。注意,这个是从 1.0.4 版本开始支持的。

CFileCache: 使用文件存储缓存数据。这个特别适合用于存储大块数据(例如页面)。注意,这个是从 1.0.6 版本开始支持的。

CDummyCache: 目前 dummy 缓存并不实现缓存功能。此组件的目的是用于简化那些需要检查缓存可用性的代码。例如,在开发阶段或者服务器尚未支持实际的缓存功能,我们可以使用此缓存组件。当启用了实际的缓存支持后,我们可以切换到使用相应的缓存组件。在这两种情况中,我们可以使用同样的代码Yii::app()->cache->get($key) 获取数据片段而不需要担心 Yii::app()->cache 可能会是 null。此组件从 1.0.5 版开始支持。

提示: 由于所有的这些缓存组件均继承自同样的基类 CCache,因此无需改变使用缓存的那些代码就可以切换到使用另一种缓存方式。

在 Yii 中使用缓存主要包括配置和访问缓存组件 。 下面以分别以使用 memcache 缓存组件和文件缓存组件为例做二个说明:

(1)memcache 缓存示例:

如下的应用配置指定了一个使用两台缓存服务器的 memcache 缓存组件:

array(
	......
	'components'=>array(
		......
		'phpernote_cache'=>array(
			'class'=>'system.caching.CMemCache',
			'servers'=>array(
				array('host'=>'10.201.1.101', 'port'=>11211, 'weight'=>60),
				array('host'=>'10.201.1.102', 'port'=>11211, 'weight'=>40),
			),
		),
	),
);
로그인 후 복사

程序运行的时候可以再控制器方法中通过 Yii::app()->phpernote_cache 来访问缓存组件,例如:

Yii::app ()->phpernote_cache->set($key,$value,$expire);

Yii::app()->phpernote_cache->add($id,$value); 

Yii::app ()->phpernote_cache->get($key);

(2)文件缓存示例:

1. 在config文件加入缓存配置信息

array(
	......
	'components'=>array(
		......
		'cache'=>array(
			'class'=>'system.caching.CFileCache',
			'directoryLevel'=>2
			),
		),
	),
);
로그인 후 복사

以上配置中 directoryLevel 设置的是缓存文件的目录深度;如果缓存页面特别多,这个值需要设置大点,否则每个目录下的页面会很多。

2. 在要做缓存的控制器里定义过滤器。

public function filters(){
	return array(
		array(
			'COutputCache + post, list',
			'duration'=>3600,
			'varyByParam'=>array('id','page'),
			'dependency'=>array(
			'class'=>'CDbCacheDependency',
			'sql'=>'SELECT MAX(id) FROM phpernote_article',
		)
	);
}
로그인 후 복사

COutputCache 是用于处理缓存的类,如果只填'COutputCache',则控制器里所有action都会通过缓存过滤,定义'COutputCache + post, list',表示只对以下方法进行缓存:actionPost, actionList 。

duration 是缓存的时间,单位是秒,

varyByParam 是指定一系列GET参数名称列表, 使用相应的值去确定缓存内容的版本,即同一个action用于区分是不同页面的的参数,此处我以id和page来区分不同页面。

除varyByParam以外,还可以采用其他的条件来区分页面:

varyByExpression:指定缓存内容通过自定义的PHP表达式的结果而变化

varyByRoute:指定缓存内容基于请求的路由不同而变化 (controller 和 action)

varyBySession:指定是否缓存内容. 因用户session不同而变化

dependency'指定缓存失效依赖关系:可指定文件或数据库;本示例指定的是数据库依赖 CDbCacheDependency ,通过数据表的某个值的变化来确定缓存是否失效。例如,如果在表中新增了一条记录,即使缓存才过了5分钟(<3600),仍然判断为失效,从而查询数据库,生成整个页面,再次缓存;
  
提示:yii也可以支持Redis,需要装一个插件:http://www.yiibase.com/download/view/32.html

缓存可以在不同的级别使用。在最低级别,可用来缓存单个数据(数据缓存)。往上一级,我们缓存一个由视图脚本生成的页面片断(片段缓存)。在最高级别,可存储整个页面以便需要的时候直接从缓存读取。本文说明页面缓存的配置及实现效果;

数据缓存

数据缓存即存储一些 PHP 变量到缓存中,以后再从缓存中取出来。出于此目的,缓存组件的基类 CCache 提供了两个最常用的方法: set() 和 get()。

要在缓存中存储一个变量 $value ,我们选择一个唯一 ID 并调用 set() 存储它:

Yii::app()->cache->set($id, $value);缓存的数据将一直留在缓存中,除非它由于某些缓存策略(例如缓存空间已满,旧的数据被删除)而被清除。 要改变这种行为,我们可以在调用 set() 的同时提供一个过期参数,这样在设定的时间段之后,缓存数据将被清除:

// 值$value 在缓存中最多保留30秒
Yii::app()->cache->set($id, $value, 30);稍后当我们需要访问此变量时(在同一个或不同的 Web 请求中),就可以通过 ID 调用 get() 从缓存中将其取回。 如果返回的是 false,表示此值在缓存中不可用,我们应该重新生成它。

$value=Yii::app()->cache->get($id);
if($value===false){
    // 因为在缓存中没找到 $value ,重新生成它 ,
    // 并将它存入缓存以备以后使用:
    // Yii::app()->cache->set($id,$value);
}
로그인 후 복사

为要存入缓存的变量选择 ID 时,要确保此 ID 对应用中所有其他存入缓存的变量是唯一的。而在不同的应用之间,这个 ID 不需要是唯一的。缓存组件具有足够的智慧区分不同应用中的 ID。

一些缓存存储器,例如 MemCache, APC, 支持以批量模式获取多个缓存值。这可以减少获取缓存数据时带来的开销。从版本 1.0.8 起,Yii 提供了一个新的名为 mget() 的方法。它可以利用此功能。如果底层缓存存储器不支持此功能,mget() 依然可以模拟实现它。

要从缓存中清除一个缓存值,调用 delete(); 要清楚缓存中的所有数据,调用 flush()。 当调用 flush() 时一定要小心,因为它会同时清除其他应用中的缓存。

提示: 由于 CCache 实现了 ArrayAccess,因此缓存组件也可以像一个数组一样使用。下面是几个例子:

$cache=Yii::app()->cache;
$cache['username']=$value1;  // 相当于: $cache->set('username',$value1);
$value2=$cache['username'];  // 相当于: $value2=$cache->get('username');
로그인 후 복사

1. 缓存依赖

除了过期设置,缓存数据也可能会因为依赖条件发生变化而失效。例如,如果我们缓存了某些文件的内容,而这些文件发生了改变,我们就应该让缓存的数据失效,并从文件中读取最新内容而不是从缓存中读取。

我们将一个依赖关系表现为一个 CCacheDependency 或其子类的实例。 当调用 set() 时,我们连同要缓存的数据将其一同传入。如下面这段代码的意思就是此值将在30秒后失效,但如果依赖的文件发生了变化则立即失效:
 
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));

现在如果我们通过调用get() 从缓存中获取 $value ,依赖关系将被检查,如果发生改变,我们将会得到一个 false 值,表示数据需要被重新生成。

如下是可用的缓存依赖的简要说明:

CFileCacheDependency: 如果文件的最后修改时间发生改变,则依赖改变。

CDirectoryCacheDependency: 如果目录和其子目录中的文件发生改变,则依赖改变。

CDbCacheDependency: 如果指定 SQL 语句的查询结果发生改变,则依赖改变。

CGlobalStateCacheDependency: 如果指定的全局状态发生改变,则依赖改变。全局状态是应用中的一个跨请求,跨会话的变量。它是通过 CApplication::setGlobalState() 定义的。

CChainedCacheDependency: 如果链中的任何依赖发生改变,则此依赖改变。

CExpressionDependency: 如果指定的 PHP 表达式的结果发生改变,则依赖改变。此类从版本 1.0.4 起可用。

片段缓存(Fragment Caching) 

片段缓存指缓存网页某片段。例如,如果一个页面在表中显示每年的销售摘要,我们可以存储此表在缓存中,减少每次请求需要重新产生的时间。

要使用片段缓存,在控制器视图脚本中调用 CController::beginCache() 和 CController::endCache() 。这两种方法开始和结束包括的页面内容将被缓存。类似data caching ,我们需要一个编号,识别被缓存的片段。例如下面这段代码如果beginCache() 返回false,缓存的内容将此地方自动插入; 否则,在if语句内的内容将被执行并在endCache()触发时缓存。

......
<?php if($this->beginCache($id)) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
......
로그인 후 복사

1. 缓存选项(Caching Options)

当调用beginCache(),可以提供一个数组由缓存选项组成的作为第二个参数,以自定义片段缓存。事实上为了方便,beginCache() 和endCache()方法是[ COutputCache ]widget的包装。因此COutputCache的所有属性都可以在缓存选项中初始化。

有效期(Duration)

也许是最常见的选项是duration,指定了内容在缓存中多久有效。和CCache::set()过期参数有点类似。下面的代码缓存内容片段最多一小时:

......
<?php if($this->beginCache($id, array('duration'=>3600))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
......
로그인 후 복사

如果我们不设定期限,它将默认为60 ,这意味着60秒后缓存内容将无效。

依赖(Dependency)

像data caching ,内容片段被缓存也可以有依赖。例如,文章的内容被显示取决于文章是否被修改。

要指定一个依赖,我们建立了dependency选项,可以是一个实现[ICacheDependency]的对象或可用于生成依赖对象的配置数组。下面的代码指定片段内容取决于lastModified 列的值是否变化:

......
<?php if($this->beginCache($id, array('dependency'=>array(
        'class'=>'system.caching.dependencies.CDbCacheDependency',
        'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
......
로그인 후 복사

变化(Variation)

缓存的内容可根据一些参数变化。例如,每个人的档案都不一样。缓存的档案内容将根据每个人ID变化。这意味着,当调用beginCache()时将用不同的ID。

COutputCache内置了这一特征,程序员不需要编写根据ID变动内容的模式。以下是摘要。

varyByRoute: 设置此选项为true ,缓存的内容将根据route变化。因此,每个控制器和行动的组合将有一个单独的缓存内容。

varyBySession: 设置此选项为true ,缓存的内容将根据session ID变化。因此,每个用户会话可能会看到由缓存提供的不同内容。

varyByParam: 设置此选项的数组里的名字,缓存的内容将根据GET参数的值变动。例如,如果一个页面显示文章的内容根据id的GET参数,我们可以指定varyByParam为array('id'),以使我们能够缓存每篇文章内容。如果没有这样的变化,我们只能能够缓存某一文章。

有时候,我们希望片段缓存只对某些类型的请求启用。例如,对于某张网页上显示表单,我们只想要缓存initially requested表单(通过GET请求)。任何随后显示(通过POST请求)的表单将不被缓存,因为表单可能包含用户输入。要做到这一点,我们可以指定 requestTypes 选项:

......
<?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
......
로그인 후 복사

2. 嵌套缓存(Nested Caching)

片段缓存可以嵌套。就是说一个缓存片段附在一个更大的片段缓存里。例如,意见缓存在内部片段缓存,而且它们一起在外部缓存中在文章内容里缓存。

......
<?php if($this->beginCache($id1)) { ?>
...外部被缓存内容...
    <?php if($this->beginCache($id2)) { ?>
    ...内部被缓存内容...
    <?php $this->endCache(); } ?>
...外部被缓存内容...
<?php $this->endCache(); } ?>
......
로그인 후 복사

嵌套缓存可以设定不同的缓存选项。例如,在上面的例子中内部缓存和外部缓存可以设置时间长短不同的持续值。当数据存储在外部缓存无效,内部缓存仍然可以提供有效的内部片段。然而,反之就不行了。如果外部缓存包含有效的数据, 它会永远保持缓存副本,即使内容中的内部缓存已经过期。

页面缓存 

页面缓存指的是缓存整个页面的内容。页面缓存可以发生在不同的地方。例如,通过选择适当的页面头,客户端的浏览器可能会缓存网页浏览有限时间。Web应用程序本身也可以在缓存中存储网页内容。 在本节中,我们侧重于后一种办法。

页面缓存可以被看作是 片段缓存一个特殊情况 。 由于网页内容是往往通过应用布局来生成,如果我们只是简单的在布局中调用beginCache() 和endCache(),将无法正常工作。这是因为布局在CController::render()方法里的加载是在页面内容产生之后。

如果想要缓存整个页面,我们应该跳过产生网页内容的动作执行。我们可以使用COutputCache作为动作 过滤器来完成这一任务。下面的代码演示如何配置缓存过滤器:

public function filters(){
    return array(
        array(
            'COutputCache',
            'duration'=>100,
            'varyByParam'=>array('id'),
        ),
    );
}
로그인 후 복사

上述过滤器配置会使过滤器适用于控制器中的所有行动。 我们可能会限制它在一个或几个行动通过使用插件操作器。 更多的细节中可以看过滤器。

提示: 我们可以使用COutputCache作为一个过滤器,因为它从CFilterWidget继承过来, 这意味着它是一个工具(widget)和一个过滤器。事实上,widget的工作方式和过滤器非常相似。工具widget (过滤器filter)是在action动作里的内容执行前执行,在执行后结束。

6.缓存的使用:动态内容(Dynamic Content)

当使用fragment caching或page caching,我们常常遇到的这样的情况 整个部分的输出除了个别地方都是静态的。例如,帮助页可能会显示静态的帮助 信息,而用户名称显示的是当前用户的。

解决这个问题,我们可以根据用户名匹配缓存内容,但是这将是我们宝贵空间一个巨大的浪费,因为缓存除了用户名其他大部分内容是相同的。我们还可以把网页切成几个片段并分别缓存,但这种情况会使页面和代码变得非常复杂。更好的方法是使用由[ CController ]提供的动态内容dynamic content功能 。

动态内容是指片段输出即使是在片段缓存包括的内容中也不会被缓存。即使是包括的内容是从缓存中取出,为了使动态内容在所有时间是动态的,每次都得重新生成。出于这个原因,我们要求 动态内容通过一些方法或函数生成。

调用CController::renderDynamic()在你想的地方插入动态内容。

......
<?php if($this->beginCache($id)) { ?>
...被缓存的片段内容...
    <?php $this->renderDynamic($callback); ?>
...被缓存的片段内容...
<?php $this->endCache(); } ?>
......
로그인 후 복사

在上面的,$callback指的是有效的PHP回调。它可以是指向当前控制器类的方法或者全局函数的字符串名。也可以是一个数组名指向一个类的方法。其他任何的参数,将传递到 renderDynamic()方法中。回调将返回动态内容而不是仅仅显示它。

您可能感兴趣的文章

  • yii框架目录结构详细分析说明
  • Mysql 数据库缓存cache功能分析,调试以及性能总结
  • Yii框架Yiiapp()的理解
  • 网页缓存Js,css以及图片导致页面刷新无效果的三种解决办法
  • php打造属于自己的MVC框架简单案例,提供思路,仅供参考
  • yii数据库查询操作总结
  • php用ZipArchive函数实现文件的压缩与解压缩
  • 复选框(checkbox)和单选框(radio)与文字水平垂直居中对齐的解决方法

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/985845.htmlTechArticleyii框架缓存知识总结 缓存是用于提升网站性能的一种即简单又有效的途径。稍微有点规模的网站都会通过存储相对静态的数据至缓存以备所...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 프레임워크에 대한 상용 지원의 비용 효율성을 평가하는 방법 Java 프레임워크에 대한 상용 지원의 비용 효율성을 평가하는 방법 Jun 05, 2024 pm 05:25 PM

Java 프레임워크에 대한 상용 지원의 비용/성능 평가에는 다음 단계가 포함됩니다. 필요한 보증 수준과 SLA(서비스 수준 계약) 보장을 결정합니다. 연구지원팀의 경험과 전문성. 업그레이드, 문제 해결, 성능 최적화와 같은 추가 서비스를 고려하십시오. 위험 완화 및 효율성 향상을 기준으로 비즈니스 지원 비용을 평가합니다.

PHP 프레임워크의 경량 옵션은 애플리케이션 성능에 어떤 영향을 줍니까? PHP 프레임워크의 경량 옵션은 애플리케이션 성능에 어떤 영향을 줍니까? Jun 06, 2024 am 10:53 AM

경량 PHP 프레임워크는 작은 크기와 낮은 리소스 소비를 통해 애플리케이션 성능을 향상시킵니다. 그 특징은 다음과 같습니다: 작은 크기, 빠른 시작, 낮은 메모리 사용량, 향상된 응답 속도 및 처리량, 리소스 소비 감소 실제 사례: SlimFramework는 500KB에 불과한 REST API를 생성하며 높은 응답성과 높은 처리량을 제공합니다.

PHP 프레임워크의 학습 곡선은 다른 언어 프레임워크와 어떻게 비교됩니까? PHP 프레임워크의 학습 곡선은 다른 언어 프레임워크와 어떻게 비교됩니까? Jun 06, 2024 pm 12:41 PM

PHP 프레임워크의 학습 곡선은 언어 숙련도, 프레임워크 복잡성, 문서 품질 및 커뮤니티 지원에 따라 달라집니다. PHP 프레임워크의 학습 곡선은 Python 프레임워크에 비해 높고 Ruby 프레임워크에 비해 낮습니다. Java 프레임워크에 비해 PHP 프레임워크는 학습 곡선이 적당하지만 시작하는 데 걸리는 시간이 더 짧습니다.

Golang 프레임워크 문서화 모범 사례 Golang 프레임워크 문서화 모범 사례 Jun 04, 2024 pm 05:00 PM

Golang 프레임워크에서는 명확하고 포괄적인 문서를 작성하는 것이 중요합니다. 모범 사례에는 Google의 Go 코딩 스타일 가이드와 같은 확립된 문서 스타일을 따르는 것이 포함됩니다. 제목, 부제, 목록 등 명확한 조직 구조를 사용하고 탐색 기능을 제공하세요. 시작 안내서, API 참조 및 개념을 포함하여 포괄적이고 정확한 정보를 제공합니다. 코드 예제를 사용하여 개념과 사용법을 설명합니다. 문서를 계속 업데이트하고, 변경 사항을 추적하고, 새로운 기능을 문서화하세요. GitHub 문제 및 포럼과 같은 지원 및 커뮤니티 리소스를 제공합니다. API 문서와 같은 실용적인 예제를 만듭니다.

다양한 애플리케이션 시나리오에 가장 적합한 golang 프레임워크를 선택하는 방법 다양한 애플리케이션 시나리오에 가장 적합한 golang 프레임워크를 선택하는 방법 Jun 05, 2024 pm 04:05 PM

애플리케이션 시나리오를 기반으로 최고의 Go 프레임워크를 선택하세요. 애플리케이션 유형, 언어 기능, 성능 요구 사항 및 생태계를 고려하세요. Common Go 프레임워크: Gin(웹 애플리케이션), Echo(웹 서비스), Fiber(높은 처리량), gorm(ORM), fasthttp(속도). 실제 사례: REST API(Fiber) 구축 및 데이터베이스(gorm)와 상호 작용. 프레임워크를 선택하세요. 주요 성능을 ​​위해서는 fasthttp를 선택하고, 유연한 웹 애플리케이션을 위해서는 Gin/Echo를, 데이터베이스 상호작용을 위해서는 gorm을 선택하세요.

Golang 캐시와 잠금의 관계는 무엇입니까? Golang 캐시와 잠금의 관계는 무엇입니까? Jun 05, 2024 pm 04:08 PM

Golang 애플리케이션에서 캐싱과 잠금은 밀접하게 관련되어 있습니다. 캐시는 데이터 액세스 속도를 높이는 데 사용되고 잠금은 공유 리소스에 대한 동시 액세스를 제어하는 ​​데 사용됩니다. 캐시된 데이터는 여러 프로세스에서 동시에 읽을 수 있으며, 캐시의 데이터를 수정하려면 데이터 무결성을 보장하기 위해 잠금을 사용해야 합니다. 영구 캐시를 수정하려면 다른 프로세스가 동시에 데이터를 수정하지 못하도록 잠금을 사용해야 합니다. 실제 사례에서는 읽기-쓰기 잠금을 사용하여 캐시를 보호하여 캐시를 수정하기 전에 여러 프로세스가 동시에 캐시에 쓰지 않도록 할 수 있습니다. 뛰어난 동시성과 성능을 갖춘 Golang 애플리케이션을 구축하려면 캐싱과 잠금 간의 관계를 이해하는 것이 중요합니다.

Golang 프레임워크 학습 과정에서 흔히 저지르는 오해는 무엇입니까? Golang 프레임워크 학습 과정에서 흔히 저지르는 오해는 무엇입니까? Jun 05, 2024 pm 09:59 PM

Go 프레임워크 학습에는 다섯 가지 오해가 있습니다. 프레임워크에 대한 과도한 의존과 제한된 유연성입니다. 프레임워크 규칙을 따르지 않으면 코드를 유지 관리하기가 어려워집니다. 오래된 라이브러리를 사용하면 보안 및 호환성 문제가 발생할 수 있습니다. 패키지를 과도하게 사용하면 코드 구조가 난독화됩니다. 오류 처리를 무시하면 예기치 않은 동작과 충돌이 발생합니다.

Java 프레임워크 학습 로드맵: 다양한 분야의 모범 사례 Java 프레임워크 학습 로드맵: 다양한 분야의 모범 사례 Jun 05, 2024 pm 08:53 PM

다양한 분야에 대한 Java 프레임워크 학습 로드맵: 웹 개발: SpringBoot 및 PlayFramework. 지속성 계층: Hibernate 및 JPA. 서버 측 반응형 프로그래밍: ReactorCore 및 SpringWebFlux. 실시간 컴퓨팅: ApacheStorm 및 ApacheSpark. 클라우드 컴퓨팅: Java용 AWS SDK 및 Google Cloud Java.

See all articles