jedis是什么,为什么是线程不安全的
创始人
2024-05-10 16:42:29
0

常用的操作redis的客户端工具

jedis

Jedis 是 Redis 官方推荐的 Java 连接开发工具,jedis非线程安全。

但是可以通过JedisPool连接池去管理实例,在多线程情况下让每个线程有自己独立的jedis实例,可变为线程安全。

Lettuce

Lettuce 是基于 Netty框架(NIO)的事件驱动的通信,支持同步和异步调用的,可扩展的 redis client,多个线程可以共享一个 RedisConnection,线程安全。

SpringBoot2.0之后默认都是使用的Lettuce这个客户端连接Redis服务器。Lettuce 是一种可扩展的、线程安全的 Redis 高级客户端。

Redisson

Redisson 是一个在 Redis 的功能基础上实现的 Java 驻内存数据网格客户端。实现了分布式和可扩展的 Java 数据结构,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过 Redis 支持延迟队列。

小结

Jedis 和 Lettuce 两者相比,Jedis 的性能比较差,其他方面并没有太明显的区别,所以如果你不需要使用 Redis 的高级功能的话,优先推荐使用 Lettuce。

相比于 Jedis、Lettuce 等基于 redis 命令封装的客户端,Redisson 提供的功能更加高端和抽象,逼格简单使用

jedis和lettuce简单使用:https://juejin.cn/post/6844903681087930375,文章中的使用用lettuce时,需添加commons-pool2依赖。

jedis线程不安全

以set方法举例

Jedis jedis = new Jedis();
jedis.set("1","1");

1、

一步步点进去Jedis.set->Client.set->BinaryClient.set->Connection.sendCommand

可以看出来 每次执行set方法都要进行connect方法,点进connect方法

可以看出来一个实例共用一个socket、 outputStream、inputStream。问题也就出现了。来看下jedisSocketFactory.createSocket的方法

问题解说:这样就清晰明了了,共用socket,在多线程执行下,如果线程2走到了获取outputStream或者inputStream的方法,而线程1走到了刚刚new完socket,是不是就出现问题了。

 2、

眼尖的人可能会看到

 如果我提前连接比如以下,是不是不会出问题了,并不是

        Jedis jedis = new Jedis();jedis.connect();jedis.set("1","1");

 别忘了还共享了 outputStream、inputStream。我们直接来到发送命令的最后Protocol的sendCommand方法

 问题解说:因为共享了os,使得线程1正在正常发送指令,线程2突然插入一脚,让发送到服务端的指令不能被服务端识别,所以还可能出现连接断开等问题。

总结

不总结了,自己看吧。着急下班。

 

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...