【问题标题】:StringRedisTemplate thread safety capabilityStringRedisTemplate 线程安全能力
【发布时间】:2018-04-25 06:41:45
【问题描述】:

我使用 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 的文档说“一旦配置,这个类就是线程安全的。”

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

【问题讨论】:

    标签: java spring multithreading spring-boot redis


    【解决方案1】:

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

    RedisTemplate 是线程安全的,如文档所述。所以你只需要确保processSubmission 是线程安全的。

    【讨论】:

    • 我想知道RedisTemplate是如何实现线程安全的?你能解释一下吗?其次,我可以使 processSubmission 同步,但是我认为当许多线程调用它并导致性能问题时,这将是一个瓶颈
    • 我不会开始解释RedisTemplate 是如何线程安全的。我什至不知道他们是如何实现的,但由于他们已经将其记录为线程安全的,我假设他们没有撒谎。如果您对线程安全的了解只是synchronized 关键字,那么您需要做一些研究。如果您手头没有任何其他资源,可以从 docs.oracle.com/javase/tutorial/essential/concurrency 开始。
    猜你喜欢
    • 2020-01-27
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2023-03-25
    • 2019-01-14
    • 2010-12-14
    相关资源
    最近更新 更多