天道酬勤,学无止境

Why A single Jedis instance is not threadsafe?

https://github.com/xetorthio/jedis/wiki/Getting-started

using Jedis in a multithreaded environment

You shouldn't use the same instance from different threads because you'll have strange errors. And sometimes creating lots of Jedis instances is not good enough because it means lots of sockets and connections, which leads to strange errors as well.

A single Jedis instance is not threadsafe

! To avoid these problems, you should use JedisPool, which is a threadsafe pool of network connections. You can use the pool to reliably create several Jedis instances, given you return the Jedis instance to the pool when done. This way you can overcome those strange errors and achieve great performance.

=================================================

I want to know why? Can anyone help me please

评论

A single Jedis instance is not threadsafe because it was implemented this way. That's the decision that the author of the library made.

You can check in the source code of BinaryJedis which is a super type of Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

For example these lines:

public Transaction multi() {
    client.multi();
    client.getOne(); // expected OK
    transaction = new Transaction(client);
    return transaction;
}

As you can see the transaction field is shared for all threads using Jedis instance and initialized in this method. Later this transaction can be used in other methods. Imagine two threads perform transactional operations at the same time. The result may be that a transaction created by one thread is unintentionally accessed by another thread. The transaction field in this case is shared state access to which is not synchronized. This makes Jedis non-threadsafe.

The reason why the author decided to make Jedis non-threadsafe and JedisPool threadsafe might be to provide flexibility for clients so that if you have a single-threaded environment you can use Jedis and get better performance or if you have a multithreaded environment you can use JedisPool and get thread safety.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • App Engine计划程序何时使用新线程而不是新实例?(When does the App Engine scheduler use a new thread vs. a new instance?)
    问题 如果我在app.yaml文件中将threadsafe: true设置为threadsafe: true ,则什么规则管理何时创建新实例来满足请求,何时在现有实例上创建新线程? 如果我有一个在每个请求上执行计算量大的应用程序,那么多线程能给我带来什么好处吗? 换句话说,实例是多核实例还是单核? 或者,仅当现有线程正在等待IO时才启动新线程吗? 回答1 当前使用以下规则集确定给定实例是否可以接受新请求: if processing more than N concurrent requests (today N=10): false elif exceeding the soft memory limit: false elif exceeding the instance class CPU limit: false elif warming up: false else true 以下总的CPU /核心限制目前适用于每个实例类: CLASS 1: 600MHz 1 core CLASS 2: 1.2GHz 1 core CLASS 4: 2.4GHz 1 core CLASS 8: 4.8GHz 2 core 因此,只有一个B8实例可以并行处理多达2个完全由CPU绑定的请求。 为实例类<8设置threadsafe: true (Python)或<threadsafe>true
  • Apache HttpClient API中的CloseableHttpClient和HttpClient有什么区别?(What is the difference between CloseableHttpClient and HttpClient in Apache HttpClient API?)
    问题 我正在研究由我们公司开发的应用程序。 它使用Apache HttpClient库。 在源代码中,它使用HttpClient类创建实例以连接到服务器。 我想了解有关Apache HttpClient的知识,并且已经遍历了这组示例。 所有示例都使用CloseableHttpClient而不是HttpClient 。 所以我认为CloseableHttpClient是HttpClient的扩展版本。 如果是这种情况,我有两个问题: 两者有什么区别? 建议在我的新开发中使用哪个班级? 回答1 HttpClient API的主要入口点是HttpClient接口。 HttpClient的最基本功能是执行HTTP方法。 HTTP方法的执行涉及一个或多个HTTP请求/ HTTP响应交换,通常由HttpClient在内部处理。 CloseableHttpClient是一个抽象类,它是HttpClient的基础实现,它也实现java.io.Closeable。 这是最简单形式的请求执行过程示例: CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpget =新的HttpGet(“ http:// localhost /”); CloseableHttpResponse响应= httpclient
  • Redis都要老了,你还在用什么古董客户端?
    不羡鸳鸯不羡仙,一行代码调半天。原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。前几日,Redis 创始人 Antirez 在他的个人博客上宣布将结束自己的 Redis 之旅!大神累了,Redis老了,但Redis依旧很火。Redis的Java客户端有很多,比如jedis、redisson、lettuce等。那大家都在用啥呢?今天xjjdog做了一个小调查。下面是统计结果。 localfile://media/15940259145555/15940262979977.jpg可以看到jedis以绝对的优势占据了榜首。下面简单的分析一小下。jedislocalfile://media/15940259145555/15940301796032.jpgjedis和redis只相差1个字母。我通常把它叫做redis和Java的合体。它有以下特点:非常的轻量级、简洁,非常方便进行改造和集成支持单机、哨兵、Cluster等部署模式,支持事务、pipeline、LUA脚本等。功能齐全。不支持读写分离,需要自己实现使用了BIO模型,方法调用是同步的jedis客户端实例不是线程安全的,需要使用连接池来使用支持连接池代码样例。Jedis jedis = null;try { jedis = pool.getResource(); /// ... do stuff here
  • 关于java中redis操作直接使用jedis和使用springboot封装的RedisTemplate效率对比和主要区别
    个人使用总结: jedis,lettuce是目前用的最多的两个java端的redis客户端,而RedisTemplate则是SpringBoot提供的一个封装模板,为的是可以方便更换redis客户端和支持Spring Cache,SpringBoot2.0以前默认为jedis,2.x以上则换成了lettuce,经过多次的使用和对比,得出如下结论: 1,个人认为直接使用JedisPool比使用SpringBoot封装的RedisTemplate好用,而且效率高很多(相同的数据量至少5倍以上的差距,本机实测感觉jedis快了几十倍,get一个key,value为有一万多条数据的json,用RedisTemplate 在idea中单步调试在get这行的时候明显的卡半天才反应过来,至少3-5s以上,前后反复测试了十几次都是这样,但是使用jedis则是瞬间出来,进入下一行代码。相同的一个key数据存入redis后,使用同样的Windows redis cli客户端在服务端去get, 用RedisTemplate存入的显示为1.27s,而jedis存入的0.92s)这也是看得见的区别。如果是几十万的话区别就更大了。 2,jedis存入的字符串数据不会被添加转义符,用Windows redis cli客户端手工从服务端set的数据也可以在java jedis中正确读取出来
  • Java CDI @PersistenceContext和线程安全(Java CDI @PersistenceContext and thread safety)
    问题 在多个类中,EntityManager @Inject [ed]是否是线程安全的? @PersistenceContext(unitName="blah") private EntityManager em; 这个问题和这个问题似乎是Spring特有的。 我正在使用Jave EE CDI服务 回答1 尽管EntityManager实现本身不是线程安全的,但Java EE容器注入了一个代理,该代理将所有方法调用委托给与事务绑定的EntityManager 。 因此,每个事务都使用其自己的EntityManager实例。 至少对于事务范围的持久性上下文而言,这是正确的(默认设置)。 如果容器将在每个bean中注入EntityManager的新实例,则以下操作将无效: @Stateless public class Repository1 { @EJB private Repository2 rep2; @PersistenceContext(unitName="blah", type = PersistenceContextType.TRANSACTION) private EntityManager em; @TransactionAttribute public void doSomething() { // Do something with em rep2
  • 如何知道红宝石不是线程安全的?(how to know what is NOT thread-safe in ruby?)
    问题 从Rails 4开始,默认情况下,所有内容都必须在线程环境中运行。 这意味着所有我们写的代码和所有我们使用的宝石必须是threadsafe 因此,我对此没有几个问题: 在ruby / rails中,什么不是线程安全的? VS什么是Ruby / Rails中的线程安全? 是否有被称为是线程安全的,反之亦然宝石的名单? 是否存在不是线程安全示例的常见代码模式列表@result ||= some_method ? ruby lang核心中的数据结构(例如Hash等)是否是线程安全的? 在MRI上,存在一个GVL / GIL,这意味着除IO之外一次只能运行1条红宝石线程,线程安全更改对我们有影响吗? 回答1 没有一个核心数据结构是线程安全的。 我知道Ruby附带的唯一一个是标准库中的队列实现( require 'thread'; q = Queue.new )。 MRI的GIL不能使我们摆脱线程安全问题。 它只可以确保两个线程不能同时在两个不同的CPU在精确的同时运行Ruby代码,即。 线程仍可以在代码中的任何位置暂停和恢复。 如果您编写类似@n = 0; 3.times { Thread.start { 100.times { @n += 1 } } }代码@n = 0; 3.times { Thread.start { 100.times { @n += 1 } } } @n =
  • 常用的redis客户端介绍以及对比
    常用的redis客户端介绍以及对比 Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/ j edis /J edis.html redisson 官网地址:https://redisson.or g/ redisson git项目地址:https:// g ithub.com/redisson/redisson lettuce 官网地址:https://lettuce.io/ lettuce git项目地址:https:// g ithub.com/lettuce-io/lettuce-core 首先,在spring boot2之后,对redis连接的支持,默认就采用了lettuce。这就一定程度说明了lettuce 和Jedis 的优劣。 概念: Jedis:是老牌的Redis的Java实现客户端,提供了比较全面的Redis命令的支持, Redisson:实现了分布式和可扩展的Java数据结构。 Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。 优点: Jedis:比较全面的提供了Redis的操作特性 Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合
  • Axis2生成的存根是线程安全的吗?(Are Axis2 generated stubs thread-safe?)
    问题 Axis2从WSDL生成的客户端存根是否是线程安全的? 当然,“线程安全”不是严格定义的术语,因此我至少对以下内容感兴趣: 同一个存根类的不同实例是否可以由不同线程并发地以与单线程执行相同的有效行为来访问? 同一存根类的单个实例是否可以由不同的线程以相同的有效行为与同一调用以相同的有效行为以某种任意方式在单线程执行中交错存取? 您可能还希望使用此处描述的术语(和起源于此处)更精确地进行讨论。 回答1 我不确定axis2,但是至少axis1会生成非线程安全的客户端存根。 我给其他SOAP客户端几乎都是非线程安全的印象。 如果我没有记错的话,问题是客户端存根以非线程安全的方式使用XML解析库。 但是,使用apache commons-pooling合并实例并一次使用一个线程中的每个实例效果很好。 更新:对于Axis2,请参阅https://issues.apache.org/jira/browse/AXIS2-4357(声称Axis2并非出于线程安全原因,设计使然) 回答2 这些存根是无状态的,允许重用存根实例。 您能否详细说明Axis2所面临的问题。 人们通常建议在Axis上使用Xfire。 回答3 我想我会通过提供一些有关我所做的进一步研究的更新来尝试回答我自己的问题。 似乎默认情况下,较旧版本的Axis2存根可能仅是“线程兼容的”(不能同时从多个线程对同一个存根实例进行调用
  • 秋招知识点总结-Redis数据库
    原视频链接 01.NoSQL入门概述-上 1.互联网时代背景下大机遇,为什么用NoSQL 1.单机MySQL的美好年代 在90年代,一个网站的浏览量一般都不大,用单个数据库完全可以轻松应付。 在那个时候,更多的都是静态网页,动态交互类型的网站不多。 DAL:Data Access Layer 上述架构下,我们来看看数据存储的瓶颈是什么? 数据量的总大小一个机器放不下时数据的索引(B+ Tree)一个机器的内存放不下时浏览量(读写混合)一个实例不能承受 如果满足了上述1or3个,进化… 2.Memcached(缓存)+MySQL+垂直拆分 后来,随着网站浏览量的增多,几乎大部分使用MySQL架构的网站在数据库方面都开始出现了性能问题,web程序不再仅仅专注在功能业务,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当浏览量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。 3.Mysql主从读写分离 由于数据库的写入压力增加,Memcached 只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离
  • Redis学习笔记
    教学视频Redis官网Redis中文网本文用到的Java源码 ------01.NoSQL入门概述-上02.NoSQL入门概述-下03.当下NoSQL应用场景简介04.NoSQL数据模型简介05.NoSQL数据库的四大分类06.分布式数据库CAP原理07.安装08.HelloWorld09.启动后杂项基础知识10.常用五大数据类型简介11.Key关键字12.String13.List14.Set15.Hash16.ZSet17.配置文件介绍18.持久化之RDB19.持久化之AOF20.事务21.消息订阅发布简介22&23.主从复制24.Jedis_测试联通25.Jedis_常用API26.Jedis_事务27.Jedis_主从复制28.Jedis_JedisPool29.待学-- 01.NoSQL入门概述-上 1.互联网时代背景下大机遇,为什么用NoSQL 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。 在那个时候,更多的都是静态网页,动态交互类型的网站不多。 DAL dal是数据访问层的英文缩写,即为数据访问层(Data Access Layer) 上述架构下,我们来看看数据存储的瓶颈是什么? 数据量的总大小一个机器放不下时数据的索引(B+ Tree)一个机器的内存放不下时访问量(读写混合)一个实例不能承受
  • 为什么要合并无状态会话bean?(Why pool Stateless session beans?)
    问题 Java中的无状态Bean不会在两次客户端调用之间保持其状态。 因此,简而言之,我们可以将它们视为具有业务方法的对象。 每种方法都带有参数并返回结果。 调用该方法时,将在执行堆栈中创建一些局部变量。 当该方法返回时,将本地对象从堆栈中删除,并且如果分配了一些临时对象,则无论如何都会对其进行垃圾回收。 从我的角度来看,这与通过单独的线程调用同一实例的方法没有什么不同。 那么,为什么容器不能使用bean的一个实例而不是池化多个实例呢? 回答1 池化有几件事情。 一个,通过每个实例只有一个bean,可以确保您是线程安全的(例如,Servlet不是线程安全的)。 第二,您减少了bean可能具有的任何潜在启动时间。 尽管会话Bean是“无状态的”,但就客户端而言,它们仅需要是无状态的。 例如,在EJB中,您可以将多个服务器资源注入到会话Bean中。 该状态是Bean专用的,但是没有理由不能使它在调用之间保持不变。 因此,通过池化bean,可以将这些查找减少为仅在创建bean时进行。 第三,可以使用bean池来限制流量。 如果一个池中只有10个Bean,那么最多只能同时处理10个请求,其余的将排队。 回答2 合并可提高性能。 一个处理所有请求/线程的实例将导致大量争用和阻塞。 由于您不知道将使用哪个实例(并且多个线程可以同时使用一个实例),因此Bean必须是线程安全的。
  • 面试官:你真的了解Redis分布式锁吗?
    什么是分布式锁说到Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis因为单进程、性能高的特点,它还经常被用于做分布式锁。锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同一时刻只能被一个线程访问,Java中的锁我们都很熟悉了,像synchronized 、Lock都是我们经常使用的,但是Java的锁只能保证单机的时候有效,分布式集群环境就无能为力了,这个时候我们就需要用到分布式锁。分布式锁,顾名思义,就是分布式项目开发中用到的锁,可以用来控制分布式系统之间同步访问共享资源,一般来说,分布式锁需要满足的特性有这么几点:1、互斥性:在任何时刻,对于同一条数据,只有一台应用可以获取到分布式锁;2、高可用性:在分布式场景下,一小部分服务器宕机不影响正常使用,这种情况就需要将提供分布式锁的服务以集群的方式部署;3、防止锁超时:如果客户端没有主动释放锁,服务器会在一段时间之后自动释放锁,防止客户端宕机或者网络不可达时产生死锁;4、独占性:加锁解锁必须由同一台服务器进行,也就是锁的持有者才可以释放锁,不能出现你加的锁,别人给你解锁了;业界里可以实现分布式锁效果的工具很多,但操作无非这么几个:加锁、解锁、防止锁超时。既然本文说的是Redis分布式锁,那我们理所当然就以Redis的知识点来延伸。实现锁的命令先介绍下Redis的几个命令,1、SETNX,用法是SETNX
  • 实践中的Java并发-示例14.12(Java Concurrency in Practice - Sample 14.12)
    问题 // Not really how java.util.concurrent.Semaphore is implemented @ThreadSafe public class SemaphoreOnLock { private final Lock lock = new ReentrantLock(); // CONDITION PREDICATE: permitsAvailable (permits > 0) private final Condition permitsAvailable = lock.newCondition(); @GuardedBy("lock") private int permits; SemaphoreOnLock(int initialPermits) { lock.lock(); try { permits = initialPermits; } finally { lock.unlock(); } } /* other code omitted.... */ 我对上面的示例有一个疑问,该示例是从实践清单14.12计数使用锁实现的信号量的Java并发中提取的。 我想知道为什么我们需要在构造函数中获取锁(如所示的lock.lock()被调用)。 据我所知,构造函数是原子的(引用转义除外),因为没有其他线程可以获取该引用,因此
  • 是否应该在每个线程中使用单独的ScriptEngine和CompiledScript实例?(Should I use a separate ScriptEngine and CompiledScript instances per each thread?)
    问题 我的程序使用Java Scripting API,并且可以同时评估某些脚本。 它们不使用共享脚本对象,绑定或上下文,但是可以使用相同的ScriptEngine和CompiledScript对象。 我看到Java 8中的Oracle Nashorn实现不是多线程的, ScriptEngineFactory.getParameter('THREADING')返回null ,文档对此表示: 引擎实现不是线程安全的,因此不能用于在多个线程上同时执行脚本。 这是否意味着我应该为每个线程创建一个单独的ScriptEngine实例? 此外,文档没有CompiledScript并发用法,而是: 每个CompiledScript与一个ScriptEngine相关联 可以假设CompiledScript线程安全性取决于相关的ScriptEngine ,即,对于具有Nashorn的每个线程,我应该使用单独的CompiledScript实例。 如果可以的话,使用ThreadLocal ,池或其他方法来解决这种情况(我认为很常见)是什么合适的解决方案? final String script = "..."; final CompiledScript compiled = ((Compilable)scriptEngine).compile(script); for (int i=0; i<50; i
  • SpringBoot 2.x整合Redis使用
    前言:SpringBoot 2.0已经使用Lettuce代替Jedis客户端。Spring框架的spring-data-redis的相关Jar包,不仅支持连接池自动管理,而且它还提供了使用Redis的模版RedisTemplate<K, V>接口或它的实现类StringRedisTemplate,可以支持Redis没有的缓存对象的操作。 也就是说,我们可以在SpringBoot应用中通过简单的连接池配置信息,就能访问Redis服务并进行相关缓存操作。 一、Lettuce多线程安全的Redis客户端概述 1、Lettuce的出现背景 如果你在网上搜索 Redis 的 Java 客户端,你会发现,大多数文献介绍的都是 Jedis,不可否认,Jedis 是一个优秀的基于 Java 语言的 Redis 客户端,但是,其不足也很明显:Jedis 在实现上是直接连接 Redis-Server,在多个线程间共享一个 Jedis 实例时是线程不安全的,如果想要在多线程场景下使用 Jedis,需要使用连接池,每个线程都使用自己的 Jedis 实例,当连接数量增多时,会消耗较多的物理资源。 与 Jedis 相比,Lettuce 则完全克服了其线程不安全的缺点:Lettuce 是一个可伸缩的线程安全的 Redis 客户端,支持同步、异步和响应式模式。多个线程可以共享一个连接实例,而不必担心多线程并发问题
  • redis
    NoSql NoSql入门和概述 入门概述 互联网时代背景下 大机遇,为什么用nosql 单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。 在那个时候,更多的都是静态网页,动态交互类型的网站不多。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtYfIUvb-1617346216317)(C:\Users\WolfMan\AppData\Roaming\Typora\typora-user-images\image-20210331192543852.png)] 上述架构下,我们来看看数据存储的瓶颈是什么? 1.数据量的总大小 一个机器放不下时 2.数据的索引(B+ Tree)一个机器的内存放不下时 3.访问量(读写混合)一个实例不能承受 如果满足了上述1 or 3个,进化… Memcached(缓存)+MySQL+垂直拆分 后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候
  • Redis的客户端框架比较: Jedis, Redisson, Lettuce
    Redis的客户端框架比较: Jedis, Redisson, Lettuce 目录 Redis的客户端框架比较: Jedis, Redisson, Lettuce 官网 简介 优点 可伸缩 比较 结论 参考资料 官网 Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html redisson 官网地址:https://redisson.org/ redisson git项目地址:https://github.com/redisson/redisson lettuce 官网地址:https://lettuce.io/ lettuce git项目地址:https://github.com/lettuce-io/lettuce-core 简介   Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持,spring boot 1.X版本默认客户端   Redisson:实现了分布式和可扩展的Java数据结构。   Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器, ,spring boot 2.X版本默认客户端 优点   Jedis:比较全面的提供了Redis的操作特性
  • 分布式专题|吐血整理Redis 十四大知识点,帮助小白从0到1蜕变
    文章目录 摘要环境搭建redis Docker方式安装使用源码方式安装redis 一、五种基本数据类型的操作与应用场景string 字符串类型基本指令应用场景 hash(哈希)基本操作指令应用场景 list(链表)基本指令应用场景 set(集合)基本指令应用场景 zset(有序列表)基本指令扩展知识 二、如何使用redis实现附近的人的功能基本指令 三、布隆过滤器实现原理布隆过滤器的安装(docker方式)基本指令布隆过滤器的原理 四、redis持久化为什么需要持久化?持久化的方式快照的原理fork(多进程)AOF原理AOF重写fsyncredis4.0混合持久化 五、redis的弱事务示例用法redis的事务具备原子性么?watch指令redis为什么不支持原子性(回滚) 六、Redis管道管道的本质 七、Redis的订阅消息多播基本指令 八、redis主从同步CAP原理最终一致主从同步与从从同步增量同步快照同步无盘复制wait指令 九、redis-Sentinel(哨兵机制)工作过程消息丢失Sentinel 实战Sentinel基本原理 十、redis集群Codis什么是Cluster ?槽位定位算法跳转迁移容错 十一、单线程的redis为何如此快?非阻塞IO事件轮训(多路复用)指令队列定时任务 十二、redis的过期策略定期删除策略缺点 惰性删除策略缺点
  • Redis常问面试题整理
    文章出处:Redis常问面试题整理 介绍 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。 传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式而分布式一般遵循 CAP 定理 1.Redis支持哪几种数据类型? 1.string:最基本的数据类型,二进制安全的字符串,最大512M。 2.list:按照添加顺序保持顺序的字符串列表。 3.set:无序的字符串集合,不存在重复的元素。 4.sorted set:已排序的字符串集合。 5.hash:key-value对的一种集合。 另外还有四种特殊的 数据类型 1.BloomFilter 2.HyperLogLog 3.BitMap 4.Geo 这几种数据类型的具体介绍。 立即了解redis其他的数据类型 : 点击了解 注意 关于数据类型多说两句: redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有数据类型的,只有把它们按照合理的格式解码后,可以变成一个字符串,整数或对象,此时才具有数据类型。 这一点必须要记住。 所以任何东西只要能转化成字节数组(byte[])的
  • Redis常见面试问题汇总及解析
      面试后端开发的职位,相信大家经常被问到有关redis问题。Redis作为缓存系统的代表很有必要弄熟搞懂,无论是在工作当中还是求职面试过程中都是大有裨益的,本文将详细介绍一些redis的一些典型问题,并给出了一些参考解答。   由于作者水平有限,可能会有存在一些问题,欢迎大家不吝批评指教。文中参考了网友的一些资料,在这里先他们表示感谢。本文全文约4000字,阅读完大概需要10分钟时间。 常见问题 Redis性能为什么高? 单线程的redis如何利用多核cpu机器? Redis的缓存淘汰策略? Redis如何持久化数据? Redis有哪几种数据结构? Redis集群有哪几种形式? 有海量key和value都比较小的数据,在redis中如何存储才更省内存? 如何保证redis和DB中的数据一致性? 如何解决缓存穿透和缓存雪崩? 如何用redis实现分布式锁? 问题参考列表 Redis性能为什么高? Redis是key-value存储的nosql数据库,具有以下一些性质,使其性能优异。 完全基于内存操作,绝大多数操作都在内存中完成,非常高效。内部采用多路I/O复用模型,非阻塞式IO。Redis会根据系统情况优先调用高效的IO复用模型,例如linux的epoll多路IO函数;数据结构和数据操作简单,redis中的数据结构是专门进行设计的;处理请求模块采用单线程