文档章节

Redis操作异常: java.lang.ClassCastException: java.lang.Long cannot be cast to [B

ouhoo
 ouhoo
发布于 2018/03/14 21:17
字数 538
阅读 5727
收藏 1

背景描述:
(1) 某项目,使用redis做存储,用redis的set性质来做实时统计,同时也存放其他统计数据;
(2) 用到的key不少,value集合量较多;
(3) 每天零点的时候,回清理当前redis中所有的数据;
(4) 异常都出现在 零点清理之后;

异常现场:
2018/03/13 00:00:20 OSS INFO  [com.xxx.RedisDAO] - error
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
        at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
        at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
        at redis.clients.jedis.Protocol.process(Protocol.java:151)
        at redis.clients.jedis.Protocol.read(Protocol.java:215)
        at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
        at redis.clients.jedis.Connection.getIntegerReply(Connection.java:265)
        at redis.clients.jedis.Jedis.sadd(Jedis.java:1109)
        at com.xxx.RedisDAO.setXXXKPI(RedisDAO.java:66)
        at com.xxx.xxxRunnable.run(xxxRunnable.java:69)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at java.net.SocketInputStream.read(SocketInputStream.java:127)
        at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196)
        ... 9 more
2018/03/13 00:00:20 OSS INFO  [com.xxx.RedisDAO] - error
java.lang.ClassCastException: java.lang.Long cannot be cast to [B
        at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239)
        at redis.clients.jedis.Jedis.set(Jedis.java:121)
        at com.xxx.RedisDAO.setXXXXXKPI(RedisDAO.java:100)
        at com.xxx.xxxRunnable.run(xxxRunnable.java:70)
        at java.lang.Thread.run(Thread.java:745)
2018/03/13 00:00:20 OSS INFO  [com.xxx.RedisDAO] - error
java.lang.ClassCastException: [B cannot be cast to java.lang.Long
        at redis.clients.jedis.Connection.getIntegerReply(Connection.java:265)
        at redis.clients.jedis.Jedis.sadd(Jedis.java:1109)
        at com.xxx.RedisDAO.setXXXXXKPI(RedisDAO.java:167)
        at com.xxx.xxxRunnable.run(xxxRunnable.java:71)
        at java.lang.Thread.run(Thread.java:745)


(1) 若当前redis中的数据很多,FLUSHDB 操作,需要花费一定的时间,阻塞了redis的响应,于是先出现了SocketTimeoutException;
(2) 连接出现异常后,从日志看,接着出现了ClassCastException,且后续一直报这个异常错误;
(3) 经搜索查询, 找到如下两个网页:
ClassCastException - [B cannot be cast to java.lang.Long #186:
https://github.com/xetorthio/jedis/issues/186

Jedis使用过程中踩过的那些坑:
http://bert82503.iteye.com/blog/2184225


综上, 查项目代码,发现几处问题:
a. redis连接操作出现异常后,应该关闭close, 归还资源,重新去一个redis连接使用。程序写的是:出了异常,记录日志,接着用这个redis连接,一直出异常。
b. 连接池设置过大,重启项目的时候,本次初始化的加上之前未释放的连接(直接kill的进程,关闭时未释放),瞬间链接过大;
c. 程序设计不合理, 由于数据每天是实时统计展示,可以每天的key前缀不一样,设置key的过期时间,这样就不用每天FLUSHDB。


 

© 著作权归作者所有

ouhoo
粉丝 2
博文 62
码字总数 20887
作品 0
昌平
程序员
私信 提问
jfinal查询结果返回类型问题

@JFinal 你好,想跟你请教个问题: maxItem.get("maxId", 0) 的返回类型,如果sql查询到的结果是Null(cache_item里无任何记录时),返回的是Integer,过sql查询的结果是某个数字,比如3,返回...

Neoman
2015/01/26
1K
2
JFinal查询表记录总数报错:java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

@JFinal 你好,想跟你请教个问题: JFinal查询表记录总数报错: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer 我是这样写的: public class User ex...

jelly_oy
2015/06/26
2.4K
5
mybatis 使用keyproperty="XXID" 返回插入数据主键ID值,装入一个map集合内如何取出?

RT,用mybatis插入数据的时候需要同时返回ID,返回类型:parameterType="map",装值的集合是 map.debug的时候map里面也有值,数据是:{id=XX,name=XX,mobile=XX}这样的格式,可是取值的时候用...

鱼塘
2016/05/31
3.9K
3
jedis 用连接池时超时返回值类型错误

这个是今天发现一个bug:在测试redis并发读写的时候(jedis作为客户端,并使用了连接池),总是报 java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long a...

浮躁的码农
2016/04/05
1K
0
Jfinal啥时候完美支持Oracle、sqlserver等库数据类型

@JFinal 你好,想跟你请教个问题:现在公司这边主要用oracle和sqlserver库,使用JFinal 2.0做项目遇到数据类型转换错误,排查发现,jfinal对支持以上库的数据型转换错误“java.math.BigDeci...

Role
2015/09/29
777
6

没有更多内容

加载失败,请刷新页面

加载更多

数据安全管理:RSA算法,签名验签流程详解

本文源码:GitHub·点这里 || GitEE·点这里 一、RSA算法简介 1、加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用。可以在不直接传递密钥的情况下,完成加解密操...

知了一笑
28分钟前
3
0
Podman 使用指南

> 原文链接:Podman 使用指南 Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podman 没有 daemon。以前使用 Docker...

米开朗基杨
今天
6
0
拯救 项目经理个人时间的5个技巧

优秀的项目经理都有一个共同点,那就是良好的时间管理能力。专业的项目经理会确保他们的时间投入富有成效,尽可能避免时间浪费。 时间管理叫做GTD,即Getting Things Done——“把事情做完”...

Airship
今天
7
0
LNMP环境介绍,Mariadb安装,服务管理,mariadb安装3

LNMP环境介绍 Nginx 处理的请求有两种,分为 静态与动态 图片,js,css,视频,音频,flash 等都是静态请求,这些数据都不是保存在数据库里面的 动态请求一般来说,需要的数据是在数据库里面...

doomcat
今天
3
0
前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部