解决redisTemplate中leftPushAll隐性bug的问题

前言

请看下面代码:

String key = String.format("test_key:%s", System.currentTimeMillis()/1000);
    String key2=key+"_2";
    String key3=key+"_3";
    List<String> t1=new ArrayList<>();
    t1.add("2");
    t1.add("3");
    t1.add("4");
    t1.add("5");
    t1.add("1");
    redisTemplate.opsForList().leftPushAll(key, t1);
    redisTemplate.opsForList().leftPushAll(key3, t1.toArray());
    redisTemplate.opsForList().leftPushAll(key2,new String[]{"dfdg","dgdaasdf","gdadfdf"});

其中,那么,请猜测一下各个key里面的内容,

下面开奖了:

结论

leftPushAll可以传 Object… 数组,也可以传 Collection进去。

然后实际上,我这边传 ArrayList这些数组是不行的,必须转换为 [] 这种数组—就是说,api里面的leftPushAll(Collection list)

用不了,具体原因还在查。。。

不过网上资料太少了。。

补充:java 用redisTemplate 的 Operations存取list集合

一 、存取为list类型

@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
  @Autowired
  private RedisTemplate redisTemplate;

  @ApiOperation("redis-savelist")
  @PostMapping("/redis/save/list")
  public void redisSaveList() {
    List<Person> list = getPersonList();
    //清空
    while (redisTemplate.opsForList().size("oowwoo") > 0){
      redisTemplate.opsForList().leftPop("oowwoo");
    }
    //存储
    redisTemplate.opsForList().rightPushAll("oowwoo", list);

    //取出
    List<Person> oowwoo = redisTemplate.opsForList().range("oowwoo", 0, -1);
    log.info(">>>>>>>>>>>>>>>list = {}", oowwoo.toString());
    Iterator<Person> it = oowwoo.iterator();
    while(it.hasNext()){
      Person p = it.next();
      log.info("person = {}", p.toString());
    }
  }
  private List<Person> getPersonList() {
    Person p1 = new Person();
    p1.setId(1L);
    p1.setName("张一");
    p1.setAge(11);

    Person p2 = new Person();
    p2.setId(2L);
    p2.setName("张二");
    p2.setAge(22);

    Person p3 = new Person();
    p3.setId(3L);
    p3.setName("张三");
    p3.setAge(33);

    List<Person> list = new ArrayList<>();
    list.add(p1);
    list.add(p2);
    list.add(p3);
    return list;
  }
}

二 、将list转为json对象存取

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
 @Autowired
  private StringRedisTemplate stringRedisTemplate;

//存
List<Long> businessIdList = eeFreecarriageShopService.selectBusinessIdInPromotion();
 stringRedisTemplate.opsForValue().set(RedisConstants.FREECARRIAGE_BUSINESSIDLIST, JSON.toJSON(businessIdList).toString());

//取
String businessJsonArray = stringRedisTemplate.opsForValue().get(RedisConstants.FREECARRIAGE_BUSINESSIDLIST);
List<Long> businessIdList = JSONObject.parseArray(businessJsonArray, Long.class);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 解决使用redisTemplate高并发下连接池满的问题

    用JMeter进行高并发测试的时候,发现报错: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool 连不上redis,是因为连接池不够用了 我用的是red

  • spring boot整合redis实现RedisTemplate三分钟快速入门

    引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> RedisTemplate五种数据结构的操作 redisTemplate.opsForValue(); //操作字符串 redisTemplate.opsForHash();

  • 解决RedisTemplate调用increment报错问题

    使用spring redis的increment方法时,报错: nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range 一.INCRBY key increment INCRBY key increment介绍如下: 将 key 所储存的值加上增量 increment .如果 key 不存在,那么 key 的值会先被初始化为

  • 在RedisTemplate中使用scan代替keys指令操作

    keys * 这个命令千万别在生产环境乱用.特别是数据庞大的情况下.因为Keys会引发Redis锁,并且增加Redis的CPU占用.很多公司的运维都是禁止了这个命令的 当需要扫描key,匹配出自己需要的key时,可以使用 scan 命令 scan操作的Helper实现 import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.

  • JAVA中 redisTemplate 和 jedis的配合使用操作

    首先项目A,也就是SpringBOOT项目中使用redisTemplate 来做REDIS的缓存时,你会发现存到REDIS里边的KEY和VALUE,redisTemplat使用jdkSerializeable存储二进制字节编码 项目B中使用jedis时,存储起来的是字符串,导致项目A要调用项目缓存的键值对时,获取不到 解决方案: 修改项目A的redisTemplate的序列方式 @Configuration @EnableCaching public class RedisConfig exte

  • Java使用RedisTemplate模糊删除key操作

    Redis模糊匹配批量删除操作,使用RedisTemplate操作: public void deleteByPrex(String prex) { Set<String> keys = redisTemplate.keys(prex); if (CollectionUtils.isNotEmpty(keys)) { redisTemplate.delete(keys); } } prex为迷糊匹配的key,如cache:user:* 这里需要判断keys是否存在,如果一个都匹配不到会报错:

  • 解决redisTemplate中leftPushAll隐性bug的问题

    前言 请看下面代码: String key = String.format("test_key:%s", System.currentTimeMillis()/1000); String key2=key+"_2"; String key3=key+"_3"; List<String> t1=new ArrayList<>(); t1.add("2"); t1.add("3"); t

  • JS解决IOS中拍照图片预览旋转90度BUG的问题

    上篇文章[Js利用Canvas实现图片压缩功能]中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度.对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编程了.通过度娘找到了相关资料,解决方法记录在此.这个问题的具体因素其实我还是不清楚是为何导致的,只有IOS和部分三星手机会出现此bug. 绝大部分的安卓机并无此问题. 解决此问题需要引入一个第三方 JS 库: exif.js 下载地址:https://github.com/exif-js/exif-

  • Android 开发 使用WebUploader解决安卓微信浏览器上传图片中遇到的bug

    先给大家分析下微信浏览器上传图片bug的原因 微信在新版本中采用的是自己的X5内核浏览器,而在较老的版本中还有可能是安卓的原生浏览器.具体的环境我也不太了解,但是经过实际多台安卓机型的测试,我采取的方案可以基本确保在安卓机中微信浏览器的成功上传.苹果机型没问题,因为微信的ios客户端使用的是Safari的内核,没有各种坑,且效果最好. 这里给出一个 WebUploader 官方关于移动端适配的 issues 链接.里面提供的方法确实有效,但就是解决的方案并没有很清楚的展示出来,从该issues中

  • Vue+ElementUI 中级联选择器Bug问题的解决

    最近在项目中需要用到级联这么个控件,所以便去element上找了个,发现了个问题,在这里跟大家分享下,介于公司项目的隐私性,所以一些文字便给大家打上马赛克了,敬请谅解~ 不多说废话,直接上问题: ElemenUI的级联是通过子级字段递归进行显示的,但是假如后端老铁也用了递归写的数据,而递归到最后一个数据集便出现了问题,会出现光有字段,但是却没有数据这么个情况在这里插入图片描述 这时候就出现了问题: 最后一级会多出来一个级联,这种体验便造成了很不好的感觉. 解决办法: 将获取这些级联的数据作为参数

  • SpringBoot项目中遇到的BUG问题及解决方法

    1.启动项目的时候报错 1.Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled. 解决方法: 在yml配置文件中加入debug: true,因为默认的话是false 2.在集成mybatis时mapper包中的类没被扫描 org.springframework.beans.factory.NoSuchBean

  • 解决spring中redistemplate不能用通配符keys查出相应Key的问题

    有个业务中需要删除某个前缀的所有Redis缓存,于是用RedisTemplate的keys方法先查出所有合适的key,再遍历删除. 但是在keys(patten+"*")时每次取出的都为空. 解决问题: spring中redis配置中,引入StringRedisTemplate而不是RedisTemplate,StringRedisTemplate本身继承自RedisTemplate, 即 <bean id="redisTemplate" class=&quo

  • 解决mybatis 中collection嵌套collection引发的bug

    我就废话不多说了,大家还是直接看代码吧~ <resultMap id="ParentMap" type="org.example.mybatis.Parent"> <id column="Id" jdbcType="VARCHAR" property="id" /> <result column="Name" jdbcType="VARCHAR&q

  • 解决Python中回文数和质数的问题

    一.前言 今天学习视频时课后作业是找出1000以内既是素数又是回文数的数,写代码这个很容易,结果一运行遇到了bug,输出结果跟预期不一样,调试了快30min,再接着一通搜索和回看视频才发现问题所在.所以特地写下来,方便以后查看.问题的关键是判断素数过程中for-else的用法上(具体看后面代码) 二.实现判断素数的功能 质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数).via--Wikiped

  • 解决Keras 中加入lambda层无法正常载入模型问题

    刚刚解决了这个问题,现在记录下来 问题描述 当使用lambda层加入自定义的函数后,训练没有bug,载入保存模型则显示Nonetype has no attribute 'get' 问题解决方法: 这个问题是由于缺少config信息导致的.lambda层在载入的时候需要一个函数,当使用自定义函数时,模型无法找到这个函数,也就构建不了. m = load_model(path,custom_objects={"reduce_mean":self.reduce_mean,"sli

  • 解决vue2中使用elementUi打包报错的问题

    bug1.找不到element-ui/lib/theme-default/index.css 解决:修改路径为 element-ui/lib/theme-chalk/index.css 原因:elementUi升级时遗留bug bug2: ERROR in static/js/app.77ab8a3664d32f2b9c76.js from UglifyJs Unexpected token: operator (>) [./~/element-ui/src/mixins/emitter.js:

随机推荐