在Java中的多线程环境中使用静态redis连接

问题描述 投票:0回答:1

我想通过重用连接对象来提高 Redis 读/写的性能。因此,我在类中将其设置为static,并且我的 get() 和 set() 函数正在使用此静态连接。

在多线程环境中,这会导致数据损坏吗?因为连接是静态的,所以两个线程可以同时访问它,并且一个线程的数据可以发送到另一个线程吗?

我在 Java 中使用 Lettuce lib。

class RedisServiceLocator {
  static StatefulRedisConnection<String, String> redisConn = null;

  // constructor
  public RedisServiceLocator() {
    // create client and get connection if null
    if(RedisServiceLocator.redisConn == null) {
      RedisClient redisClient = RedisClient.create(redisURL);
      RedisServiceLocator.redisConn = redisClient.connect()
    }
  }

  // set
  public void set(String key, String val){
    RedisServiceLocator.redisConn.sync().set(key, val);
  }

  // get
  public String get(String key){
    redisConn.sync().get(key);
  }
}
java redis lettuce
1个回答
0
投票

最好的方法是使用消息系统。创建一个单例类,例如

public class RedisMessenger {
  private Queue<Message> messages;
  public long queueMessage(Message m); //return a response ticket number
  public void registerListener(RedisResponseListener l, RedisMessageType t);
}

然后使用线程发送查询并通知适当的侦听器。

您可以使用 RedisMessageType 参数来允许监听特定消息(通过消息票号)或按消息类别的响应。

© www.soinside.com 2019 - 2024. All rights reserved.