CINXE.COM
Redis - L2 cache | Ebean ORM
<!doctype html> <html lang="en"> <head> <title>Redis - L2 cache | Ebean ORM</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="shortcut icon" href="/images/favicon.ico"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto|Source+Sans+Pro|Ubuntu&display=swap"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous"> <link rel="stylesheet" href="/css/reset3.css"> <link rel="stylesheet" href="/css/site3.css"> <link rel="stylesheet" href="/css/pygments3.css"> </head> <body> <div id="main"> <div id="banner"> <header> <nav id="top"> <h1 id="breadcrumb"> <a class="nav-logo" href="/"><img src="/images/logo-200.png" height="35"></a> <a href="/docs">Documentation</a><span class="sep"> / </span><a href="/docs/database">Database platforms</a><span class="sep"> / </span><span class="last">Redis - L2 cache</span> </h1> <ul> <li><a onclick="toggleTheme();" title="switch dark light theme"><i class="fas fa-adjust"></i></a></li> </ul> </nav> </header> </div> <div class="grid grid-docs"> <aside> <nav class="side"> <ul> <li class="nav0 "> <a href="/docs/getting-started">Getting started</a> </li> <li class="nav0 "> <a href="/docs/intro">Introduction</a> </li> <li class="nav0 active"> <a class="active" href="/docs">Documentation</a> <ul> <li class="nav1 "> <a href="/docs/best-practice">Best practice</a> </li> <li class="nav1 "> <a href="/docs/query">Query</a> </li> <li class="nav1 "> <a href="/docs/persist">Persist</a> </li> <li class="nav1 "> <a href="/docs/transactions">Transactions</a> </li> <li class="nav1 "> <a href="/docs/mapping">Mapping</a> </li> <li class="nav1 "> <a href="/docs/ddl-generation">DDL & Migrations</a> </li> <li class="nav1 "> <a href="/docs/logging">Logging</a> </li> <li class="nav1 "> <a href="/docs/testing">Testing</a> </li> <li class="nav1 "> <a href="/docs/read-replicas">Read Replicas</a> </li> <li class="nav1 active"> <a class="active" href="/docs/database">Database platforms</a> <ul class="nav"> <li > <a href="/docs/database/postgres">Postgres</a> </li> <li > <a href="/docs/database/h2">H2</a> </li> <li > <a href="/docs/database/mysql">MySql</a> </li> <li > <a href="/docs/database/mariadb">MariaDB</a> </li> <li > <a href="/docs/database/sqlserver">SQL Server</a> </li> <li > <a href="/docs/database/oracle">Oracle</a> </li> <li > <a href="/docs/database/db2">DB2</a> </li> <li > <a href="/docs/database/hana">SAP Hana</a> </li> <li > <a href="/docs/database/sqlite">Sqlite</a> </li> <li > <a href="/docs/database/clickhouse">ClickHouse</a> </li> <li > <a href="/docs/database/cockroach">Cockroach</a> </li> <li > <a href="/docs/database/yugabyte">YugabyteDB</a> </li> <li > <a href="/docs/database/nuodb">NuoDB</a> </li> <li > <a href="/docs/database/elasticsearch">ElasticSearch</a> </li> <li class="active"> <a class="active" href="/docs/database/redis">Redis</a> </li> </ul> </li> <li class="nav1 "> <a href="/docs/multi-database">Multiple databases</a> </li> <li class="nav1 "> <a href="/docs/kotlin">Kotlin</a> </li> <li><a href="/docs/tuning">Tuning</a></li> <li class="nav1 "> <a href="/docs/features">Features</a> </li> </ul> </li> <li class="nav0 "> <a href="/support">Getting help</a> </li> <li class="nav0 "> <a target="_blank" href="/apidoc/13">API Javadoc</a> </li> <li class="nav0 "> <a href="/videos">Videos</a> </li> <li class="nav0 "> <a href="/docs/upgrading">Upgrading</a> </li> <li class="nav0 "> <a href="/releases">Releases</a> </li> </ul> </nav> </aside> <article> <form action="https://www.google.com/search" method="get" class="inline-form"> <input type="hidden" name="as_sitesearch" value="ebean.io"> <div id="page-search"> <div class="input-group"> <input class="frm" name="q" id="searchinput" type="text" placeholder="Search... (press 's' to focus)" data-placeholder-focus="Search... (use '↑', '↓' and '⏎' to select results)" data-placeholder-blur="Search... (press 's' to focus)" autocomplete="off"> <div class="input-group-btn"> <button class="frm" type="submit"><i class="fas fa-search"></i></button> </div> </div> <div id="page-search-results" style="display: none;"> <ul id="search-results-container" class="search-results"><li class=" active"><a href="/docs" title="Docs"><span style="color:#777;">Docs</span> Documentation </a></li><li class=""><small style="color:#999;">And 101 more...</small></li></ul> </div> </div> </form> <h2>Redis - L2 cache</h2> <p> Configure the redis server to use by setting <code>ebean.redis</code> properties in <code>main/resources/application.yaml</code> like below: </p> <p> Note that for property configuration to work when we <em>programmatically</em> create Database via DatabaseFactory and DatabaseConfig, then we need to make sure that we use <code>DatabaseConfig.loadFromProperties()</code> to load the properties. </p> <div class="syntax yml"><div class="highlight"><pre><span></span><span class="nt">ebean</span><span class="p">:</span> <span class="nt">redis</span><span class="p">:</span> <span class="nt">server</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">test-server</span> <span class="nt">port</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">99</span> <span class="nt">minIdle</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">2</span> <span class="nt">maxIdle</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">20</span> <span class="nt">maxTotal</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">20</span> <span class="nt">maxWaitMillis</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">300</span> </pre></div> </div> <p> For testing purposes set <code>ebean.test.redis</code> property to <code>latest</code> in in <code>test/resources/application-test.yaml</code>. This will get ebean-test to automatically start a redis docker container for use with L2 caching. </p> <div class="syntax yml"><div class="highlight"><pre><span></span><span class="nt">ebean</span><span class="p">:</span> <span class="nt">test</span><span class="p">:</span> <span class="nt">redis</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">latest</span> <span class="nt">platform</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">h2</span> <span class="c1"># h2, postgres, mysql, oracle, sqlserver, sqlite</span> <span class="nt">ddlMode</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">dropCreate</span> <span class="c1"># none | dropCreate | migrations | create</span> <span class="nt">dbName</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">my_app</span> </pre></div> </div> <h2>ebean-redis dependency</h2> <p> Add <code>ebean-redis</code> as a dependency. This will automatically register itself with ebean as the L2 cache service. </p> <div class="syntax xml"><div class="highlight"><pre><span></span><span class="nt"><dependency></span> <span class="nt"><groupId></span>io.ebean<span class="nt"></groupId></span> <span class="nt"><artifactId></span>ebean-redis<span class="nt"></artifactId></span> <span class="nt"><version></span>14.1.0<span class="nt"></version></span> <span class="nt"></dependency></span> </pre></div> </div> <h2>@Cache</h2> <p> Entity beans annotated with <code>@Cache</code> will now use redis for L2 caching. </p> <div class="syntax java"><div class="highlight"><pre><span></span><span class="nd">@Cache</span><span class="o">(</span><span class="nx">enableQueryCache</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="nx">nearCache</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="nx">naturalKey</span> <span class="o">=</span> <span class="s">"name"</span><span class="o">)</span> <span class="nd">@Entity</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Person</span> <span class="kd">extends</span> <span class="n">EBase</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">enum</span> <span class="n">Status</span> <span class="o">{</span> <span class="n">NEW</span><span class="o">,</span> <span class="n">ACTIVE</span><span class="o">,</span> <span class="n">INACTIVE</span> <span class="o">}</span> <span class="nd">@Index</span><span class="o">(</span><span class="nx">unique</span> <span class="o">=</span> <span class="kc">true</span><span class="o">)</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span> <span class="n">Status</span> <span class="n">status</span><span class="o">;</span> <span class="n">LocalDate</span> <span class="n">localDate</span><span class="o">;</span> <span class="n">String</span> <span class="n">notes</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">Person</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span> <span class="k">this</span><span class="o">.</span><span class="na">status</span> <span class="o">=</span> <span class="n">Status</span><span class="o">.</span><span class="na">NEW</span><span class="o">;</span> <span class="o">}</span> <span class="o">...</span> <span class="o">}</span> </pre></div> </div> <h2 id="starting">Docker container</h2> <p> We can programmatically start a docker container version of Redis. </p> <p> The below uses <code>ebean-test-docker</code> dependency which already comes with <code>ebean-test</code>. If we do not have a dependency on <code>ebean-test</code> then add <code>io.ebean:ebean-test-docker:5.0</code> as a dependency. </p> <div class="syntax java"><div class="highlight"><pre><span></span><span class="kn">package</span> <span class="nn">main</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">io.ebean.docker.commands.RedisContainer</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">RedisContainer</span> <span class="n">container</span> <span class="o">=</span> <span class="n">RedisContainer</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"latest"</span><span class="o">)</span> <span class="o">.</span><span class="na">build</span><span class="o">();</span> <span class="n">container</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </pre></div> </div> <nav class="next"> <p class="edit-page"> <a href="https://github.com/ebean-orm/website-source/blob/master/docs/database/elasticsearch/index.html"><i class="fab fa-github"></i> Edit Page</a> </p> <p class="next"> <a href="/docs/database/postgres" class="btn btn-info">Next: Postgres</a> </p> </nav> </article> </div> </div> <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> <script src="/js/site3.js"></script> <script src="/js/search3.js"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75181644-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-75181644-1'); </script> </body> </html>