Jedis集成与踩坑经历

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jedis集成与踩坑经历相关的知识,希望对你有一定的参考价值。

参考技术A

Jedis是Redis的Java客户端实现,封装了对Redis的通信和命令处理等。

Jedis提供了资源池,可以很方便地实现对Redis的API调用。

之前是通过组内对Jedis封装的Spring Bean来获取和使用Jedis的,现在希望自行实现类似功能,设计目标如下:

具体思路就是针对设计目标而定的:

由于需求比较基础,还没有太多应用场景,实现也没考虑太复杂。整体逻辑不到50行,可以在 我的GitHub 上大致看一下。

后续使用可以直接使用Spring将Bean注入。

由于不按常规方法使用JedisPool可能背离了JedisPool设计的使用场景,因此在其中踩了不少坑。

其次,虽然平常常用组内的Jedis组件,但实际上对Jedis的API不了解,本次根据平常使用过程中的一些感受进行“黑盒临摹”,在爬坑过程中其实也学习了其他一些方面的经验,比如Guava Reflections等。

背景

最开始通过FactoryBean提供的连接并未使用动态代理,也就是说仅提供了一个Jedis,所有线程使用同一个Jedis连接。

现象

业务中较频繁地报异常,异常信息为 java.lang.ClassCastException: java.util.ArrayList cannot be cast to [B 等,基本是 ClassCastException ,异常抛出位置为调用Jedis的位置。

原因

最终在另一篇资料指引下来到jedis/issues,在 参考资料 中发现了最可信最合理的原因:Jedis并非线程安全,不应当并发操作。

正确使用

正如参考资料中回答提到的,每个线程(每次调用)都从JedisPool中获取一个连接,并在使用后归还。

也正是因为这一点跟最初的FactoryBean封装方式冲突了,后来才改用提供动态代理类的方式封装FactoryBean。

背景

我使用的Jedis版本为3.0.1,网上的不少资料指出在使用连接后归还可以使用JedisPool的 void returnResource(Jedis resource) 方法,但在3.0.1版本中这个方法是protected可见的,没有间接调用方法。

另外Jedis源码中找不到注释,这有点奇怪,我想当然地认为版本升级后可以自动归还资源了,于是仅在设置最大连接数之后就部署到业务中了。

现象

业务线程启动后每访问一定次数(调用Jedis达到一定次数)后就完全不响应请求了:

还是在 参考资料 的指引下查看Tomcat监听的端口,的确很多连接处于 CLOSE_WAIT 状态,表明客户端已断开连接(我自己测试的时候刷新页面太多,很多就中途断开了)。

原因

结合TCP四次挥手过程,应该是中间有资源释放不了导致没有进入 LAST_ACK 状态,推测是Jedis连接资源未归还而总连接数有限制,导致很多线程在等待获取Jedis资源。

正确使用

在Jedis连接使用完毕后,需要调用Jedis的 close() 方法将资源归还JedisPool, close 方法是用于替代 returnResource 方法的。

这个方法语义比较奇怪,真实作用是“ 归还或 关闭连接”,最开始其实就是考虑到资源复用的问题才没有考虑使用这个 close 方法的。

对比了一下组内的组件,思路差不多,还有以下的点能够扩展:

ClassCastException - B cannot be cast to java.lang.Long · Issue #186 · xetorthio/jedis

nginx 499状态码 - 微信-大数据从业者 - 博客园

深入分析Tomcat无响应问题及解决方法 - 月下狼的个人页面 - OSCHINA

jedis:连接池(JedisPool)使用示例 - 10km的专栏 - CSDN博客

Jedis使用|returnBrokenResource|returnResource废弃替代 - 诗人不写诗 - CSDN博客

本文搬自 我的博客 ,欢迎参观!

Jetson TX1配置与踩坑历程

最近在实验室弄到了一块英伟达tx1开发板,用来搞双目物品识别。就TX1的配置过程而言,可以说是把可以踩得坑都踩了一遍,本贴子用来记录我的经历,以及一些常见的坑,希望可以帮到大家。

一.刷机前准备工作。

由于tx1是英伟达公司2016年发布的,出厂系统是ubuntu16.04,原厂并没有带任何开发环境。换句话说,就是一切都要我们自己配置,网上的说法是刷机可以充分发挥硬件性能。根据官网https://developer.nvidia.com/embedded/jetpack的说法,我们需要安装一个叫做Jetpack的刷机工具,需要在ubuntu系统下运行,这时我们就需要配置一下虚拟机。这里我们用vmware来创建虚拟机,具体教程可以参考:看这里。注意,这里第一个坑会出现,卡了我好久,网上的很多教程都是让你使用jetpack3.0或者3.1的版本进行刷机,但由于年代过于久远,服务器已经停止运行,所以运行时会卡在如下页面。

博主试了好多个方法,都没有解决出现error的情况,这里心态一度崩溃。后来,才知道jetpack3.3以下的版本都用不了。

到官网下载好jetpack3.3的安装包后,我们在主机ubuntu的命令行输入如下代码:

cd ~/Jetpack
sudo chmod +x JetPack-L4T-3.3-linux-x64_b39.run
./JetPack-L4T-3.3-linux-x64_b39.run

 随后,我们将进入安装界面,一路Next。

接下来进入到Compons Manager页面,这里会有第二个坑

如果我们主机已经安装了上面栏目中的环境(如opencv,cuda)就会出现如下错误

这里我的做法是把Host-Ubuntu这一行选为no action,不为主机安装环境。把其他的选好后,一路next(PS:这里下载环境最好用一下魔法,你懂的,不然得等4567给小时)

出现这个页面时,我们选择第一个,有线连接模式,我的做法是把主机和tx1用网线介入到同一个路由器(校园网的话要先登陆好),然后又usb线把电脑和tx1连接起来。

当这个页面出现,我们的准备工作总算是完成了。

这里的意思是:

1.断开TX1电源,保证开发板处于断电关机状态
2.TX1通过网线与路由器相连,并与宿主机处于同一个局域网
路由器需要连接外网
3.用Micro USB线把开发板连到电脑上(类似于安卓手机连电脑)
4.接通AC电源,按下power键,开机
5.刚一开机,就长按Recovery键不松开,然后点按一下Reset键(Down and Up),过2s以后才松开Recovery键,此时开发板处于强制恢复模式

完成以上步骤后,终端输入lsusb 命令,可以看到一些列表,只要发现其中有Nvidia Corp就说明连接正确。

但这之前又会出现一个坑,这里必须把虚拟机的网络连接方式改为桥接模式,同时要勾选复制物理连接模式,不然则会出现卡在如下页面:determining the IP address of target 即找不到目标ip地址,当然可以手动更改,但十分麻烦,所以选好网络,让他自己寻找。

一切准备就绪后,我们就可以去喝杯奶茶,慢慢等待他安装完,因为没有个把小时是安装不完的

到这一步就算是大功告成了,接下来在jetpack3.3的安装界面会问你是否要删除下载的文件,这里为了方便以后配置环境,建议留着,不要删除。

二.开发准备工作

接下来,我们就可以给tx1连上键盘鼠标显示器了,但是,为了能够更好的使用tx1,我建议要给他换一下源,我们打开控制台,输入如下代码:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list

此举是为了备份默认的源,接下来我们把打开的文件里的源全部用#注释掉,换成下面的最新源,亲测有效
原文链接:https://blog.csdn.net/pkuyjxu/article/details/104207203

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe

wq保存后,在控制台输入:

sudo apt-get update
sudo apt-get upgrade

随即完成换源

为了能够多人一起操控我们的tx1,我们这里使用了xshell这个远程登录工具,

 

根据提示,我们在主机一栏输入我们的tx1的IP地址(可以通过ifconfig查看),选择默认的ssh协议和端口号22,根据提示,就能远程操控我们的设备啦,注意,两个设备一定要连同一个局域网。

三.demo测试

输入代码:

cd /home/tegra_multimedia_api/samples/backend
./backend 1 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --trt-deployfile ../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.prototxt --trt-modelfile ../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.caffemodel --trt-forcefp32 0 --trt-proc-interval 1 -fps 10

随即就会自动运行,这里也许要等个6,7分钟,期间你会慢慢发现一直不转的风扇会慢慢动起来。

效果:

最后来一张tx1的帅照

 

-----------------------------------------------------------------------------------------------------------------------分割线

第一次写博客,有很多不足之处,希望可以帮助到遇到同样问题的你们

以上是关于Jedis集成与踩坑经历的主要内容,如果未能解决你的问题,请参考以下文章

Jetson TX1配置与踩坑历程

Jetson TX1配置与踩坑历程

Jetson TX1配置与踩坑历程

Jetson TX1配置与踩坑历程

计划-甘特图 dhtmlx-gantt使用方式与踩坑记

计划-甘特图 dhtmlx-gantt使用方式与踩坑记