@Override
    public byte[] putIfAbsent(final Bytes key, final byte[] addedValue) {
        final byte[] oldValue = wrapped().get(key);

        if (oldValue != null) {
            // if the value is null we can skip the get and blind delete
            if (addedValue == null) {
                wrapped().put(key, null);
            } else {
                putInternal(key, addedValue, oldValue);
            }
        }

        // TODO: here we always return null so that deser would not fail.
        //       we only do this since we know the only caller (stream-stream join processor)
        //       would not need the actual value at all; the changelogging wrapper would not call this function
        return null;
    }
A wrapper key-value store that serializes the record values bytes as a list.
As a result put calls would be interpreted as a get-append-put to the underlying RocksDB store.
A put(k,null) will still delete the key, ie, the full list of all values of this key.
Range iterators would also flatten the value lists and return the values one-by-one.

This store is used for cases where we do not want to de-duplicate values of the same keys but want to retain all such values.
streams/src/main/java/org/apache/kafka/streams/state/internals/ListValueStore.java