RedisTemplate按照索引删除list中的元素的一种方法
- 准备数据
- 取出整个list
核心思想:取出redis中list的所有元素,用java的list相关方法删除元素,得到一个新的list,然后遍历这个新的list写入redis
在RedisTemplate的官方文档中,并没有看到直接按照list的索引来删除元素的方法,但是有个按照list的元素值删除元素的方法。如下
remove(K key, long count, Object value)
key:list的名称
value:要删除的元素的值
count:删除的元素个数。
当count=0,删除list中所有值为value的元素;
当count>0,从头开始,删除list中值为value的元素,删除的个数为count个
当count<0,从尾开始,删除list中值为value的元素,删除的个数为|count|(count的绝对值)个
虽然这个方法不能直接按照索引删除元素,但是可以通过它间接实现按照索引删除。
话不多说,开始演练
准备数据
随便往list里面加几个元素
加完后list的数据如下:
假如现在想要删除list中索引为2的元素,即元素值为555的第二个元素,上图的第三行元素。
取出整个list
RedisOperate.java
/*
* 根据索引获取列表 list的元素
* 取值范围[start,end],如[0,2]则取出list中索引为0,1,2的元素
*/
@Service("redisOperate")
public class RedisOperate{
public List<String> getList(String listName,long start,long end) {
return redisTemplate.opsForList().range(listName, start, end);
}
}
/*
* 修改list
* index:要修改的元素的索引
* value:将要修改的元素改成这个值
*/
public void changeList(String listName,long index,String value) {
redisTemplate.opsForList().set(listName, index, value);
}
/*
* 删除list元素
* value:要删除的元素的值
* count:删除的元素个数。
* 当count=0,删除list中所有值为value的元素;
* 当count>0,从头开始,删除list中值为value的元素,删除的个数为count个
* 当count<0,从尾开始,删除list中值为value的元素,删除的个数为|count|(count的绝对值)个
*/
public void deleteList(String listName,int count,String value) {
redisTemplate.opsForList().remove(listName,count,value);
}
TestController.java
@Controller
public class TestController {
@Autowired
private RedisOperate redisOperate;
@ResponseBody
@RequestMapping("/test")
public Object test() {
Map<String,Object> resMap = new HashMap<String,Object>();
//为了方便比较,用两个list存储取出的list作修改前后对比
List<String> before = redisOperate.getList("ceshi", 0, -1);
List<String> after = new ArrayList<String>();
after.addAll(before);
int delIndex = 2;//要删除的列表元素的索引
String delValue = after.get(delIndex);//要删除的元素的值
resMap.put("before", before);//删除之前的list
after.remove(delIndex);//移除这个元素
resMap.put("after", after);//删除之后的list
redisOperate.deleteList("ceshi", 1, delValue);//删除符合条件的一个元素,目的是让redis中的list长度-1
//把删除元素后的list重新写入redis
for(int i=0;i<after.size();i++) {
redisOperate.changeList("ceshi", i, after.get(i));
}
return resMap;
}
}
启动服务器后,在地址栏输入项目测试路径即可
测试结果,删除成功