博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot高级篇Redis之List数据结构使用姿势
阅读量:6528 次
发布时间:2019-06-24

本文共 3789 字,大约阅读时间需要 12 分钟。

更多Spring文章,欢迎点击

前面一篇博文介绍redis五种数据结构中String的使用姿势,这一篇则将介绍另外一个用的比较多的List,对于列表而言,用的最多的场景可以说是当做队列或者堆栈来使用了

原文连接:

I. 基本使用

1. 序列化指定

前面一篇的操作都是直接使用的execute配合回调方法来说明的,其实还有一种更加方便的方式,即 opsForValue, opsForList,本文则以这种方式演示list数据结构的操作

所以在正式开始之前,有必要指定一下key和value的序列化方式,当不现实指定时,采用默认的序列化(即jdk的对象序列化方式),直接导致的就是通过redis-cli获取存储数据时,会发现和你预期的不一样

首先实现序列化类

public class DefaultSerializer implements RedisSerializer {    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的序列化方式

@Configurationpublic class AutoConfig {    @Bean    public RedisTemplate
redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate
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
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. 项目

  • 工程:

1. 一灰灰Blog

  • 一灰灰Blog个人博客
  • 一灰灰Blog-Spring专题博客

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址:
  • QQ: 一灰灰/3302797840

3. 扫描关注

一灰灰blog

知识星球

转载地址:http://ewxbo.baihongyu.com/

你可能感兴趣的文章
秒杀系统设计方案
查看>>
3D印花芭蕾舞鞋为舞者科学地保护双脚
查看>>
冲浪科技获Ventech China数百万美元天使轮融资,发力自动驾驶行业
查看>>
通过ActionTrail监控AccessKey的使用
查看>>
从 JavaScript 到 TypeScript
查看>>
一个mysql复制中断的案例
查看>>
【最佳实践】OSS开源工具ossutil-大文件断点续传
查看>>
Linux常用的服务器构建
查看>>
深入了解 Weex
查看>>
Android第三方开源FloatingActionButton(com.getbase.floatingactionbutton)【1】
查看>>
【75位联合作者Nature重磅】AI药神:机器学习模型有望提前五年预测白血病!
查看>>
精通SpringBoot——第二篇:视图解析器,静态资源和区域配置
查看>>
JavaScript基础(六)面向对象
查看>>
总结几点Quartz的经验
查看>>
物联网、自动化的冲击下未来20年职场六大趋势
查看>>
《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.2 使用StAX解析器
查看>>
9月26日云栖精选夜读:阿里Java代码规约插件即将全球首发,邀您来发布仪式现场...
查看>>
北京市交管局联合高德地图发布北京中考出行提示
查看>>
如何防止应用程序泄密?
查看>>
一文带你看懂物联网开源操作系统
查看>>