共计 3376 个字符,预计需要花费 9 分钟才能阅读完成。
更多 Spring 文章,欢迎点击 一灰灰 Blog-Spring 专题
前面一篇博文介绍 redis 五种数据结构中 String 的使用姿势,这一篇则将介绍另外一个用的比较多的 List,对于列表而言,用的最多的场景可以说是当做队列或者堆栈来使用了
<!– more –>
原文连接: 181109-SpringBoot 高级篇 Redis 之 List 数据结构使用姿势
I. 基本使用
1. 序列化指定
前面一篇的操作都是直接使用的 execute 配合回调方法来说明的,其实还有一种更加方便的方式,即 opsForValue, opsForList,本文则以这种方式演示 list 数据结构的操作
所以在正式开始之前,有必要指定一下 key 和 value 的序列化方式,当不现实指定时,采用默认的序列化(即 jdk 的对象序列化方式),直接导致的就是通过 redis-cli 获取存储数据时,会发现和你预期的不一样
首先实现序列化类
public class DefaultSerializer implements RedisSerializer<Object> {
private final Charset charset;
public DefaultSerializer() {
this(Charset.forName(“UTF8”));
}
public DefaultSerializer(Charset charset) {
Assert.notNull(charset, “Charset must not be null!”);
this.charset = charset;
}
@Override
public byte[] serialize(Object o) throws SerializationException {
return o == null ? null : String.valueOf(o).getBytes(charset);
}
@Override
public Object deserialize(byte[] bytes) throws SerializationException {
return bytes == null ? null : new String(bytes, charset);
}
}
其次定义 RedisTemplate 的序列化方式
@Configuration
public class AutoConfig {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> redis = new RedisTemplate<>();
redis.setConnectionFactory(redisConnectionFactory);
// 设置 redis 的 String/Value 的默认序列化方式
DefaultSerializer stringRedisSerializer = new DefaultSerializer();
redis.setKeySerializer(stringRedisSerializer);
redis.setValueSerializer(stringRedisSerializer);
redis.setHashKeySerializer(stringRedisSerializer);
redis.setHashValueSerializer(stringRedisSerializer);
redis.afterPropertiesSet();
return redis;
}
}
2. 添加元素
对于 list 而言,添加元素常见的有两种,从左边加和从右边加,以 lpush 为例
/**
* 在列表的最左边塞入一个 value
*
* @param key
* @param value
*/
public void lpush(String key, String value) {
redisTemplate.opsForList().leftPush(key, value);
}
3. 获取元素
既然是 list,就是有序的,因此完全是可以向 jdk 的 list 容器一样,获取指定索引的值
/**
* 获取指定索引位置的值, index 为 - 1 时,表示返回的是最后一个;当 index 大于实际的列表长度时,返回 null
*
* @param key
* @param index
* @return
*/
public String index(String key, int index) {
return redisTemplate.opsForList().index(key, index);
}
与 jdk 中的 List 获取某个索引 value 不同的是,这里的 index 可以为负数,- 1 表示最右边的一个,- 2 则表示最右边的第二个,依次
4. 范围查询
这个查询就类似 JDK 容器中的 List#subList 了,查询指定范围的列表
/**
* 获取范围值,闭区间,start 和 end 这两个下标的值都会返回; end 为 - 1 时,表示获取的是最后一个;
*
* 如果希望返回最后两个元素,可以传入 -2, -1
*
* @param key
* @param start
* @param end
* @return
*/
public List<String> range(String key, int start, int end) {
return redisTemplate.opsForList().range(key, start, end);
}
5. 列表长度
/**
* 返回列表的长度
*
* @param key
* @return
*/
public Long size(String key) {
return redisTemplate.opsForList().size(key);
}
6. 修改
更新 List 中某个下标的 value,也属于比较常见的 case 了,
/**
* 设置 list 中指定下标的值,采用干的是替换规则, 最左边的下标为 0;- 1 表示最右边的一个
*
* @param key
* @param index
* @param value
*/
public void set(String key, Integer index, String value) {
redisTemplate.opsForList().set(key, index, value);
}
7. 删除
在接口中没有看到删除指定小标的元素,倒是看到可以根据 value 进行删除,以及控制列表长度的方法
/**
* 删除列表中值为 value 的元素,总共删除 count 次;
*
* 如原来列表为【1,2,3,4,5,2,1,2,5】
* 传入参数 value=2, count=1 表示删除一个列表中 value 为 2 的元素
* 则执行后,列表为【1,3,4,5,2,1,2,5】
*
* @param key
* @param value
* @param count
*/
public void remove(String key, String value, int count) {
redisTemplate.opsForList().remove(key, count, value);
}
/**
* 删除 list 首尾,只保留 [start, end] 之间的值
*
* @param key
* @param start
* @param end
*/
public void trim(String key, Integer start, Integer end) {
redisTemplate.opsForList().trim(key, start, end);
}
个人感觉在实际的使用中 remove 这个方法用得不太多;但是 trim 方法则比较有用了,特别是在控制 list 的长度,避免出现非常大的列表时,很有效果,传入的 start/end 参数,采用的是闭区间的原则
II. 其他
0. 项目
工程:spring-boot-demo
1. 一灰灰 Blog
一灰灰 Blog 个人博客 https://blog.hhui.top
一灰灰 Blog-Spring 专题博客 http://spring.hhui.top
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激
微博地址: 小灰灰 Blog
QQ:一灰灰 /3302797840
3. 扫描关注
一灰灰 blog
知识星球