StringRedisTemplate线程安全功能

时间:2017-11-12 14:13:28

标签: java spring multithreading spring-boot redis

我使用StringRedisTemplate将条目添加到redis,如下所示。

public void processSubmission(final String key, final Map<String, String> submissionDTO) {
    final String hashKey = String.valueOf(Hashing.MURMUR_HASH.hash(key));
    this.stringRedisTemplate.expire(key, 60, TimeUnit.MINUTES);
    final HashOperations<String, String, String> ops = this.stringRedisTemplate.opsForHash();
    Map<String, String> data = findByKey(key);
    String json;
    if (data != null) {
        data.putAll(submissionDTO);
        json = convertSubmission(data);
    } else {
        json = convertSubmission(submissionDTO);
    }
    ops.put(key, hashKey, json);
}

由于此操作可以在多个线程中执行,因此可能存在竞争条件导致数据丢失的情况。

文档说明了RedisTemplate&#34;配置完成后,这个类是线程安全的。&#34;

我是否必须明确添加线程安全功能?我没有在StringRedisTemplate或RedisTemplate源中看到任何同步关键字。

1 个答案:

答案 0 :(得分:0)

线程安全并不代表某处有synchronized个关键字。您可以编写没有synchronized的线程安全代码,即使使用synchronized,也可以轻松编写线程不安全的代码。

正如文档所述,

RedisTemplate是线程安全的。所以你只需要确保processSubmission是线程安全的。