jedis是什么,为什么是线程不安全的

news2025/1/16 8:12:14

常用的操作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突然插入一脚,让发送到服务端的指令不能被服务端识别,所以还可能出现连接断开等问题。

总结

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式实时操作系统的设计与开发(七)

内存管理机制 内存管理就是把物理的存储资源用一定的规则和手段管理起来,以供给操作系统和应用程序使用。 主要的操作:内存的分配和内存的回收。 内存的利用率、分配回收的效率和稳定性成为了评价内存管理模块的主要依据。 内存分配又包括静态和动态两种…

Pinely Round 1 (Div. 1 + Div. 2) A. Two Permutations

来写一道*800的题,思路很简单,就是这道题我们应该怎么去严谨地思考Problem - 1761A - Codeforces思路:结论题的分类讨论一定要不重不漏一开始很容易想到,前缀和后缀不能有重合那么有重合部分就判No没有重合的情况:隔1个…

Linux常用命令——xz命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) xz POSIX 平台开发具有高压缩率的工具。 补充说明 xz命令XZ Utils 是为 POSIX 平台开发具有高压缩率的工具。它使用 LZMA2 压缩算法,生成的压缩文件比 POSIX 平台传统使用的 gzip、bzip2 生成的压缩…

多线程进阶(二)Callable接口,JUC下常见类使用及线程安全集合类

目录 前言: Callable接口 代码实现 JUC下常见类使用 ReentrantLock类 代码实现 信号量 代码实现 CountDownLatch类 代码实现 线程安全的集合类 多线程环境下使用ArrayList 多线程环境下使用队列 多线程环境下使用哈希表 小结: 前言&#…

图解24种经典k线图

相信不少国内的老股民心中都藏着一份经典的K线图图解,当中也许有6种、12种或24种能揭示行情方向转变的“K线脸谱”,借由它们的对行情的预知作用,股民度过一次又一次的熊牛更替。其实只要善于变通,它们同样适用于贵金属投资&#x…

再说多线程(一)

世界是并行!做过复杂项目的朋友一定遇到过并发的问题,无论是大项目如订票系统,还是小项目中的文件管理都会有并行需求。所以不同于上学时接触的大部分代码,实际的业务往往是为多人提供服务,必然天然的带有并发的需求。…

Mybatis-plus 使用 typeHandler 将 String 拼接字符串转换为 List 列表

一、需求描述 首先说明需求,有三张表: 学生表、角色表、以及一张关联的中间表。 学生可以有多个角色,但是这多个角色我是作为多条记录存储在另外一张表中的,现在想将这多条记录查询出来,注入到Student对象中的一个L…

微服务之JVM调优

一、Xms Xmx Xss等定义及功能 1.Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢。 2.Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异…

易基因|14种全基因组DNA甲基化测序(WGBS)标准分析比对软件的比较| 生信专区

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。全基因组重亚硫酸盐测序(WGBS)是甲基化研究的重要技术。尽管已经开发了一系列工具来解决由亚硫酸盐处理引起的比对问题,但尚未对最新可用工具的reads比对…

HashMap,Hashtable,ConcurrentHashMap

目录 一、多线程使用HashMap的一些线程安全问题 ①造成数据新增丢失 ②扩容时候,造成链表成环 二、Hashtable和HashMap的区别 ①核心方法加锁 ②其他语法上面的略微差异 三、引入ConcurrentHashMap【重要】 ①ConcurrentHashMap相比于Hashtable的优势 Hashtab…

著名相声艺术家侯耀华,77岁寿宴现场曝光,郭德纲师哥前去祝贺

在中国的相声界,有一条不成文的规定,关于著名相声表演艺术家的判定,从来不是以相声水平高低为标准。只要你有足够长的寿命,只要你能把其他人都熬走熬败,就算你是一个相声小白,也能摇身一变成为艺术家。 不过…

Git介绍与使用

1.集中式版本控制 svn 中央服务器 所有的版本数据都存在服务器上,用户本地只有自己所同步的版本,如果不联网的话,用户就看不到 SVN是集中式版本控制系统,版本库是集中放在中央服务器的 而工作的时候,用的都是自己的电脑,所以首先…

跨境电商物流系统功能框架

随着国内互联网巨头们逐渐将更多注意力投向了跨境电商市场,电商巨头出海也在掀起新的发展高潮。下面是跨境电商物流系统功能框架,供大家参考1、OMS叫做订单管理系统(Order Management System),在不同公司,不…

云原生时代的运维体系进化

云原生已经成为数字经济技术的创新基石,并且正在深刻地改变企业上云和用云的方式。云原生的用云方式可以帮助企业最大化获得云价值,也给企业的计算基础设施、应用架构、组织文化和研发流程带来新一轮变革。而业务和技术挑战也催生了新一代云原生运维技术…

设计模式(一)----设计模式概述及UML图解析

1、设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大(Christopher Alexander&#xf…

Golang开发 02

文章目录一、Golang开发工具二、visual studio code安装(VS code)1、安装window2、安装mac、linux一、Golang开发工具 # 1、Visual studio code (常用) # 2、Sublime Text(免费) # 3、Vim # 4、Emacs # 5、Eclipes IDE工具,开源免费&#xf…

数据分析-深度学习PytorchDay1

深度学习框架pytorch学习(一)准备环境准备环境一、深度学习框架简介二、Tensorflow与Pytorch的比较三、安装开发环境一、深度学习框架简介1、Google阵营最早的是由加拿大团队开发的theano一个机器学习库,现在已经停止更新。接着Google开发了Tensorflow,并…

【机器学习知识点】3. 目标检测任务中如何在图片上的目标位置绘制边界框

目录前言导入图片定义边界框绘制函数在图片中绘制边界框总结前言 在图像分类任务中,很多时候我们不仅要知道图像中目标的类别,而且还想知道它们在图像中的具体位置。在计算机视觉里,这类任务被称为目标检测(object detection&…

uniapp开发技术

目录 1、js 判断iPhone|iPad|iPod|iOS|Android客户端 2、js实现防抖 3、 js实现节流 4、 页面在弹窗时禁止底部页面滚动(h5端) touchmove.stop.prevent 5、scrollIntoView 1、js 判断iPhone|iPad|iPod|iOS|Android客户端 // fullScreen代表整个页面…

【C++】STL---list的模拟实现

目录前言一、list和vector的区别二、节点的定义三、list类定义四、push_back函数五、push_front函数六、迭代器七、begin和end函数八、迭代器区间初始化九、迭代器的操作符重载操作符重载操作符- -重载操作符!重载操作符重载操作符*重载十、insert函数十一、erase函…