Java上Redis散列中的列表
我将Spring与Redis一起使用,并且我正在处理散列中的列表。在一个线程上一切都很好,当我必须用多个实例更新列表值时,问题就会出现 以下是我的代码,用于从散列中输入和获取值:Java上Redis散列中的列表,java,spring,hash,concurrency,redis,Java,Spring,Hash,Concurrency,Redis,我将Spring与Redis一起使用,并且我正在处理散列中的列表。在一个线程上一切都很好,当我必须用多个实例更新列表值时,问题就会出现 以下是我的代码,用于从散列中输入和获取值: public void put(String hashName, int key , List<myObj> myList) { redis.opsForHash().put(hashName, String.valueOf(key), myList); } public
public void put(String hashName, int key , List<myObj> myList) {
redis.opsForHash().put(hashName, String.valueOf(key), myList);
}
public List<myObj> get(String hashName, string key) {
Object map = redis.opsForHash().get(hashName,key);
if (map==null) {
log.info("no keys found");
return new ArrayList<myObj>();
}
List<myObj> myList= mapper.convertValue(map, new TypeReference<List<myObj>(){});
return myList;
}
public void put(字符串hashName、int键、列表myList){
redis.opsForHash().put(hashName,String.valueOf(key),myList);
}
公共列表获取(字符串哈希名称、字符串键){
objectmap=redis.opsForHash().get(hashName,key);
if(map==null){
log.info(“未找到密钥”);
返回新的ArrayList();
}
List myList=mapper.convertValue(map,new TypeReference您当前的实现不好,因为在put()中
更新整个列表。如果许多线程想向列表中添加单个元素,它们首先获取当前列表,然后添加一个元素,然后放入新列表。每个线程将覆盖前一个线程的结果,最后一个线程获胜。synchronized
的使用在这里并不重要
解决方案
不要替换整个列表。而是向列表中添加单个元素。删除方法put()
,然后添加一个新的元素,如下所示:
public synchronized void add(String hashName, int key, myObj element) {
List<myObj> myList;
Object map = redis.opsForHash().get(hashName,key);
if (map != null) {
myList= mapper.convertValue(map, new TypeReference<List<myObj>(){});
} else {
myList = new ArrayList<myObj>();
}
myList.add(element);
redis.opsForHash().put(hashName, String.valueOf(key), myList);
}
最后我用了信号灯,不管怎样,你的回答帮助我明白了该怎么做。很高兴知道这有帮助。
public synchronized void add(String hashName, int key, myObj element) {
List<myObj> myList;
Object map = redis.opsForHash().get(hashName,key);
if (map != null) {
myList= mapper.convertValue(map, new TypeReference<List<myObj>(){});
} else {
myList = new ArrayList<myObj>();
}
myList.add(element);
redis.opsForHash().put(hashName, String.valueOf(key), myList);
}
public List<myObj> get(String hashName, string key) {
Object map = redis.opsForHash().get(hashName,key);
if (map==null) {
log.info("no keys found");
return new ArrayList<myObj>();
}
List<myObj> myList= mapper.convertValue(map, new TypeReference<List<myObj>(){});
return Collections.unmodifiableList(myList);
}