Khi tôi sử dụng jedis như đoạn mã sau:
lớp công khai JedisTest mở rộng Đồng bộ hóa {
Chuỗi cuối cùng tĩnh riêng tư _SET_KEY_1 = "test1";
Chuỗi cuối cùng tĩnh riêng tư _SET_KEY_2 = "test2";
quy trình void công khai () ném SQLException {
Đặt appSet = getAllUserableAppkey();
cuối cùng ShardedJedis jedis = RedisHelper.getJedis();
đường ống ShardedJedisPipeline cuối cùng = jedis.pipeline();
for (Khóa chuỗi: appSet) {
Đặt result = jedis.smembers(_SET_KEY_1);
Đặt result2 = jedis.smembers(_SET_KEY_2);
Chuỗi rangName = String.format("%s::%s", "test", key);
vì (int i = 0; i < 10; i++) {
pipe.sadd(rangName, String.valueOf(i));
}
}
pipe.sync();
}
Bộ công khai getAllUserableAppkey() {
}
public static void main(String[] args) throws Exception {
DbHelper.init();
RedisHelper.init();
JedisTest jedisTest = JedisTest mới();
thử {
jedisTest.process();
} bắt (SQLException e) {
e.printStackTrace();
}
}
}
Nó ném ngoại lệ như thế này:
Ngoại lệ trong luồng "chính" java.lang.ClassCastException: java.lang.Long không thể chuyển sang java.util.List
tại redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:224)
tại redis.clients.jedis.Connection.getMultiBulkReply(Connection.java:217)
tại redis.clients.jedis.Jedis.smembers(Jedis.java:1055)
tại redis.clients.jedis.ShardedJedis.smembers(ShardedJedis.java:339)
tại com.snda.sync.impl.test.JedisTest.process(JedisTest.java:29)
tại com.snda.sync.impl.test.JedisTest.main(JedisTest.java:58)
tại sun.reflect.NativeMethodAccessorImpl.invoke0(Phương thức gốc)
tại sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
tại sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
tại java.lang.reflect.Method.invoke(Method.java:606)
tại com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Tôi có thể sửa đổi mã để sửa:
quy trình void công khai () ném SQLException {
Đặt appSet = getAllUserableAppkey();
cuối cùng ShardedJedis jedis = RedisHelper.getJedis();
for (Khóa chuỗi: appSet) {
đường ống ShardedJedisPipeline cuối cùng = jedis.pipeline();
Đặt result = jedis.smembers(_SET_KEY_1);
Đặt result2 = jedis.smembers(_SET_KEY_2);
//log.warn("result1 :{},result2:{}",result,result2);
Chuỗi rangName = String.format("%s::%s", "test", key);
vì (int i = 0; i < 10; i++) {
pipe.sadd(rangName, String.valueOf(i));
}
pipe.sync();
}
}
Nhưng tôi không biết tại sao lại có ngoại lệ,đường ống.sadd()
dù với jedis.smembers
xung đột? Cảm ơn bạn đã trả lời tôi!
Jedi mới nhất: 2.7.2
Bạn không nên sử dụng trực tiếp các phiên bản Jedis khi tạo đường ống.
Các ống sử dụng luồng của phiên bản Jedis (không khởi tạo luồng mới) và vì hoạt động bình thường sẽ đọc phản hồi ngay lập tức trong khi các ống đọc toàn bộ phản hồi sau đó, việc nhầm lẫn giữa hai cách sử dụng có thể khiến Jedi gặp rắc rối.
P -- loại dây chuyền lắp ráp/N -- thông thường
Yêu cầu --> P(1) P(2) N(3) N(4) P(5)
Phản hồi lại --> P(1) P(2) N(3) N(4) P(5)
Khớp yêu cầu-phản hồi --> N(1: phải là 3) N(2: phải là 4) P(3: phải là 1) P(4: phải là 2) P(5)
Bạn có thể thấy rằng các câu trả lời có thể dễ dàng bị sai sót.
Tôi là một lập trình viên xuất sắc, rất giỏi!