== Caching

Dshackle can be configured to cache blockchain data. It can be a _hot_ in-memory cache, and optional _cold_ Redis-based
cache.

Dshackle has enough information to effectively cache data and evict outdated values. If some data has been removed from
the blockchain, for example when block was replaced with another block at the same height, then the old values are
immediately evicted from the caches.

=== In-memory cache

Dshackle keeps latest blocks in memory (by default 64 blocks)

=== Disable all caching and cache related optimisations
Sometimes you may need to disable all caching and optimisations and just send all requests to remote upstreams as is.

.Disable cache config (dshackle.yaml)
[source, yaml]
----
cache:
  requests-cache-enabled: false
----

=== Redis cache

Dshackle can optionally cache blocks and transactions in Redis cache. The values are cached up to 1 hour, but
fresh blocks and transactions are cached for shorter period.

It makes sense to reuse the same Redis cache between multiple instances of the Dshackle.

.Basic config (dshackle.yaml)
[source, yaml]
----
cache:
  redis:
    enabled: true
----

.Full config (dshackle.yaml)
[source, yaml]
----
cache:
  redis:
    enabled: true
    host: 127.0.0.1
    port: 6379
    db: 0
    password: passw0rd!
----


.Options
|===
| Name | Default Value | Description

| enabled
| false
| Set to `true` if Dshackle should use Redis for caching

| host
| 127.0.0.1
| Redis host

| port
| 6379
| Redis port

| db
| 0
| Redis database

| password
| --
| Password if Redis requires authentication. The value can be read from Environment variable, to do that
  specify it as `${REDIS_PASSWORD}`, where REDIS_PASSWORD is the name of the variable

|===