1.Redis List操作命令
1.1 添加元素
-
从左侧添加元素:
LPUSH key element [element ...]
> LPUSH fruits apple orange banana (integer) 3
从右侧添加元素:
RPUSH key element [element ...]
> RPUSH fruits grape (integer) 4
查看列表长度:
LLEN key
> LLEN fruits (integer) 4
1.2 查看元素
-
获取指定下标的元素:
LINDEX key index
> LINDEX fruits 1 "orange"
获取指定范围内的元素:
LRANGE key start stop
> LRANGE fruits 0 2 1) "banana" 2) "orange" 3) "apple"
截取list:
LTRIM key start stop
> LTRIM fruits 1 2 OK > LRANGE fruits 0 -1 1) "orange" 2) "banana"
1.3 删除元素:
- 删除指定元素:`LREM key count element`
```redis
> LPUSH numbers 1 2 3 2 4 5 2
(integer) 7
> LREM numbers 2 2
(integer) 2
> LRANGE numbers 0 -1
1) "5"
2) "4"
3) "3"
4) "1"
```
- 从左侧删除元素:`LPOP key`
```redis
> LPOP fruits
"orange"
> LRANGE fruits 0 -1
1) "banana"
2) "apple"
```
- 从右侧删除元素:`RPOP key`
```redis
> RPOP fruits
"apple"
> LRANGE fruits 0 -1
1) "banana"
```
设置list中指定下标的元素值:
LSET key index element
> LSET fruits 1 lemon OK > LRANGE fruits 0 -1 1) "banana" 2) "lemon"
1.4 阻塞队列:
- 从左侧取出元素(如果列表为空则阻塞):`BLPOP key timeout`
```redis
> BLPOP fruits 10
1) "fruits"
2) "banana"
```
- 从右侧取出元素(如果列表为空则阻塞):`BRPOP key timeout`
```redis
> BRPOP fruits 10
1) "fruits"
2) "lemon"
```
- 阻塞地从多个列表中取出元素(如果所有列表都为空则阻塞):`BRPOPLPUSH source destination timeout`
```redis
> BRPOPLPUSH fruits fruits_copy 10
"banana"
> LRANGE fruits_copy 0 -1
1) "banana"
```
2.Jedis和RedisTemplate代码示例
2.1 Jedis实现:
import redis.clients.jedis.Jedis;
public class JedisExample {
public static void main(String[] args) {
// 连接Redis
Jedis jedis = new Jedis("localhost", 6379);
// 添加元素
jedis.lpush("fruits", "apple", "orange", "banana");
jedis.rpush("fruits", "grape");
// 查看列表长度
System.out.println(jedis.llen("fruits"));
// 查看元素
System.out.println(jedis.lindex("fruits", 1));
System.out.println(jedis.lrange("fruits", 0, 2));
// 截取list
jedis.ltrim("fruits", 1, 2);
System.out.println(jedis.lrange("fruits", 0, -1));
// 删除元素
jedis.lrem("fruits", 1, "orange");
jedis.lpop("fruits");
jedis.rpop("fruits");
// 设置list中指定下标的元素值
jedis.lset("fruits", 1, "lemon");
System.out.println(jedis.lrange("fruits", 0, -1));
// 阻塞队列
// 从左侧阻塞地取出元素
System.out.println(jedis.blpop(10, "fruits"));
// 从右侧阻塞地取出元素
System.out.println(jedis.brpop(10, "fruits"));
// 阻塞地从source列表取出元素并插入到destination列表中
System.out.println(jedis.brpoplpush("fruits", "fruits_copy", 10));
// 关闭连接
jedis.close();
}
}
2.1 RedisTemplate实现:
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.serializer.StringRedisSerializer;
public class RedisTemplateExample {
public static void main(String[] args) {
// 创建RedisTemplate对象
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(new JedisConnectionFactory());
// 设置key和value的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
// 初始化RedisTemplate
redisTemplate.afterPropertiesSet();
// 获取List类型操作对象
ListOperations<String, String> listOps = redisTemplate.opsForList();
// 添加元素
listOps.leftPush("fruits", "apple");
listOps.leftPush("fruits", "orange");
listOps.leftPush("fruits", "banana");
listOps.rightPush("fruits", "grape");
// 查看列表长度
System.out.println(listOps.size("fruits"));
// 查看元素
System.out.println(listOps.index("fruits", 1));
System.out.println(listOps.range("fruits", 0, 2));
// 截取list
listOps.trim("fruits", 1, 2);
System.out.println(listOps.range("fruits", 0, -1));
// 删除元素
listOps.remove("fruits", 1, "orange");
listOps.leftPop("fruits");
listOps.rightPop("fruits");
// 设置list中指定下标的元素值
listOps.set("fruits", 1, "lemon");
System.out.println(listOps.range("fruits", 0, -1));
// 阻塞队列
// 从左侧阻塞地取出元素
System.out.println(listOps.leftPop("fruits", 10, TimeUnit.SECONDS));
// 从右侧阻塞地取出元素
System.out.println(listOps.rightPop("fruits", 10, TimeUnit.SECONDS));
// 阻塞地从source列表取出元素并插入到destination列表中
System.out.println(listOps.rightPopAndLeftPush("fruits", "fruits_copy", 10, TimeUnit.SECONDS));
// 关闭RedisTemplate连接
redisTemplate.getConnectionFactory().getConnection().close();
}
}
3.总结
使用Jedis和RedisTemplate分别实现Redis列表操作的示例。Redis列表是一个有序的字符串列表,可以在列表的头部或尾部添加、删除元素,还可以截取、查看、修改元素,以及实现阻塞队列等功能。还可以使用其他编程语言的Redis客户端库实现Redis列表操作,如Python的redis模块、Java的Lettuce等。