spring-projects / spring-projects/spring-data-redis

Substitute/configure DEL for UNLINK on respository.save implementations

Open
#2,294 3 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

status: ideal-for-contribution type: enhancement
Dominant language
Java
Stars
1.9k
Forks
1.3k
PR merge metrics
No merged PRs in 30d

Description

On update intensive applications, where CrudRepository.save/saveAll is called many times on already existing keys, the current implementation uses DEL command before SET, and this puts some pressure on the DB since is blocking command.
E.g. https://github.com/spring-projects/spring-data-redis/blob/485bcad1108cdcb250157dbbc1bdad8c7fcac4af/src/main/asciidoc/reference/redis-repositories.adoc#replace-existing

Specially on larger structures, when you need to update a value many times, this behavior put a lot of pressure on the DB.
Each save on existing keys executes (setting TTL as well):
"DEL" "key"
"HMSET" "key" "_class" "something" "id" ...
"EXPIRE" "key" "259200"

Another place where DEL is used that could be substituted by UNLINK is when cleaning the secondary indexes on the ExpirationListener:
org.springframework.data.redis.core.RedisKeyValueAdapter.MappingExpirationListener#onMessage

I know from Redis 6 on we can configure to do DEL as UNLINK, however this would affect all applications. Would be useful to provide configuration for using DEL or UNLINK

The versions where this is observed:
<spring.boot.version>2.6.2</spring.boot.version>
<artifactId>redisson-spring-boot-starter</artifactId>
<redisson.version>3.16.7</redisson.version>

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Read the linked redis-repositories.adoc section and trace the CrudRepository.save/saveAll path that issues DEL before HMSET and EXPIRE. Also inspect RedisKeyValueAdapter.MappingExpirationListener#onMessage, where secondary indexes are cleaned up. Done means DEL versus UNLINK can be configured and the selected behavior applies to both repository saves and expiration cleanup.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, redis
Domain
databases
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
50/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.