当前位置:首页 » 编程软件 » redis懒人脚本

redis懒人脚本

发布时间: 2022-08-09 03:06:28

㈠ redis有脚本语言吗

有,lua脚本语言

Redis脚本

使用脚本的好处:

  • 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延

  • 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。

  • 复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。

  • 调用Lua脚本的语法:

    $ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...

  • --eval,告诉redis-cli读取并运行后面的lua脚本

  • path/to/redis.lua,是lua脚本的位置

  • KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取

  • ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。

  • 注意:

    KEYS和ARGV中间的 ',' 两边的空格,不能省略。

    redis支持大部分Lua标准库

    库名

    说明

    Base 提供一些基础函数

    String 提供用于字符串操作的函数

    Table 提供用于表操作的函数

    Math 提供数学计算函数

    Debug 提供用于调试的函数

    在脚本中调用redis命令

    在脚本中可以使用redis.call函数调用Redis命令

  • redis.call('set', 'foo', 'bar')local value=redis.call('get', 'foo') --value的值为bar

  • redis.call函数的返回值就是Redis命令的执行结果

    Redis命令的返回值有5种类型,redis.call函数会将这5种类型的回复转换成对应的Lua的数据类型,具体的对应规则如下(空结果比较特殊,其对应Lua的false)

    redis返回值类型和Lua数据类型转换规则

    redis返回值类型

    Lua数据类型

    整数回复 数字类型

    字符串回复 字符串类型

    多行字符串回复 table类型(数组形式)

    状态回复 table类型(只有一个ok字段存储状态信息)

    错误回复 table类型(只有一个err字段存储错误信息)

    redis还提供了redis.pcall函数,功能与redis.call相同,唯一的区别是当命令执行出错时,redis.pcall会记录错误并继续执行,而redis.call会直接返回错误,不会继续执行。

    在脚本中可以使用return语句将值返回给客户端,如果没有执行return语句则默认返回nil

    Lua数据类型和redis返回值类型转换规则

    Lua数据类型

    redis返回值类型

    数字类型 整数回复(Lua的数字类型会被自动转换成整数)

    字符串类型 字符串回复

    table类型(数组形式) 多行字符串回复

    table类型(只有一个ok字段存储状态信息) 状态回复

    table类型(只有一个err字段存储错误信息) 错误回复

    脚本相关命令

  • EVAL "lua-script" [key ...] [arg ...]

    通过key和arg这两类参数向脚本传递数据,它们的值在脚本中分别使用KEYS和ARGV两个表类型的全局变量访问

    注意: EVAL命令依据参数key-number来将其后面的所有参数分别存入脚本中KEYS和ARGV两个table类型的全局变量。当脚本不需要任何参数时,也不能省略这个参数(设为0)

    redis>EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 foo bar
    OK
    redis>GET foo"bar"
  • EVALSHA命令

    在脚本比较长的情况下,如果每次调用脚本都需要将整个脚本传给Redis会占用较多的带宽。为了解决这个问题,Redis提供了EVALSHA命令,允许开发者通过脚本内容的SHA1摘要来执行脚本,该命令的用法和EVAL一样,只不过是将脚本内容替换成脚本内容的SHA1摘要。

    Redis在执行EVAL命令时会计算脚本的SHA1摘要并记录在脚本缓存中,执行EVALSHA命令时Redis会根据提供的摘要从脚本缓存中查找对应的脚本内容,如果找到了则执行脚本,否则会返回错误:"NOSCRIPT No matching script. Please use EVAL."

    在程序中使用EVALSHA命令的一般流程如下。

    虽然这一流程略显麻烦,但值得庆幸的是很多编程语言的Redis客户端都会代替开发者完成这一流程。执行EVAL命令时,先尝试执行EVALSHA命令,如果失败了才会执行EVAL命令。

  • 先计算脚本的SHA1摘要,并使用EVALSHA命令执行脚本。

  • 获得返回值,如果返回“NOSCRIPT”错误则使用EVAL命令重新执行脚本。

  • SCRIPTLOAD "lua-script"

    将脚本加入缓存,但不执行. 返回:脚本的SHA1摘要

  • SCRIPT EXISTS lua-script-sha1

    判断脚本是否已被缓存

  • SCRIPT FLUSH

    清空脚本缓存 redis将脚本的SHA1摘要加入到脚本缓存后会永久保留,不会删除,但可以手动使用SCRIPT FLUSH命令情况脚本缓存。

  • SCRIPT KILL

    强制终止当前脚本的执行。 但是,如果当前执行的脚步对redis的数据进行了写操作,则SCRIPT KILL命令不会终止脚本的运行,以防止脚本只执行了一部分。脚本中的所有命令,要么都执行,要么都不执行。

  • Redis的脚本执行是原子的,即脚本执行期间Redis不会执行其他命令。所有的命令都必须等待脚本执行完成后才能执行。为了防止某个脚本执行时间过长导致Redis无法提供服务(比如陷入死循环),Redis提供了lua-time-limit参数限制脚本的最长运行时间,默认为5秒钟。当脚本运行时间超过这一限制后,Redis将开始接受其他命令但不会执行(以确保脚本的原子性,因为此时脚本并没有被终止),而是会返回“BUSY”错误

㈡ 有谁可以提供一个检测redis是否为master或者slave的检测脚本

Redis的安装目录下有一个logs目录,进入后打开redis.log,如果你是主备模式,里面有类似Connection to MASTER xx:xx:xx:xx:6379的日志信息,这个就是master地址,因为主备模式容易主备切换,你可以搜索关键字 "lost”,这个就代表哨兵检测到主机down了,准备主备切换了。

㈢ redis加载lua脚本,怎么获取数据

需要用lua写redis的操作函数,先连接redis数据库,然后执行命令,来获取数据。

㈣ 求《Redis实战》全文免费下载百度网盘资源,谢谢~

《Redis实战》网络网盘pdf最新全集下载:
链接:https://pan..com/s/1Rwi1Ati4zEwqoFk3mhHq5Q

?pwd=6m0x 提取码:6m0x
简介:本书深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了Redis的用法。除此之外,书中还讲述了Redis的优化方法以及扩展方法,是一本对于学习和使用 Redis 来说不可多得的参考书籍。

本书一共由三个部分组成。首部分对Redis进行了介绍,说明了Redis的基本使用方法、它拥有的5种数据结构以及操作这5种数据结构的命令,并讲解了如何使用Redis去构建文章展示网站、cookie、购物车、网页缓存、数据库行缓存等一系列程序。第二部分对Redis命令进行了更详细的介绍,并展示了如何使用Redis去构建更为复杂的辅助工具和应用程序,并在结尾展示了如何使用Redis去构建一个简单的社交网站。第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。

㈤ 如何使用SHELL编写redis的启动脚本

#!/bin/bash
#
# Init file for redis
# From: JC
# Email:[email protected]
# chkconfig: - 80 12
# description: redis daemon
#
# processname: redis
# config: /opt/redis-2.6.4/redis.conf
# pidfile: /var/run/redis.pid

source /etc/init.d/functions

BIN="/opt/redis/bin"
CONFIG="/opt/redis-2.6.4/redis.conf"
PIDFILE="/var/run/redis.pid"

### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"

RETVAL=0
prog="redis-server"
desc="Redis Server"

start() {

if [ -e $PIDFILE ];then
echo "$desc already running...."
exit 1
fi

echo -n $"Starting $desc: "
daemon $BIN/$prog $CONFIG &

RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}

stop() {
echo -n $"Stop $desc: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
return $RETVAL
}

restart() {
stop
start
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[ -e /var/lock/subsys/$prog ] && restart
RETVAL=$?
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=1
esac

exit $RETVAL

[root@dg-web opt]# /etc/init.d/redis status
redis-server (pid 26147) is running...
[root@dg-web opt]# netstat -lntp|grep redis-server
URL:http://www.bianceng.cn/database/MySQL/201410/46081.htm
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 26147/redis-server
[root@dg-web opt]# /etc/init.d/redis stop
Stop Redis Server: [ OK ]
[root@dg-web opt]# /etc/init.d/redis status
redis-server is stopped
[root@dg-web opt]# netstat -lntp|grep redis-server

㈥ 如何高效地向Redis写入大量的数据

具体实现步骤如下:
1. 新建一个文本文件,包含redis命令
SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN
如果有了原始数据,其实构造这个文件并不难,譬如shell,python都可以
2. 将这些命令转化成Redis Protocol。
因为Redis管道功能支持的是Redis Protocol,而不是直接的Redis命令。
如何转化,可参考后面的脚本。
3. 利用管道插入
cat data.txt | redis-cli --pipe
Shell VS Redis pipe
下面通过测试来具体看看Shell批量导入和Redis pipe之间的效率。
测试思路:分别通过shell脚本和Redis pipe向数据库中插入10万相同数据,查看各自所花费的时间。
Shell
脚本如下:
#!/bin/bash
for ((i=0;i<100000;i++))
do
echo -en "helloworld" | redis-cli -x set name$i >>redis.log
done
每次插入的值都是helloworld,但键不同,name0,name1...name99999。
Redis pipe
Redis pipe会稍微麻烦一点
1> 首先构造redis命令的文本文件
在这里,我选用了python
#!/usr/bin/python
for i in range(100000):
print 'set name'+str(i),'helloworld'
# python 1.py > redis_commands.txt
# head -2 redis_commands.txt
set name0 helloworld
set name1 helloworld
2> 将这些命令转化成Redis Protocol
在这里,我利用了github上一个shell脚本,
#!/bin/bash
while read CMD; do
# each command begins with *{number arguments in command}\r\n
XS=($CMD); printf "*${#XS[@]}\r\n"
# for each argument, we append ${length}\r\n{argument}\r\n
for X in $CMD; do printf "\$${#X}\r\n$X\r\n"; done
done < redis_commands.txt
# sh 20.sh > redis_data.txt
# head -7 redis_data.txt
*3
$3
set
$5
name0
$10
helloworld
至此,数据构造完毕。
测试结果

㈦ 如何在linux中查询redis的数据

1、执行如图是命令,查看redis服务是否启动。

㈧ redis 执行 xxx.luaxxx.lua 脚本如何传参数。格式是什么

在Redis中执行Lua脚本有两种方法:eval和evalsha
1.eval
eval 脚本内容 key个数 key列表 参数列表
如果Lua脚本较长,还可以使用redis-cli-eval直接执行文件。
客户端如果想执行Lua脚本,首先在客户端编写好Lua脚本代码,然后把脚本作为字符串发送给服务端,服务端会将执行结果返回给客户端。
2.evalsha
将Lua脚本加载到Redis服务端,得到该脚本的sha1校验和,evalsha命令使用sha1作为参数可以直接执行对应的Lua脚本,避免每次发送Lua脚本的开销。这样客户端就不需要每次执行脚本内容,而脚本也会常驻在服务端,脚本内容得到了复用。
加载脚本: script load命令可以将脚本内容加载到Redis内存中。
lua的Redis API
lua可以使用redis.call函数实现对Redis的访问
redis.call(“set”,”hello”,”world”)
redis.call(“get”,”hello”)
除此之外Lua还可以使用redis.pcall函数实现对Redis的调用,redis.call和redis.pcall的不同在于,如果redis.call执行失败,那么脚本执行结束会直接返回错误,而redis.pcall会忽略错误继续执行脚本。
Lua脚本功能为Redis开发和运维人员带来的如下三个好处:
1.Lua脚本在Redis中是原子执行的,执行过程中间不会插入其他命令。
2.Lua脚本可以帮助开发和运维人员创造出自己定制的命令,并可以将这些命令常驻在Redis内存中,实现复用的效果。
3.Lua脚本可以将多条命令一次性打包,有效地减少网络开销。
Redis如何管理Lua脚本
1.script load
此命令用于将Lua脚本加载到Redis内存中
2.script exists
scripts exists sha1 [sha1 …]
此命令用于判断sha1是否已经加载到Redis内存中
3.script flush
此命令用于清除Redis内存已经加载的所有Lua脚本,在执行script flush后,sha1不复存在。
4.script kill

㈨ redis lua脚本有什么用

主要用途是: (1)描述界面:WOW和剑网三的界面都是用LUA写的; (2)沟通引擎:游戏图形引擎提供了一些接口库,可以在LUA中调用; (3)服务器端:有些游戏,例如剑网三,在服务器端也会大量使用LUA。

㈩ linux怎么用脚本一次性启动多个redis实例

需在同一台机器上启动Redis的多个实例,将其当作不同的服务器即可。单一的实例在某些时候可能是不够用的,所以如果想使用多个CPU,这就需要开始思 考早期的一些数据段。这里需要注意的是,使用Redis Pipelining在Linux系统上运行,每秒可以提供5.

热点内容
war3存储空间不足 发布:2024-04-28 13:20:54 浏览:949
微信密码已经忘记了如何找回 发布:2024-04-28 11:54:13 浏览:304
腾讯云服务器可以备案几个网站 发布:2024-04-28 11:54:12 浏览:458
影响编译速度的因素有哪些 发布:2024-04-28 11:53:58 浏览:255
安全配置汽车有哪些 发布:2024-04-28 11:48:07 浏览:830
存储链路中断 发布:2024-04-28 11:11:39 浏览:734
安卓锤子手机怎么改文字 发布:2024-04-28 11:09:52 浏览:100
列举贪心算法 发布:2024-04-28 10:44:15 浏览:698
文具店疫情演练脚本 发布:2024-04-28 10:23:40 浏览:25
绿色商城源码 发布:2024-04-28 10:04:45 浏览:587