<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://infinispan.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://infinispan.org/" rel="alternate" type="text/html" /><updated>2026-03-30T13:47:10+02:00</updated><id>https://infinispan.org/feed.xml</id><title type="html">Infinispan</title><subtitle>Infinispan is a distributed in-memory key/value data store with optional schema, available under the Apache License 2.0.</subtitle><entry><title type="html">Infinispan 16.1</title><link href="https://infinispan.org/blog/2026/02/04/infinispan-16-1" rel="alternate" type="text/html" title="Infinispan 16.1" /><published>2026-02-04T01:00:00+01:00</published><updated>2026-02-04T01:00:00+01:00</updated><id>https://infinispan.org/blog/2026/02/04/infinispan-16.1</id><content type="html" xml:base="https://infinispan.org/blog/2026/02/04/infinispan-16-1"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p><strong><em>"Polly Want a Pilsner"</em></strong></p>
</div>
<div class="paragraph">
<p>Infinispan 16.1 is here, and it is codenamed <a href="https://untappd.com/b/hop-city-brewing-co-polly-want-a-pilsner/1372902">"Polly Want a Pilsner"</a>.</p>
</div>
<div class="paragraph">
<p>It is the first release that follows <a href="/roadmap/">our time-boxed plan</a>.</p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/pollywantapilsner.png" alt="Polly Want a Pilsner" width="406" height="696">
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="container-based-eviction">Container-based eviction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Prior to this release, it was only possible to configure memory bounds for individual caches.</p>
</div>
<div class="paragraph">
<p>Infinispan 16.1 introduces the concept of bounded memory containers: configure a global container (you can have more
than one), and whether you want it to be bound by count or by memory and reference that container name in the cache
configuration.</p>
</div>
<div class="paragraph">
<p>The following diagram shows the difference between per-cache and container eviction</p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/memory-container.png" alt="Memory container">
</div>
</div>
<div class="paragraph">
<p>In the example below, the memory configuration for caches <code>a</code> and <code>b</code> combined will be bounded at <code>100MB</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;infinispan&gt;
   &lt;cache-container&gt;
      &lt;eviction-containers&gt;
         &lt;max-size-container name="max-size" size="100MB"/&gt;
      &lt;/eviction-containers&gt;

      &lt;local-cache name="a"&gt;
          &lt;memory eviction-container="max-size"/&gt;
      &lt;/local-cache&gt;

      &lt;local-cache name="b"&gt;
          &lt;memory eviction-container="max-size"/&gt;
      &lt;/local-cache&gt;
   &lt;/cache-container&gt;
&lt;/infinispan&gt;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="openapi-swagger">OpenAPI / Swagger</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Infinispan 10 introduced the <code>v2</code> REST endpoint which aimed to improve the original API and expand it with all the
requirements we added for data and system management. Unfortunately that API was designed in a way that made it
impossible to represent via an OpenAPI descriptor.</p>
</div>
<div class="paragraph">
<p>Infinispan 16.1 introduces a new <code>v3</code> REST API which <strong>is</strong> OpenAPI-compliant.</p>
</div>
<div class="paragraph">
<p>To try it out, start an Infinispan Server and point to <a href="http://127.0.0.1:11222/swagger-ui/" class="bare">http://127.0.0.1:11222/swagger-ui/</a></p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/swaggerui.png" alt="Infinispan v3 REST API">
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="query-and-lucene-10">Query and Lucene 10</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Thanks to the work done by our friends over at <a href="https://hibernate.org/search/">Hibernate Search</a>, Infinispan now supports
both Lucene 9 and 10.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="infinispan-server">Infinispan Server</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="server-now-requires-java-25">Server now requires Java 25</h3>
<div class="paragraph">
<p>Our server image has already included Java 25 since 16.0, but we&#8217;ve now made this a hard requirement for bare metal
deployments too.
Don&#8217;t worry: the clients can continue running with <em>ye olde</em> legacy Java versions of choice.</p>
</div>
</div>
<div class="sect2">
<h3 id="lucene-10-3">Lucene 10.3</h3>
<div class="paragraph">
<p>By requiring Java 25, the server can now include
<a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-1030-available">Lucene 10.3</a>, which can leverage SIMD to
increase performance in several areas.</p>
</div>
</div>
<div class="sect2">
<h3 id="pre-start-batch-scripts">Pre-start batch scripts</h3>
<div class="paragraph">
<p>The server can now automatically execute batch scripts before start.
This feature is primarily intended for our operator in order to prepare the server according to its configuration, but
it may also be useful for your own use-cases.</p>
</div>
</div>
<div class="sect2">
<h3 id="aot-cache-in-the-container-image">AOT cache in the container image</h3>
<div class="paragraph">
<p>The server image now includes an <a href="https://openjdk.org/jeps/483">AOT cache</a> to reduce startup and warmup time.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="cli-batch-error-handling">CLI batch error handling</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The CLI has been enhanced to better report errors during batch execution: you can now decide to fail-fast, fail-at-end
or ignore batch errors altogether.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="default-mechanisms">Default mechanisms</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Infinispan Server no longer enables weak/vulnerable authentication mechanisms by default: algorithms which use
<code>MD5</code> and <code>SHA-1</code> must be explicitly enabled if you want to keep using them.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="backwards-compatibility">Backwards compatibility</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Infinispan 16.1 is fully backwards compatible with 16.0 deployments.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="the-next-release">The next release</h2>
<div class="sectionbody">
<div class="paragraph">
<p>According to our <a href="/roadmap/">roadmap</a>, our next release will be 16.2, and it will happen on 2026-06-03.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="release-notes">Release notes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can look at the <a href="https://github.com/infinispan/infinispan/releases/tag/16.1.0">release notes</a> to see what was changed
since our previous release.</p>
</div>
<div class="paragraph">
<p>Get them from our <a href="https://infinispan.org/download/">download page</a>.</p>
</div>
</div>
</div>]]></content><author><name>Tristan Tarrant</name></author><category term="release" /><category term="final" /><summary type="html"><![CDATA["Polly Want a Pilsner"]]></summary></entry><entry><title type="html">Infinispan Insights: Supporting Redis JSON and Scripting features with Infinispan</title><link href="https://infinispan.org/blog/2026/01/14/infinispan-resp-json-lua-scripting" rel="alternate" type="text/html" title="Infinispan Insights: Supporting Redis JSON and Scripting features with Infinispan" /><published>2026-01-14T01:00:00+01:00</published><updated>2026-01-14T01:00:00+01:00</updated><id>https://infinispan.org/blog/2026/01/14/infinispan-json-commands-lua-scripting</id><content type="html" xml:base="https://infinispan.org/blog/2026/01/14/infinispan-resp-json-lua-scripting"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>In Infinispan 15, we added a variety of commands to help replace your Redis server without changing your code. The 15.2 release also included Lua Scripting and Redis JSON APIs.
Key takeaways:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Understanding Redis JSON commands</p>
</li>
<li>
<p>The benefits of Lua scripting</p>
</li>
<li>
<p>How and why transition applications from Redis to Infinispan, or use Infinispan as a
backend while working with Redis clients.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>This article follows up on supporting multiple Redis databases with Infinispan.
For more details, check out the <a href="https://infinispan.org/blog/2024/10/07/cache-aliases-redis-databases">full article</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="redis-drop-in-replacement-with-infinispan">Redis drop-in replacement with Infinispan</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A drop-in replacement means you can substitute one technology for another without changing
application code. This is valuable because:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Minimizes migration effort</strong>: You avoid rewriting logic or changing client libraries significantly.</p>
</li>
<li>
<p><strong>Reduces downtime and risk:</strong> You can swap the backend and test incrementally.</p>
</li>
<li>
<p><strong>Retains existing usage patterns</strong>: Developers can continue using the familiar APIs and data models.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Replacing open-source Redis with Infinispan offers several key benefits, especially
for Java-based or enterprise-grade systems. Infinispan is fully open source under Apache 2.0,
avoiding the licensing limitations of Redis modules. It provides advanced clustering, built-in high availability
(Active-Active cross site replication), and better support for distributed and geo-replicated setups.
It supports multiple databases even in clustered mode and it offers flexible persistence options like write-through and write-behind.
Additionally, it includes robust security features such as fine-grained access control and encryption,
and supports multiple deployment modes including embedded, server, and Kubernetes-native.</p>
</div>
<div class="paragraph">
<p>Let&#8217;s test how this works, now also with JSON commands and Lua scripts.</p>
</div>
<div class="sect2">
<h3 id="running-infinispan-as-usual">Running Infinispan as usual</h3>
<div class="paragraph">
<p><a href="https://infinispan.org/get-started/">Get started tutorial</a> is the best place to start.
Just run the following command with docker or podman.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">podman/docker run -it -p 11222:11222 -e USER="admin" -e PASS="password" quay.io/infinispan/server:latest</code></pre>
</div>
</div>
<div class="sect3">
<h4 id="running-infinispan-with-the-redis-default-port">Running Infinispan with the Redis default port</h4>
<div class="paragraph">
<p>For those want to keep using the <strong>6379</strong> port, run Infinispan providing the following configuration
file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">podman/docker run -it -p 6379:6379 -p 11222:11222 -e USER="admin" -e PASS="password" quay.io/infinispan/server:latest -c infinispan-resp.xml</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Map -p 6379:6379 -p 11222:11222 (you keep the access to the console)</p>
</li>
<li>
<p>Provide -c infinispan-resp.xml configuration file</p>
</li>
<li>
<p>-e USER="admin" -e PASS="password will be used for 11222 port security</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="using-a-redis-client">Using a Redis client</h3>
<div class="paragraph">
<p>Once the server is running, connect to Infinispan using Redis-CLI.
Use port <strong>11222</strong> instead of the default <strong>6379</strong> if you are running Infinispan as usual.
Since Infinispan is secured by default, make sure to provide the admin credentials.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">&gt; redis-cli -3 -p 11222 --raw
127.0.0.1:11222&gt; AUTH admin password
OK</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Connect using Protocol 3</p>
</li>
<li>
<p>Use -p 11222 (Infinispan single port)</p>
</li>
<li>
<p>Add --raw option to allow formatting</p>
</li>
<li>
<p>Authenticate with admin/password</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>You can access the Infinispan Server Console as usual in <a href="http://localhost:11222" class="bare">http://localhost:11222</a>, with admin/password credentials.
Check the (<a href="https://infinispan.org/blog/2024/10/07/cache-aliases-redis-databases">cache aliases tutorial</a> to learn
more about respCache and how it connects to Redis Databases and cache aliases.</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="/assets/images/blog/2025-04-11-resp-json-lua/ServerConsole_15_2.png"><img src="/assets/images/blog/2025-04-11-resp-json-lua/ServerConsole_15_2.png" alt="Infinispan Web Console 15.2"></a>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="redis-json-feature">Redis JSON Feature</h2>
<div class="sectionbody">
<div class="paragraph">
<p>RedisJSON is a powerful extension for managing JSON data directly in Redis.
If you&#8217;re working with JSON-like data and need fast, efficient access and
manipulation, RedisJSON is a great tool to use. This is part of the RedisStack
or Redis Enterprise, and works with the JSON Query engine
(which is not supported by Infinispan for now).</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">127.0.0.1:11222&gt; JSON.SET doc $ '{"project":"infinispan", "details": {"latest": "16.0", "year": 2025}}'
OK
127.0.0.1:11222&gt; JSON.GET doc INDENT "\t" NEWLINE "\n" SPACE " " $
[
	{
		"project": "infinispan",
		"details": {
			"latest": "16.0",
			"year": 2025
		}
	}
]
127.0.0.1:11222&gt; JSON.OBJKEYS doc $
project
details</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the console, the REST API currently shows the key, and the value is
only displayed as the JSON.Bucket. Additional support for displaying more data
is planned for future Infinispan releases, so we just need to wait a bit for the ability to
show more content through the REST API.</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="/assets/images/blog/2025-04-11-resp-json-lua/Json_Bucket.png"><img src="/assets/images/blog/2025-04-11-resp-json-lua/Json_Bucket.png" alt="Json RESP cache"></a>
</div>
</div>
<div class="paragraph">
<p><strong>All JSON commands are implemented for the RESP 3 responses.</strong></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="scripting-feature">Scripting Feature</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Lua scripting in Redis lets you write small programs in the Lua language
that run directly on the Redis server. This helps you perform multiple actions
in one go, saving time and making things faster. You can use it to do complex
tasks without sending many commands back and forth between the client and server.</p>
</div>
<div class="paragraph">
<p>Since <strong>Infinispan 16.0</strong>, you can now use Lua Scripting to perform these operations.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">127.0.0.1:11222&gt; EVAL "return 'Hello, scripting!'" 0
Hello, scripting!
127.0.0.1:11222&gt; EVAL "return ARGV[1]" 0 Hello
Hello
127.0.0.1:11222&gt; EVAL "return ARGV[1]" 0 Parameterization!
Parameterization!
127.0.0.1:11222&gt; EVAL "redis.call('SET', KEYS[1], ARGV[1]) redis.call('SET', KEYS[2], ARGV[2]) redis.call('SET', KEYS[3], ARGV[3]) return 'SET commands executed'" 3 key1 key2 key3 value1 value2 value3
SET commands executed
127.0.0.1:11222&gt; KEYS "*"
key2
key3
key1
doc</code></pre>
</div>
</div>
<div class="paragraph">
<p>Technically speaking, when using Infinispan, scripts are stored in an internal
cache <strong>___script_cache</strong>.
This cache is handled by Infinispan and manipulating it requires admin permissions.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="conclusions">Conclusions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In this tutorial, you’ve learned how to use Infinispan for JSON commands and Scripting from
version 16.0. Redis Hot Replacement is gaining attention,
especially with the concerns about Redis' licensing changes in 2024.
Infinispan, an open-source solution under the Apache 2.0 license,
is part of the <a href="https://www.commonhaus.org/">Commonhaus foundation</a>, allowing
free use in your products.
If you need official support, you can get it through supported versions of Infinispan.</p>
</div>
</div>
</div>]]></content><author><name>Katia Aresti</name></author><category term="resp" /><category term="infinispan" /><category term="json" /><category term="lua" /><summary type="html"><![CDATA[In Infinispan 15, we added a variety of commands to help replace your Redis server without changing your code. The 15.2 release also included Lua Scripting and Redis JSON APIs. Key takeaways:]]></summary></entry><entry><title type="html">Infinispan 16.0.5</title><link href="https://infinispan.org/blog/2025/12/18/infinispan-16-0-5" rel="alternate" type="text/html" title="Infinispan 16.0.5" /><published>2025-12-18T01:00:00+01:00</published><updated>2025-12-18T01:00:00+01:00</updated><id>https://infinispan.org/blog/2025/12/18/infinispan-16.0.5</id><content type="html" xml:base="https://infinispan.org/blog/2025/12/18/infinispan-16-0-5"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>We don&#8217;t usually blog about micros&#8230;&#8203; but this is the second time in as many days that I have to break with tradition.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="serious-protostream-bug-with-latin1-strings">Serious ProtoStream bug with Latin1 strings</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you were using strings that could be represented as Latin1/ISO-8859-1 in your protocol buffer payloads, ProtoStream
was corrupting them. ASCII and full UTF-8 were fine. We&#8217;ve now fixed this bug. Thanks
<a href="https://github.com/sf-db">Sergey Filipkov</a> for reporting this.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="java-serialization-failure-to-serialize-some-collections">Java serialization failure to serialize some collections</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Another marshalling bug was affecting Java serialization of some collection types. Thanks <a href="https://github.com/ratoaq2">Rato</a>
for reporting this</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="release-notes">Release notes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can look at the <a href="https://github.com/infinispan/infinispan/releases/tag/16.0.5">release notes</a> to see what was changed
since our previous release.</p>
</div>
<div class="paragraph">
<p>Get them from our <a href="https://infinispan.org/download/">download page</a>.</p>
</div>
</div>
</div>]]></content><author><name>Tristan Tarrant</name></author><category term="release" /><category term="final" /><summary type="html"><![CDATA[We don&#8217;t usually blog about micros&#8230;&#8203; but this is the second time in as many days that I have to break with tradition.]]></summary></entry><entry><title type="html">Infinispan 16.0.4</title><link href="https://infinispan.org/blog/2025/12/17/infinispan-16-0-4" rel="alternate" type="text/html" title="Infinispan 16.0.4" /><published>2025-12-17T01:00:00+01:00</published><updated>2025-12-17T01:00:00+01:00</updated><id>https://infinispan.org/blog/2025/12/17/infinispan-16.0.4</id><content type="html" xml:base="https://infinispan.org/blog/2025/12/17/infinispan-16-0-4"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>We don&#8217;t usually blog about micros, unless there are important things to mention, and in this case we have a couple
of significant changes to share with you.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="spring-framework-7-and-spring-boot-4-support">Spring Framework 7 and Spring Boot 4 support</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Spring Framework 7 and Spring Boot 4 were released just after we tagged 16.0.0. We were planning on releasing support
for these with the 16.1 release at the beginning of February, but we decided it was too important to wait until
then.
16.0.4 includes artifacts for both Spring 7 / Boot 4 and Spring 6 / Boot 3. See the
<a href="https://infinispan.org/docs/stable/titles/spring/spring.html">documentation</a> for details</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="metrics-changes">Metrics changes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We forgot to make some changes to the default metrics configuration attributes during the 16.0 development cycle, even
though that was our intention all along.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>JVM metrics are no longer registered by default in embedded mode, as that should be the job of the application and
not the library.</p>
</li>
<li>
<p>Cache names are now included in metrics as tags as opposed to names, which should make querying and charting easier</p>
</li>
<li>
<p>Legacy metrics name prefixes (base and vendor) have been replaced with more appropriate library names.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>All these can be reverted to their old configuration if needed, but trust us: the new defaults are better.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="release-notes">Release notes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can look at the <a href="https://github.com/infinispan/infinispan/releases/tag/16.0.4">release notes</a> to see what was changed
since our previous release.</p>
</div>
<div class="paragraph">
<p>Get them from our <a href="https://infinispan.org/download/">download page</a>.</p>
</div>
</div>
</div>]]></content><author><name>Tristan Tarrant</name></author><category term="release" /><category term="final" /><summary type="html"><![CDATA[We don&#8217;t usually blog about micros, unless there are important things to mention, and in this case we have a couple of significant changes to share with you.]]></summary></entry><entry><title type="html">Infinispan 16.0 is out!</title><link href="https://infinispan.org/blog/2025/11/10/infinispan-16-0" rel="alternate" type="text/html" title="Infinispan 16.0 is out!" /><published>2025-11-10T01:00:00+01:00</published><updated>2025-11-10T01:00:00+01:00</updated><id>https://infinispan.org/blog/2025/11/10/infinispan-16.0</id><content type="html" xml:base="https://infinispan.org/blog/2025/11/10/infinispan-16-0"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p><strong><em>"Keep Rollin'"</em></strong></p>
</div>
<div class="paragraph">
<p>Infinispan 16.0 is here, and it is codenamed <a href="https://untappd.com/b/lake-of-bays-brewing-company-keep-rollin/5822804">"Keep Rollin'"</a>.</p>
</div>
<div class="paragraph">
<p>This is a very significant release, as it introduces zero-downtime in-place rolling upgrades: the capability of
incrementally upgrading individual nodes in a cluster without having to stop operations.</p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/keeprollin.jpeg" alt="Keep Rollin'" width="375" height="500">
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="final-not-final">Final not .Final</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Starting with this release, we will no longer be appending <code>.Final</code> to the version number. This release is therefore just <code>16.0.1</code>.
Why not <code>16.0.0</code> ? Don&#8217;t ask 😀.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="in-place-rolling-upgrades">In-place rolling upgrades</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Starting with Infinispan 16.0, we guarantee that it will be possible to upgrade the nodes of a live Infinispan cluster
to a newer version with zero downtime.
This guarantee will initially cover point releases (16.0.x &#8594; 16.0.y), but we will strive to also maintain it across
minor releases (16.x &#8594; 16.y): for every new release, we will be providing a table of supported upgrade paths to help
you plan your upgrade strategies.</p>
</div>
<div class="sect2">
<h3 id="clustering">Clustering</h3>
<div class="paragraph">
<p>The clustering messages, that Infinispan nodes use to communicate with each other, have been rewritten to use
<a href="https://protobuf.dev/">Protocol Buffers</a>, via the <a href="https://github.com/infinispan/protostream">ProtoStream</a> serialization
library. By adopting ProtoBuf&#8217;s <a href="https://protobuf.dev/best-practices/dos-donts/">best practices</a> for schema evolution and
a number of supporting tools, we can guarantee that incompatibilities cannot be introduced into these messages without
breaking our builds and tests.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="upgrade-test-harness">Upgrade test harness</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We have implemented an extensive test harness, integrated into our CI pipelines, that validates that every change that is
made to Infinispan does not break backwards compatibility. This harness exercises every command,
supported by coverage reports that help us identify untested code paths.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="console">Console</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Since Infinispan 15.2, the console has used <a href="https://www.patternfly.org/">PatternFly</a> 6 for its interface.
With this major update, we also added new features for users starting from version 16.0.</p>
</div>
<div class="sect2">
<h3 id="update-at-runtime-cache-configuration">Update at runtime cache configuration</h3>
<div class="paragraph">
<p>We have allowed mutating some cache configuration attributes at runtime for a while, and, starting with this release,
this can also be done from the Web Console.</p>
</div>
<div class="paragraph">
<p>A new menu option is now available for administrators:</p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/2025-infinispan-16-release/consoleUpdateCacheConfigRuntime1.png" alt="Edit Runtime Configuration Menu">
</div>
</div>
<div class="paragraph">
<p>The runtime properties that can be updated will be listed:</p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/2025-infinispan-16-release/consoleUpdateCacheConfigRuntime2.png" alt="Edit Runtime Configuration Screen">
</div>
</div>
</div>
<div class="sect2">
<h3 id="rolling-upgrade-detection">Rolling Upgrade detection</h3>
<div class="paragraph">
<p>From version 16.0 onward, when a rolling upgrade is in progress, the Console
will display a warning to inform users that the operation is underway.</p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/2025-infinispan-16-release/consoleRollingUpgrade.png" alt="Rolling Upgrade Detection">
</div>
</div>
</div>
<div class="sect2">
<h3 id="working-behind-a-reverse-proxy">Working behind a Reverse Proxy</h3>
<div class="paragraph">
<p>Previously, the console URL could not be configured to work behind a reverse proxy.
Starting with version 16.0, you can set up Infinispan and the console to run behind one, such as NGINX.
The <code>X-Forwarded-Prefix</code> header is now supported by both Infinispan and the console to correctly serve the
console and the REST API.</p>
</div>
<div class="exampleblock">
<div class="content">
<div class="literalblock">
<div class="content">
<pre> location /infinispan/console/ {
            proxy_pass http://infinispan:11222/console/;
            proxy_set_header X-Forwarded-Prefix /infinispan;
}</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
<p>See the <a href="https://github.com/infinispan/infinispan-simple-tutorials/tree/main/infinispan-remote/reverse-proxy-infinispan">Reverse Proxy Simple Tutorial</a>
in the Infinispan Simple Tutorials repository for more details.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="schemas-management-client-api">Schemas Management Client API</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Users can now manage ProtoStream Schemas with a dedicated administration API.</p>
</div>
<div class="exampleblock">
<div class="content">
<div class="paragraph">
<p>RemoteSchemasAdmin admin = remoteCacheManager.administration().schemas();
Optional&lt;Schema&gt; = admin.get("schemaName");</p>
</div>
</div>
</div>
<div class="paragraph">
<p>See the <a href="https://github.com/infinispan/infinispan-simple-tutorials/tree/main/infinispan-remote/schemas">Schemas Simple Tutorial</a>
in the Infinispan Simple Tutorials repository for more details.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="query">Query</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="refactoring">Refactoring</h3>
<div class="paragraph">
<p>The various query modules have all been aggregated into the single <code>infinispan-query</code> JAR, greatly simplifying our
dependency tree and paving the way for JPMS encapsulation.</p>
</div>
</div>
<div class="sect2">
<h3 id="aggregations">Aggregations</h3>
<div class="paragraph">
<p>Previously, only the <strong>count</strong> aggregation query could be executed in an indexed clustered query, providing excellent performance.
Now, all other aggregation types (such as <strong>sum</strong>, <strong>avg</strong>, and others) work in the same way.
This improvement comes from the new capabilities in Hibernate Search 8.1, which has been
integrated into Infinispan’s internal engine.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="server">Server</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We have introduced several fixes and enhancements to the Infinispan Server.</p>
</div>
<div class="sect2">
<h3 id="server-container-image">Server container image</h3>
<div class="paragraph">
<p>The Infinispan Server container image is now built using the bare minimum required components, aiming to provide a
significantly reduced attack surface.</p>
</div>
</div>
<div class="sect2">
<h3 id="server-startup">Server startup</h3>
<div class="paragraph">
<p>We have decoupled the server and the cache container start procedure, where they can start concurrently.
This provides a faster startup time for the server, that can start replying to requests earlier.
This helps in scenarios where the server receive probe requests for liveness and readiness. Also, this allows
for better handling when a cache may fail to start allowing other caches to continue operating.</p>
</div>
</div>
<div class="sect2">
<h3 id="on-demand-caches">On-demand caches</h3>
<div class="paragraph">
<p>The caches associated with dedicated connectors, such as Memcached and RESP, do not create the caches at start.
These caches are now created on demand at the first access.
In case these endpoints are not accessed, the caches are never created.</p>
</div>
</div>
<div class="sect2">
<h3 id="updated-lua-engine">Updated Lua engine</h3>
<div class="paragraph">
<p>We are shipping an updated Lua 5.1 engine, for Redis scripting, that includes a number of CVE fixes that have not been
applied to the upstream Lua repository. Also, a number of dangerous Lua scripting operations have been disabled.
The security of your servers is of the highest priority to us.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="jdk-improvements">JDK improvements</h2>
<div class="sectionbody">
<div class="paragraph">
<p>While Infinispan still requires at least JDK 17, we have made several changes to take advantage of the features
introduced in newer JDKs, including support for the recently released JDK 25.</p>
</div>
<div class="sect2">
<h3 id="virtual-threads">Virtual threads</h3>
<div class="paragraph">
<p>Infinispan by default not utilized Virtual Threads in both Embedded and Server modes. This includes Infinispan
enabling virtual threads in JGroups by default. Virtual threads are used by the non-blocking and blocking thread
pools in Embedded mode and the blocking thread pool in Server mode. The latter utilizes Netty event loop for its
non-blocking thread pool which does not yet support virtual threads.</p>
</div>
<div class="paragraph">
<p>If necessary is possible to disable by setting the <code>org.infinispan.threads.virtual</code> system property to <code>false</code>.</p>
</div>
</div>
<div class="sect2">
<h3 id="aot">AOT</h3>
<div class="paragraph">
<p>Infinispan Server (and the CLI) can leverage OpenJDK&#8217;s Ahead-of-Time features introduced in
<a href="https://openjdk.org/jeps/483">JEP 483</a> to decrease startup time and initial memory usage.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="fixes">Fixes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Lots of these. However, should you find something that doesn&#8217;t work, head over to our
<a href="https://github.com/infinispan/infinispan/issues">issues</a> and provide any details that help us debug and solve problems.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="deprecations-and-removals">Deprecations and removals</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The old Single File Store has now been completely replaced by the more scalable Soft-Index File Store and cannot be
configured declaratively any longer.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="documentation">Documentation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>As usual, many improvements, updates and fixes.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="whats-next">What&#8217;s next?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Infinispan is adopting timeboxed releases starting with our next release (16.1). See our <a href="https://infinispan.org/roadmap/">roadmap</a>
for information. We will soon be blogging more about it.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="release-notes">Release notes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can look at the <a href="https://github.com/infinispan/infinispan/releases/tag/16.0.0">release notes</a> to see what was changed
since our last development build.</p>
</div>
<div class="paragraph">
<p>Get them from our <a href="https://infinispan.org/download/">download page</a>.</p>
</div>
</div>
</div>]]></content><author><name>Tristan Tarrant</name></author><category term="release" /><category term="final" /><summary type="html"><![CDATA["Keep Rollin'"]]></summary></entry><entry><title type="html">Infinispan 15.2.0.Final</title><link href="https://infinispan.org/blog/2025/03/27/infinispan-15-2" rel="alternate" type="text/html" title="Infinispan 15.2.0.Final" /><published>2025-03-27T01:00:00+01:00</published><updated>2025-03-27T01:00:00+01:00</updated><id>https://infinispan.org/blog/2025/03/27/infinispan-15.2.0.Final</id><content type="html" xml:base="https://infinispan.org/blog/2025/03/27/infinispan-15-2"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p><strong><em>"Feelin' Blue"</em></strong></p>
</div>
<div class="paragraph">
<p>It&#8217;s new.
It&#8217;s blue.
It&#8217;s Infinispan 15.2, codenamed <a href="https://untappd.com/b/three-sisters-brewery-feelin-blue/6087587">"Feelin' Blue"</a>.</p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/feelinblue.jpg" alt="Feelin' Blue" width="415" height="975">
</div>
</div>
<div class="paragraph">
<p>Without further ado, here&#8217;s a list of what&#8217;s new (and I promise to stop with the Dr. Seuss rhyming):</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="resp-endpoint">RESP endpoint</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="json">JSON</h3>
<div class="paragraph">
<p>Infinispan now implements the <a href="https://redis.io/docs/latest/develop/data-types/json/">Redis JSON API</a>.</p>
</div>
</div>
<div class="sect2">
<h3 id="lua-scripting">Lua scripting</h3>
<div class="paragraph">
<p>It is now possible to run <a href="https://redis.io/docs/latest/develop/interact/programmability/eval-intro/">Lua scripts</a>.
The big advantage is that this works in Infinispan clusters, without having to worry about key ownership.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="server">Server</h2>
<div class="sectionbody">
<div class="paragraph">
<p>All endpoints limit the maximum request size, which defaults to <code>10MB</code>. This protects your server from abuse.
Use the <code>max-content-length</code> configuration attribute to change it to your liking.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="metrics">Metrics</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can now disable exporting the base (JVM) metrics, which is desirable when running in embedded mode.
Such metrics are usually exported by the application framework.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="console">Console</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The console sports a new look &amp; feel, thanks to the upgrade to <a href="https://www.patternfly.org/">PatternFly 6</a>.</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="/assets/images/blog/console15.2-1.png"><img src="/assets/images/blog/thumb-console15.2-1.png" alt="Console #1" width="550" height="284"></a>
</div>
</div>
<div class="paragraph">
<p>Manage roles, users and access control for Principal Role Mappers from the console.</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="/assets/images/blog/console15.2-2.png"><img src="/assets/images/blog/thumb-console15.2-2.png" alt="Console #1" width="550" height="232"></a>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="fixes">Fixes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Lots of these. However, should you find something that doesn&#8217;t work, head over to our <a href="https://github.com/infinispan/infinispan/issues">issues</a> and provide any details that help us debug and solve problems.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="jdk-requirements">JDK requirements</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Like the previous 15.x releases, you will need at least JDK 17 in order to use Infinispan 15.2. Infinispan also supports the recently released JDK 24.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="deprecations-and-removals">Deprecations and removals</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We are no longer building the native server, since it did not provide the same level of functionality and performance as our Java server.
However, if you miss it, please let us know your use case, and we&#8217;ll look into bringing it back.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="documentation">Documentation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Our documentation now includes
* <a href="https://infinispan.org/docs/stable/titles/metrics/metrics.html">a complete list of our OpenMetrics and JMX metrics</a>
* <a href="https://infinispan.org/docs/stable/logging/logs.html">a complete list of log messages</a>
As usual, many improvements, updates and fixes.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="release-notes">Release notes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can look at the <a href="https://github.com/infinispan/infinispan/releases/tag/15.2.0.Final">release notes</a> to see what was changed since our last development build.</p>
</div>
<div class="paragraph">
<p>Get them from our <a href="https://infinispan.org/download/">download page</a>.</p>
</div>
</div>
</div>]]></content><author><name>Tristan Tarrant</name></author><category term="release" /><category term="final" /><summary type="html"><![CDATA["Feelin' Blue"]]></summary></entry><entry><title type="html">Bilbostack Conference</title><link href="https://infinispan.org/blog/2025/01/27/bilbostack-2025" rel="alternate" type="text/html" title="Bilbostack Conference" /><published>2025-01-27T01:00:00+01:00</published><updated>2025-01-27T01:00:00+01:00</updated><id>https://infinispan.org/blog/2025/01/27/bilbostack</id><content type="html" xml:base="https://infinispan.org/blog/2025/01/27/bilbostack-2025"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>This weekend, I had the honor of speaking about In-Memory Databases at <a href="https://bilbostack.com/">BilboStack</a> in Bilbao, Spain.
It was a special moment for me because Bilbao is my hometown, where I completed
my Software Engineering studies 20 years ago. Public speaking
is always a challenge, but presenting in my hometown came with the added
pressure of not wanting to disappoint.</p>
</div>
<div class="paragraph">
<p>BilboStack is a 1000-attendees tech event featuring two tracks with four talks each in
the morning, followed by networking sessions in the afternoon.
This year marked its 13th edition. <a href="https://www.linkedin.com/posts/bart-farrell_bilbostack-activity-7289558740582748160-P2dl?utm_source=share&amp;utm_medium=member_desktop">Here is a short video of the conference</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="what-did-i-talk-about">What did I talk about?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>I spoke about In-Memory Databases. One of their main use cases is caching and session replication, so I explained
the basics of distributed caching.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/images/blog/2025-bilbostack/title.jpeg" alt="Slide title">
</div>
</div>
<div class="paragraph">
<p>I covered:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Embedded caching  with a library.</p>
</li>
<li>
<p>Embedded distributed caching, which works across multiple systems.</p>
</li>
<li>
<p>Using an in-memory database to keep applications stateless while managing
caching through the database, making it easy to scale cpu or memory up or down.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>I also highlighted use cases such as real-time statistics, fast operations,
and implementing security and backups for cross-site deployments
(spanning multiple data centers).</p>
</div>
<div class="paragraph">
<p>The talk was very well received, and I got great feedback.
I kept the content general but also showcased how Infinispan,
the open-source product I work on, fits these scenarios.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="demo-and-slides">Demo and Slides</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Demo and slides are available in this repository:
<a href="https://github.com/karesti/bilbostack-2025">GitHub - Bilbo Stack 2025</a>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/images/blog/2025-bilbostack/infinispan.jpeg" alt="Slide Infinispan Call">
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="questions">Questions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>I got many questions, but we did not have time to answer them during the session.
Here are some of them, others will be answered in more detailed blog posts.</p>
</div>
<div class="sect2">
<h3 id="can-infinispan-be-compared-to-redis">Can Infinispan be compared to Redis?</h3>
<div class="paragraph">
<p>Yes, Infinispan is a competitor to Redis and can even act as a drop-in
replacement. This allows you to continue using your existing applications
and clients while switching to Infinispan. Tristan Tarrant’s video offers
a detailed comparison: <a href="https://www.youtube.com/watch?v=Kb46QFigx84&amp;t=1s">Redis vs Infinispan: Battle of the in-memory data stores</a>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/images/blog/2025-bilbostack/slide.jpeg" alt="Slide Infinispan Server">
</div>
</div>
</div>
<div class="sect2">
<h3 id="is-clear-the-cache-the-new-restart-your-computer">Is "clear the cache" the new "restart your computer"?</h3>
<div class="paragraph">
<p>It often feels that way! Caches—whether browser-based or tools like
Varnish—can trick us into thinking something is broken when it’s not.
Clearing the cache is often a quick fix.</p>
</div>
</div>
<div class="sect2">
<h3 id="can-in-memory-databases-work-with-other-languages-or-visualization-tools">Can in-memory databases work with other languages or visualization tools?</h3>
<div class="paragraph">
<p>Absolutely! In-memory databases support multiple programming languages via
clients or APIs. These databases (e.g., Infinispan, Redis, Couchbase)
also integrate with popular visualization tools and frameworks.</p>
</div>
</div>
<div class="sect2">
<h3 id="on-vector-databases">On Vector Databases</h3>
<div class="paragraph">
<p>Vector databases are growing in popularity for AI use cases, but
in-memory databases like Infinispan have supported similar features for years.
For example, Infinispan uses Hibernate Search and Lucene for full-text queries, and
from Lucene 7.2, KNN/ANN searches, and vector indexing is supported too. This makes it easy to integrate with
tools like <a href="https://github.com/langchain-ai/langchain">LangChain</a> without
needing a separate vector database.
For more details, see <a href="https://quarkus.io/blog/granite-rag/">Clement Escoffier’s blog post on the Quarkus blog</a>.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="final-words">Final words</h2>
<div class="sectionbody">
<div class="paragraph">
<p>BilboStack was amazing! The conference, held in Bilbao, is all in Spanish and
was very well organized. Everything ran smoothly, and the Basque culture made
it extra special. There was great food, traditional dances, live music,
and plenty of chances to meet people and connect.</p>
</div>
<div class="paragraph">
<p>It’s not just a tech event — it’s an experience. The talks aren’t filmed because
what happens at BilboStack stays there. You really have to be there to enjoy it fully!
A huge thank you to the organizers for treating us, as speakers, so incredibly well.
The effort and care they put into making us feel welcome and valued are like nowhere
else. It was an honor to be part of such a well-organized and thoughtful event.
Thank you for everything!</p>
</div>
<div class="paragraph">
<p>See you soon Bilbao, and see you next year Bilbostack! Next time, in San Mamés!</p>
</div>
</div>
</div>]]></content><author><name>Katia Aresti</name></author><category term="infinispan" /><category term="bilbostack" /><category term="conference" /><category term="publicspeaking" /><summary type="html"><![CDATA[This weekend, I had the honor of speaking about In-Memory Databases at BilboStack in Bilbao, Spain. It was a special moment for me because Bilbao is my hometown, where I completed my Software Engineering studies 20 years ago. Public speaking is always a challenge, but presenting in my hometown came with the added pressure of not wanting to disappoint.]]></summary></entry><entry><title type="html">Infinispan joins Commonhaus!</title><link href="https://infinispan.org/blog/2025/01/13/commonhaus-foundation" rel="alternate" type="text/html" title="Infinispan joins Commonhaus!" /><published>2025-01-13T01:00:00+01:00</published><updated>2025-01-13T01:00:00+01:00</updated><id>https://infinispan.org/blog/2025/01/13/commonhaus-foundation</id><content type="html" xml:base="https://infinispan.org/blog/2025/01/13/commonhaus-foundation"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>We’re very excited to announce that Infinispan is <a href="https://www.commonhaus.org/activity/223.html">joining the Commonhaus Foundation</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="why-join-a-foundation">Why join a foundation?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We want to make it clear that Infinispan&#8217;s roadmap is independent of the company that has funded its development since day 1,
and we welcome contributors to participate in what we think is a bright future for our project. In the same vein, we&#8217;ve also recently
<a href="https://infinispan.org/blog/2024/11/29/github-issues">transitioned our issue tracking</a> to a neutral platform.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="why-commonhaus">Why Commonhaus?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Commonhaus just ticks all the right boxes for us: its lightweight governance is ideal. We get all the benefits of being
part of an awesome foundation, with all the benefits of running the project on our own terms.</p>
</div>
<div class="paragraph">
<p>Commonhaus is also the home to a number of "friend projects": Hibernate, Quarkus, Debezium, Jackson all play a key role
in our software and it&#8217;s great that we share a "common home".</p>
</div>
</div>
</div>]]></content><author><name>Tristan Tarrant</name></author><category term="foundation" /><summary type="html"><![CDATA[We’re very excited to announce that Infinispan is joining the Commonhaus Foundation.]]></summary></entry><entry><title type="html">Infinispan 15.1.0.Final</title><link href="https://infinispan.org/blog/2024/12/16/infinispan-15-1" rel="alternate" type="text/html" title="Infinispan 15.1.0.Final" /><published>2024-12-16T01:00:00+01:00</published><updated>2024-12-16T01:00:00+01:00</updated><id>https://infinispan.org/blog/2024/12/16/infinispan-15.1.0.Final</id><content type="html" xml:base="https://infinispan.org/blog/2024/12/16/infinispan-15-1"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p><strong><em>"It Was All A Dream"</em></strong></p>
</div>
<div class="paragraph">
<p>No, man. This time it&#8217;s for real!</p>
</div>
<div class="paragraph">
<p>Freshly brewed, for the fine connoisseurs of distributed caching, we are proud to present Infinispan 15.1, codenamed <a href="https://untappd.com/b/j-wakefield-brewing-it-was-all-a-dream/1942262">"It Was All A Dream"</a></p>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="/assets/images/blog/itwasalladream.png" alt="It Was All A Dream" width="197" height="640">
</div>
</div>
<div class="paragraph">
<p>Just like its beer namesake, this is a stout release, packed with flavor and features. Here&#8217;s a quick rundown of what&#8217;s new:</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="query">Query</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="spatial-queries">Spatial queries</h3>
<div class="paragraph">
<p>Infinispan now supports geographical queries. The feature allows users to perform queries based on geographical criteria. Spatial predicates can be used in combination with other predicates to implement additional filtering. Moreover, spatial fields can be used to project distances and to order the results according to distances from a given geographical point.
You can define on the same entity one or more spatial fields. Each of them denotes a pair of geographical coordinates: latitude and longitude.
Infinispan’s query language supports three spatial predicates: <code>within circle</code>, <code>within polygon</code> and <code>within box</code>.
If we want to sort our results according to the distance from a given query point, we can use the order by distance clause. We can also project the distances from the same query point.
Different units of measurement can be used to denote the radius of the circle predicate or to project the distances from a given query point.
Read our recent <a href="https://infinispan.org/blog/2024/11/25/spatial-queries">blog post</a> and the <a href="https://infinispan.org/docs/stable/titles/query/query.html#spatial_search_ickle-query-language">documentation</a> for more information.</p>
</div>
</div>
<div class="sect2">
<h3 id="nested-entities-joins">Nested entities joins</h3>
<div class="paragraph">
<p>This contribution has been made by <strong>András Gyuró</strong> and <strong>Gabor Ori</strong> from our amazing Infinispan open source community. A big thanks to them!
The feature allows to exploit the nested (not-flattened) relations between root entities and embedded entities in order to join their values to be queried.
As an example, let’s suppose we have an entity Team having a nested embedded field named players.
It is possible to execute a query which selects all the teams having at least one player having number <code>7</code> and at the same time having name <code>Ryan</code> or <code>Will</code>. A possible query in this case could be:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-sql hljs" data-lang="sql">select t.name from model.Team t
join t.players p
where (p.name ='Ryan' AND p.number=7) or (p.name='Will' AND p.number=7)</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="non-blocking-query-api">Non-blocking query API</h3>
<div class="paragraph">
<p>A new addition has been added to the Query API. Non-blocking/reactive alternative methods are available to query your data. Those methods are:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">Publisher&lt;T&gt; publish(int maxBatchSize);
CompletionStage&lt;QueryResult&lt;T&gt;&gt; executeAsync();
CompletionStage&lt;Integer&gt; executeStatementAsync();</code></pre>
</div>
</div>
<div class="paragraph">
<p>The new methods are experimental, meaning they may change in the future, and only available for the Hot Rod client (remote query).</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="new-java-hot-rod-client">New Java Hot Rod client</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A brand-new client implementation has been introduced replacing the current <code>hotrod-client</code> module. The public API is still the same so the code can be used without changes. The new client completely removes the prior connection pool, instead opting for a single pipelined channel to each server instead. The client configuration is thus ignored and deprecated.</p>
</div>
<div class="paragraph">
<p>Due to only having a single client connection to each server users should see a substantial decrease in file descriptors in use for both server and client applications.
Also, the majority of usage should see performance gains with the new client. The opposite may occur in cases of a single server with extremely high concurrency usage on the client.</p>
</div>
<div class="paragraph">
<p>The new client has dropped support for HotRod protocols older than 3.0, which is from Infinispan 10. This was mostly done as some features in some versions of 2 require dedicated sockets which is not acceptable in the new client.</p>
</div>
<div class="paragraph">
<p>The streaming cache commands (<code>InputStream</code> and <code>OutputStream</code>-based) had to be reworked to support a single socket, and thus we had to add a new Hot Rod protocol 4.1 to support these commands. If you are using the new client you can only use these streaming commands if your server also supports 4.1 or newer.</p>
</div>
<div class="paragraph">
<p>If you find the need to use a Hot Rod protocol version older than 3.0 the prior client can be used by importing the <code>hotrod-client-legacy</code> module instead.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="console">Console</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="cache-aliases">Cache aliases</h3>
<div class="imageblock">
<div class="content">
<a class="image" href="/assets/images/blog/2024-09-26-cache-aliases/updateAliasesModal.png"><img src="/assets/images/blog/2024-09-26-cache-aliases/updateAliasesModal.png" alt="Update aliases"></a>
</div>
</div>
</div>
<div class="sect2">
<h3 id="index-metamodel">Index metamodel</h3>
<div class="imageblock">
<div class="content">
<a class="image" href="/assets/images/blog/151-metamodel.png"><img src="/assets/images/blog/151-metamodel.png" alt="Index metamodel"></a>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tracing">Tracing</h3>
<div class="imageblock">
<div class="content">
<a class="image" href="/assets/images/blog/151-tracing.png"><img src="/assets/images/blog/151-tracing.png" alt="Tracing categories"></a>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="cache-aliases-2">Cache aliases</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Infinispan 15.0 had cache aliases that only worked within the context of the RESP connector. Now this functionality has been extended to all parts of Infinispan, including all other protocols as well as embedded.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="certificate-reloading">Certificate reloading</h2>
<div class="sectionbody">
<div class="paragraph">
<p>SSL/TLS certificates have an expiration date, after which they will no longer be valid.
The process of renewing a certificate is also known as <strong>rotation</strong>.
Infinispan now monitors the keystore files for changes and automatically reloads them without requiring a server or client restart.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
to ensure seamless operations during certificate rotation, use certificates signed by a Certificate Authority and
configure both server and client trust stores with the CA certificate. The use of self-signed certificates will cause
temporary handshake failures until all clients and servers have been updated.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="time-quantities-in-configuration">Time quantities in configuration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wherever a time quantity, such as a timeout or an interval, is specified within a declarative configuration, it is possible to describe it using time units:
* <code>ms</code>:  milliseconds
* <code>s</code>:  seconds
* <code>m</code>:  minutes
* <code>h</code>:  hours
* <code>d</code>:  days</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">{ "distributed-cache": { "remote-timeout":  "35s"} }</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="fixes">Fixes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Too many to count. We want to thank our amazing community members for <a href="https://github.com/infinispan/infinispan/issues">reporting issues</a> and helping out with providing detailed information that helps us debug and solve problems.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="deprecations-and-removals">Deprecations and removals</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The main change is the removal of the old server templates (like <code>org.infinispan.DIST_SYNC</code>) which were redundant and didn&#8217;t provide any advantage to defining configurations.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="jdk-requirements">JDK requirements</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Like for 15.0, you will need at least JDK 17 in order to use Infinispan 15.1. Infinispan also supports JDK 21 and the recently released JDK 23.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="documentation">Documentation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>As usual, many improvements, updates and fixes.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="release-notes">Release notes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can look at the <a href="https://github.com/infinispan/infinispan/releases/tag/15.1.0.Final">release notes</a> to see what was changed since our last development build.</p>
</div>
<div class="paragraph">
<p>Get them from our <a href="https://infinispan.org/download/">download page</a>.</p>
</div>
</div>
</div>]]></content><author><name>Tristan Tarrant</name></author><category term="release" /><category term="final" /><summary type="html"><![CDATA["It Was All A Dream"]]></summary></entry><entry><title type="html">Issue tracking migration from Jira to GitHub</title><link href="https://infinispan.org/blog/2024/11/29/github-issues" rel="alternate" type="text/html" title="Issue tracking migration from Jira to GitHub" /><published>2024-11-29T01:00:00+01:00</published><updated>2024-11-29T01:00:00+01:00</updated><id>https://infinispan.org/blog/2024/11/29/github-issues</id><content type="html" xml:base="https://infinispan.org/blog/2024/11/29/github-issues"><![CDATA[<div class="imageblock">
<div class="content">
<img src="/assets/images/blog/jira-to-github.png" alt="s/Jira/GitHub/">
</div>
</div>
<div class="paragraph">
<p>Infinispan issue tracking is now on <a href="https://github.com/infinispan/infinispan/issues">GitHub issues</a>.</p>
</div>
<div class="paragraph">
<p>We have decided to do this in order to make it easier for the community to report issues and for developers
to cross-reference them in pull requests, release notes and discussions. GitHub issues offer a streamlined interface
for <a href="https://github.com/infinispan/infinispan/issues/new?assignees=&amp;labels=kind%2Fbug&amp;projects=&amp;template=bug_report.yml">reporting bugs</a>
and <a href="https://github.com/infinispan/infinispan/issues/new?assignees=&amp;labels=kind%2Fenhancement&amp;projects=&amp;template=feature_request.yml">requesting features</a>.</p>
</div>
<div class="paragraph">
<p>We have archived the Infinispan and ProtoStream Jira projects and have decided not to bulk import all open issues into
GitHub, as the backlog had accumulated a lot of stuff. If you had a bug report or feature request on Jira you&#8217;d like to see
fixed/implemented please report it again on GitHub, referencing the original via a link.</p>
</div>
<div class="paragraph">
<p>We hope this improvement makes it easier for everybody.</p>
</div>]]></content><author><name>Tristan Tarrant</name></author><category term="issues" /><category term="jira" /><category term="github" /><summary type="html"><![CDATA[]]></summary></entry></feed>