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里面加几个元素

js redis 删除整个大map redistemplate 删除list_list

加完后list的数据如下:

js redis 删除整个大map redistemplate 删除list_ssm_02


假如现在想要删除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;
}
}

启动服务器后,在地址栏输入项目测试路径即可

js redis 删除整个大map redistemplate 删除list_ssm_03

js redis 删除整个大map redistemplate 删除list_list_04

测试结果,删除成功