广告
返回顶部
首页 > 资讯 > 数据库 >Redis->eval()的优势有哪些
  • 663
分享到

Redis->eval()的优势有哪些

2024-04-02 19:04:59 663人浏览 独家记忆
摘要

小编给大家分享一下Redis->eval()的优势有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!平时你用 Redis

小编给大家分享一下Redis->eval()的优势有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

平时你用 Redis 是不是经常 get()、set()一把梭?其实 Redis 中还有很多有用的数据结构,以及各种方法。今天我们就来测试一下eval()方法。

Redis Eval 官方说明(节选)

EVAL script numkeys key [key ...] arg [arg ...]

从 Redis 2.6.0 版本开始,通过内置的 lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值。

Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。这和使用 MULTI / EXEC 包围的事务很类似。在其他别的客户端看来,脚本的效果(effect)要么是不可见的(not visible),要么就是已完成的(already completed)。

另一方面,这也意味着,执行一个运行缓慢的脚本并不是一个好主意。写一个跑得很快很顺溜的脚本并不难,因为脚本的运行开销(overhead)非常少,但是当你不得不使用一些跑得比较慢的脚本时,请小心,因为当这些蜗牛脚本在慢吞吞地运行的时候,其他客户端会因为服务器正忙而无法执行命令。

实测

我的理解,Redis 中的 eval() 方法一般用于需要执行多个 redis 操作,来完成一个目标的场景。

下面我模拟了一个操作 100 次 redis 的场景,当然实际可能并不需要这么多,仅仅想让大家看到差别。

<?PHP
 
$redis = new \Redis;
$redis->connect('127.0.0.1', 6379);
 
// 清空Redis
$redis->flushDB();
 
// php 中循环 set
$t = microtime(true);
for($i = 0; $i < 100; ++$i)
{
    $redis->set('key' . $i, $i);
}
echo 'php for set: ', microtime(true) - $t, PHP_EOL;
 
// 清空Redis
$redis->flushDB();
 
// 使用 eval 方法
$t = microtime(true);
$keys = [];
$values = [];
for($i = 0; $i < 100; ++$i)
{
    $keys[] = 'key' . $i;
    $values[] = $i;
}
$redis->eval(<<<SCRIPT
for i=1,#KEYS do
    redis.call('set', KEYS[i], ARGV[i])
end
SCRIPT
, array_merge($keys, $values), count($keys));
echo 'eval:', microtime(true) - $t, PHP_EOL;

结果:

php for set: 0.056596040725708
eval:0.00089216232299805

显而易见,eval碾压性地,比在代码中循环set来的快。

……

你以为这就完了?

不!

evalSha了解一下?

EvalSha 说明

EVALSHA sha1 numkeys key [key ...] arg [arg ...]

根据给定的 sha1 校验码,对缓存在服务器中的脚本进行求值。

将脚本缓存到服务器的操作可以通过 SCRIPT LOAD 命令进行。

这个命令的其他地方,比如参数的传入方式,都和 EVAL 命令一样。

EvalSha 实测

<?php
function testEval($redis)
{
    $keys = [];
    $values = [];
    for($i = 0; $i < 100; ++$i)
    {
        $keys[] = 'key' . $i;
        $values[] = $i;
    }
    $redis->eval(<<<SCRIPT
for i=1,#KEYS do
    redis.call('set', KEYS[i], ARGV[i])
end
SCRIPT
, array_merge($keys, $values), count($keys));
}
 
function testEvalSha($redis)
{
    $keys = [];
    $values = [];
    for($i = 0; $i < 100; ++$i)
    {
        $keys[] = 'key' . $i;
        $values[] = $i;
    }
    $redis->evalSha(sha1(<<<SCRIPT
for i=1,#KEYS do
    redis.call('set', KEYS[i], ARGV[i])
end
SCRIPT
    ), array_merge($keys, $values), count($keys));
}
 
$redis = new \Redis;
$redis->connect('127.0.0.1', 6379);
 
// 清空Redis
$redis->flushDB();
 
// 使用 eval 方法
$t = microtime(true);
for($i = 0; $i < 100; ++$i)
{
    testEval($redis);
}
echo 'eval:', microtime(true) - $t, PHP_EOL;
 
 
// 清空Redis
$redis->flushDB();
 
// 使用 evalSha 方法
$t = microtime(true);
for($i = 0; $i < 100; ++$i)
{
    testEvalSha($redis);
}
echo 'evalSha:', microtime(true) - $t, PHP_EOL;

结果:

eval:0.081475973129272
evalSha:0.076005220413208

从我测试的结果来看,evalSha的速度并不比eval有显著的提升。

但是,在生产环境下,如果使用evalSha会比eval发送更小的数据包,占用更少的网络资源。

因为eval每次都需要把脚本完整发送给redis,而evalSha只需要传递一个sha1即可。

当执行过一次eval后,evalSha 才可以直接调用。

福利

下面是我封装的一个方法,优先使用 evalSha 尝试,失败则使用 eval 方法。


function evalEx($redis, $script, $args = null, $num_keys = null)
{
    $sha1 = sha1($script);
    $redis->clearLastError();
    $result = $redis->evalSha($sha1, $args, $num_keys);
    if('NOSCRIPT No matching script. Please use EVAL.' === $redis->getLastError())
    {
        $result = $redis->eval($script, $args, $num_keys);
    }
    return $result;
}

以上是Redis->eval()的优势有哪些的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: Redis->eval()的优势有哪些

本文链接: https://www.lsjlt.com/news/52609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis->eval()的优势有哪些
    小编给大家分享一下Redis->eval()的优势有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!平时你用 Redis...
    99+
    2022-10-18
  • Redis有哪些优势
    这篇文章主要为大家展示了“Redis有哪些优势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis有哪些优势”这篇文章吧。Redis有什么优势?1、性能高,...
    99+
    2022-10-19
  • Redis的优势和特点有哪些
    这篇文章主要介绍“Redis的优势和特点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis的优势和特点有哪些”文章能帮助大家解决问题。什么是redisR...
    99+
    2022-10-19
  • 云数据库Redis有哪些优势
    1. 高性能:Redis是一种内存数据库,数据存储在内存中,因此读取和写入数据的速度非常快,可以达到每秒数百万次的读写操作。2. 高...
    99+
    2023-05-13
    云数据库Redis 云数据库
  • 使用云数据库Redis有哪些优势
    1. 高性能:云数据库Redis采用内存数据库技术,数据存储在内存中,读写速度非常快,可以达到每秒数十万次的读写操作,因此适用于高并...
    99+
    2023-05-13
    云数据库Redis 云数据库
  • OpenCore的优势有哪些
    这篇文章主要为大家展示了“OpenCore的优势有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“OpenCore的优势有哪些”这篇文章吧。OpenCore ...
    99+
    2022-10-19
  • css的有哪些优势
    这篇文章主要讲解了“css的有哪些优势”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css的有哪些优势”吧! css的优势:1、...
    99+
    2022-10-19
  • Css的优势有哪些
    小编给大家分享一下Css的优势有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Css的优势 表现与内容分离 增强了网页的...
    99+
    2022-10-19
  • chatGPT的优势有哪些
    今天小编给大家分享一下chatGPT的优势有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-02-23
    chatgpt
  • Nginx_lua的优势和劣势有哪些
    这篇文章主要讲解了“Nginx_lua的优势和劣势有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nginx_lua的优势和劣势有哪些”吧!首先让我们来...
    99+
    2022-10-19
  • redis的优点有哪些
    这篇文章将为大家详细讲解有关redis的优点有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。redis是Nosql数据库中使用较为广泛的非关系型内存数据...
    99+
    2022-10-18
  • Java有哪些优势
    本篇内容介绍了“Java有哪些优势”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1、Java广受欢迎  Java仍然是世界上最受欢迎的编...
    99+
    2023-06-02
  • ChatGPT有哪些优势
    ChatGPT的优势有:1、ChatGPT有多个领域的应用功能,如人机对话、写文章、写代码、当律师等,能满足用户的使用需求;2、Ch...
    99+
    2023-02-09
    ChatGPT
  • mysql有哪些优势
    下文给大家带来有关mysql有哪些优势内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完mysql有哪些优势你一定会有所收获。1、运行速度快,MySQL体积小,命令...
    99+
    2022-10-18
  • vuejs有哪些优势
    这篇文章给大家分享的是有关vuejs有哪些优势的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 vuejs的优势:1、可以进行组件化开发,减少代码编写量...
    99+
    2022-10-19
  • mongodb有哪些优势
    mongodb的优势:1、mongodb数据存储以BSON/JSON文档进行存储;2、mongodb能够进行数据库扩展,拥有可扩展性;3、能够进行镜像复制;4、使用mongodb查询速度比较快;5、mongodb能够降低受到SQL注入攻击的...
    99+
    2022-10-08
  • golang有哪些优势
    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。golang(go)是一种过程编程语言,可用于快速机器代码编译。它是一种静态类型的编译语言。它提供了并发机制,可以轻松开发多核和联网的机器级程序。它是快速,动态类...
    99+
    2022-11-25
    Go Golang go语言
  • html5有哪些优势
    html5有哪些优势?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,适合初学前端开发者使...
    99+
    2023-06-14
  • redis高并发下数据一致性的优势有哪些
    在Redis高并发下,数据一致性的优势主要体现在以下几个方面:1. 高性能:Redis是基于内存的存储系统,读写速度非常快,可以支持...
    99+
    2023-09-11
    redis
  • html5有哪些优势和劣势
    本篇内容主要讲解“html5有哪些优势和劣势”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5有哪些优势和劣势”吧! html...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作