Regions in production
The inventory of every region CNH runs, with its facade, kind, key, TTL, domain and Redis root. Review new region names against this list before adding one — names are a contract on a shared backbone.
indc-core — master data (static)
Declared by @CacheSnapshot on the entity in indc-commons-lib, preloaded
by the master-data starter, read through a facade in
com.juliusbaer.channels.indc.core.cache.masterdata. Root: indc-core:cache.
Refreshed by refresh-cron and startup: reload-if-stale (both Octopus
variables).
| region | facade | key | indexes | reads |
|---|---|---|---|---|
eventConfig | EventConfigurationCache | id | byEventName, byEventType | byId, byEventType (repo fallback), byEventName |
eventTemplate | EventTemplateCache | id | byTemplateName, byChannelSegmentLanguage, byCriteria (multi) | byId, byTemplateName, byChannelSegmentLanguage, byCriteria (sorted) |
eventGroup | EventGroupCache | id | byGroupName | byId, byGroupName |
alerts | AlertsCache | id | byAlertName | byId, byAlertName |
alertChannelMapping | AlertChannelMappingCache | id | byAlertChannelKey, byAlertsId (multi) | byId, byAlertChannelKey, byAlertsId (repo fallback) |
bookingCentreMapping | BookingCentreMappingCache | id | byEventBookingCentreKey, byConfigAndCentre | byId, byEventBookingCentreKey, byConfigAndCentre |
eventSegmentsMapping | EventSegmentsMappingCache | id | byEventSegmentKey, byEventConfigId (multi) | byId, byEventSegmentKey, byEventConfigId (repo fallback) |
RedirectRoute also carries @CacheSnapshot(region = "redirectRoute") but
has no facade yet.
indc-core — user alerts (transactional, shared)
| region | facade | key | value | TTL | root | gate |
|---|---|---|---|---|---|---|
userAlerts | UserAlertsCache | loginId | UserAlertsByLogin (list of UserAlertsSnapshot with config, conditions, devices) | 5 m (CNH.indc.dac.cache.regions.userAlerts.l2Ttl) | dac:userAlerts (UserAlertsCacheContract.NAMESPACE) | app.cache.user-alerts.read-enabled |
The region is shared: indc-core reads it for the evaluator; alert-be-app's
UserAlertsCacheEviction.evictUser(loginId) calls
DacRegionEvictions.evictShared(NAMESPACE, REGION, loginId) on every write path. The read
flag stays off until every writer is confirmed to evict.
indc-core — external lookups (transactional, cache-aside)
Facades in com.juliusbaer.channels.indc.core.cache.external. These replaced the Spring
@Cacheable configuration; each has a domain flag and a 1 000-entry local fallback. Keys
are composed with LookupKeys.of(…) (parts joined by |). Roots:
dac:<domain>.
| region | facade | value | TTL | domain | call site |
|---|---|---|---|---|---|
ldapUsers | LdapUserCache | LdapUserAttributes | 30 m | ldap-user | LdapBaseService.getUserDetails |
userPreferences | UserPreferenceCache | UserPreferencesSnapshot | 30 m | user-preference | DeliveryInstructionClient.findUserPreferencesClient |
pasRelationships | PasRelationshipCache | BusinessRelationshipResponseDTO | 30 m | pas-user | PasServiceImpl |
pasRelationshipManagers | PasRelationshipManagerCache | BusinessRelationshipsResponse | 30 m | pas-user | PasServiceImpl |
idmUnits | IdmUnitCache | Unit | 30 m | idm-user | IDMServiceImpl |
idmUsers | IdmUserCache | User | 30 m | idm-user | IDMServiceImpl.getUsersById |
paoAuthorizedPortfolios | PaoAuthorizedPortfolioCache | AccessDecisionResponse | 60 m | pao-authorized-portfolio | PaoServiceImpl |
craRelationshipManagers | CraRelationshipManagerCache | CraRelationshipManager | 60 m | cra-relationship-manager | CraServiceImpl.getRelationshipManagerId |
TTLs come from CNH.indc.cache.ttl.*, flags from CNH.indc.cache.enabled.*
— the same Octopus variables the old configuration used.
alert-be-app
| region | facade | key | value | TTL | notes |
|---|---|---|---|---|---|
userDevices | UserDevicesCache | userId | UserDevicesSnapshot (from IDM, via IdmUserDevicesLoader) | 5 m (CNH.alert.dac.cache.regions.userDevices.l2Ttl) | read-through; 10 000-entry local fallback; evict(userId) on device changes |
Shared CAST domain (all applications)
Provided by cache-domain-cast under dac:cast; TTL
dac.domains.cast.ttl-minutes (180) except preferences (15). Read through
CastDacGateway and @CastAuthContext; details on
The CAST domain.
| region | key | value |
|---|---|---|
castJbUids | idType|value | CastJbUids |
castUsers | jbUid | UserDto |
castUserProfiles | jbUid | UserProfileDto |
castUserEntitlements | jbUid (+ filter) | UserEntitlementsDto |
castUserBootstrap | jbUid | UserBootstrapDto |
castPreferences | jbUid (+ filter) | List<PreferenceDto> |
castUserBRs · castUserPortfolios · castUserAccounts | jbUid|number | shard snapshots (indexed byJbUid) |
castUserGrants | jbUid | CastUserGrants |
castUserShards | jbUid | CastShardManifest |
dac-initializer (demo)
| region | facade | kind | notes |
|---|---|---|---|
productCategories | master-data starter | static | @CacheSnapshot on the entity; startup: reload-if-stale, max-snapshot-age: 24h |
products | ProductCache | static | hand-built binding, ProductLoader.loadAll(), indexes byCode / byCategoryId |
transactions | TransactionCache | transactional | loader + writer, WRITE_BEHIND with 2 s flush, l2-ttl 30 s, negative-ttl 15 s |
Adding a region
- Pick a name that is unique on the backbone and stable — it is a Redis key prefix and a refresh-event target.
- Declare it with
@CacheSnapshotor aRegionBinding; put it in a domain if another application will read it. - Add a facade; give every read method a source fallback.
- Add the TTL / startup overrides to the chart as Octopus variables under
CNH.<app>.dac.cache.…. - Add a row to this page.