【问题标题】:Is jedis synchronous or async? What consistency guarantee does redis provide?jedis 是同步的还是异步的? redis 提供什么一致性保证?
【发布时间】:2018-05-14 15:03:54
【问题描述】:
1) jedis 调用是异步的同步的吗?当我通过jedis连续进行两次写入时,是否可以确定它们在我制作时会以相同的顺序命中redis?
2)redis提供什么一致性保证?当我通过绝地设置一些值时,是否保证每次后续读取都会看到该写入?我知道在最终一致性系统中你没有这样的保证。
是不是像zookeeper那样的顺序一致性?我读了文件。它只是说它不是强一致性,这意味着我假设的线性化?
【问题讨论】:
标签:
asynchronous
redis
distributed
synchronous
jedis
【解决方案1】:
jedis 调用是异步的同步的吗?
从client-server的角度来看,就是sync,意思是当jedis客户端发送请求时,redis server会处理并返回结果作为对请求的响应。但是对于像 unlink 这样的命令,情况会有所不同,在某些情况下,redis 会直接返回并在后台处理它。所以命令是sync还是async,取决于redis服务器的动作。
当我通过jedis连续两次写入时,是否可以确定他们在我制作时会以相同的顺序命中redis?
是的,redis 是单线程模型,它有一个请求队列,所以所有的命令都是顺序处理的。但也有一些情况需要注意:如果多个客户端(或进程)向服务器发送命令,就会出现数据不一致的情况。您可以使用 multi/exec 或 watch 或分布式锁来解决不同的情况。
redis 提供什么一致性保证?当我通过 jedis 设置一些值时,是否保证每次后续读取都会看到该写入?
如果读取命令在写入命令之后到达,则保证读取将看到写入。正是因为单线程模型让世界变得简单。但是如果你通过sentinel或者redis集群模式使用主从模式,情况就不一样了。如果你从 slave 读取,读取并不能保证看到最近的写入,因为从 master 到 slave 的 redis 复制是异步的,但是在单个 redis 实例中不会发生同样的事情。