redis最大并发是多少?

分类:编程技术 时间:2024-02-20 15:14 浏览:0 评论:0
0
本文和大家分享一下redis的最大并发数。小编觉得还是比较实用的,所以分享给大家学习一下。希望您读完本文后有所收获。话不多说,跟着小编一起来看看吧。我们一起来看看吧。

                                                                                                                                                                                                                                                                       依次执行,我一直以为不会有并发问题。直到今天看到相关信息我才恍然大悟。

具体问题示例

有一个key,假设名字是myNum,里面存储的是阿拉伯数字。假设当前值为1,并且有多个连接。在myNum上操作时,这时候就会出现并发问题e.假设有两个连接 linkA 和 linkB。两个连接都执行以下操作,取出myNum的值+1,然后保存回来。看一下下面的交互:

linkA get myNum => 1linkB get myNum => 1linkA set muNum => 2linkB set myNum => 2

执行完运算后,结果可能是2,与我们预期的3不一致。

看一个具体的例子:

 'tcp','host' => '127.0.0.1','port' => 6379,]);for ($i = 0; $i < 1000; $i++) { $num = intval($client->get("name"));$num = $num + 1;$client->setex("name", $num , 10080);usleep(10000);}

将name的初始值设置为0,然后使用两个终端同时执行上述程序。 name 最终的值可能不是 2000 ,而是一个 <2000 的值,这也证明了我们上面的并发pro的存在性问题。怎么解决这个问题呢?

redis中的事务

redis中也有事务,但是这个事务没有mysql中那么完善,只保证了一致性和隔离性。不满足原子性和持久性。

Redis 事务使用 multiexec 命令来实现原子性。 Redis会执行一次事务中的所有命令,即使中间出现执行失败,也不会回滚。 Kill信号、主机宕机等导致事务执行失败,redis不会重试或回滚。

持久化,redis事务的持久化取决于redis使用的持久化模式。不幸的是,各种持久化模式都不是持久化的。

隔离性,redis是单进程。启动事务后,会执行当前连接的所有命令,直到遇到exec命令,然后再执行其他连接的命令处理。

一致性,读完文档后,我觉得这相当可笑,但似乎是正确的。

redis中的事务不支持原子性,因此无法解决上述问题。

当然,redis还有一个watch命令,可以解决这个问题。看一下下面的示例,对某个键执行监视,然后执行事务。由于手表的存在,它会监听a键。当a被修复后,后续的交易将无法执行。这确保了多个连接同时到来,所有连接都监视一个。只有一个能够执行成功,其他都返回失败。

127.0.0.1:6379> 设置 1OK127.0.0.1:6379> 观看 aOK127.0.0.1:6379> 多 OK127.0.0.1: 6379>incr aQUEUED127.0.0.1:6379> exec1)(整数)2127.0.0.1:6379> get a"2"

失败时的示例。从最后可以看出test的值已经被其他connecti修改了昂斯。 :

127.0.0.1:6379> set test 1OK127.0.0.1:6379> watch testOK127.0.0.1:6379> multiOK127.0.0.1: 6379> incrby test 11QUEUED127.0.0.1:6379> exec(nil)127.0.0.1:6379> get test "100"

如何解决问题

redis中的命令是原子的,所以当值为阿拉伯数字时,我可以将get和set命令更改为incr或incrby来解决这个问题。以下代码使两个终端能够同时执行。结果达到了我们对 2000 年的期望。

 'tcp','主机' => '127.0.0.1','端口' => 6379,]);for ($i = 0; $i < 1000; $i++) { $client->incr(" name");$client->expire("name", 10800);usleep(10000);}

确实可行,效果也不错。这是一个示例

 'tcp','host' => '127.0.0.1','port' => 6379,]);class RedisLock{ public $objRedis = null;public $timeout = 3;/** * @desc 设置redis实例* * @param obj 对象 | redis实例*/public function __construct($obj){ $this->objRedis = $obj;} /** * @desc 获取锁key名称*/public function getLockCacheKey($key){ return "lock_{$key} ";} /** * @desc 获取锁* * @param key string |需要锁定的按键名称* @param timeout int |锁定时间*/public function getLock( $key, $timeout = NULL){ $timeout = $timeout ? $timeout : $this->timeout;$lockCacheKey = $this->getLockCacheKey($key);$expireAt = time() + $timeout;$isGet = (bool)$this->objRedis->setnx($lockCacheKey, $expireAt);if ($isGet) { return $expireAt;} while (1) { usleep(10);$time = time();$oldExpire = $this->objRedis->get($lockCacheKey);if ( $oldExpire >= $time) { 继续;} $newExpire = $time + $timeout;$expireAt = $this->objRedis->getset($lockCacheKey, $newExpire);if ($oldExpire != $expireAt) { 继续;}$isGet = $newExpire;break;} return $isGet;} /** * @desc 释放锁* * @param key string |锁定字段* @param newExpire int |锁定截止日期* * @return bool |是否释放成功*/public function releaseLock($key, $newExpire){ $lockCacheKey = $this->getLockCacheKey($key);if ($newExpire >= time()) { return $this->objRedis-> del($lockCacheKey);} 返回 true;}}$start_time = microtime(true);$lock = new RedisLock($client);$key = "名称";for ($i = 0; $i < 10000; $ i++) { $newExpire = $lock->getLock($key);$num = $client->get($key);$num++;$client->set($key, $num);$lock->releaseLock ($key, $newExpire);}$end_time = microtime(true);echo "花费的时间:"。 ($end_time - $start_time) 。 "\n";

执行 shell php setnx. php & php setnx.php&,最终会得到结果:

$ 花费时间:4.3004920482635[2] + 72356 完成 php setnx.php# root @ ritoyan- virtual-pc in ~/PHP/redis-high-concurrency [20:23:41] $ 花费时间:4.4319710731506[1] + 72355 did php setnx.php

同样循环1w次,去掉usleep,直接用incr增加,耗时2秒左右。

当获取收入时取消usleep,时间并没有减少,反而增加了。 usleep的设置一定要合理,避免过程中出现无用循环

总结

简单总结一下,其实redis不存在并发问题,因为是单进程,无论执行多少条命令,都是一一执行。我们使用的时候可能会出现并发问题,比如get和set这对。

更多相关信息:

Redis在高并发情况下可能存在哪些问题

< p class="introduction">Redis数据库并发的原理是什么

以上是redis的最大并发。小编认为有些知识点可能相关到我们的日常工作中。将会被看到或使用。希望您能从本文中了解更多信息。更多详情请关注行业资讯频道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > redis最大并发是多少?

用户评论