点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop(已更完)
- HDFS(已更完)
- MapReduce(已更完)
- Hive(已更完)
- Flume(已更完)
- Sqoop(已更完)
- Zookeeper(已更完)
- HBase(已更完)
- Redis (正在更新…)
章节内容
上一节我们完成了如下的内容:
- Redis功能扩展
- Redis发布/订阅模式
- Redis 事务相关
- Redis 为什么是弱事务
- 等等
背景介绍
这里是三台公网云服务器,每台 2C4G,搭建一个大数据的学习环境,供我学习。
之前已经在 VM 虚拟机上搭建过一次,但是没留下笔记,这次趁着前几天薅羊毛的3台机器,赶紧尝试在公网上搭建体验一下。
- 2C4G 编号 h121
- 2C4G 编号 h122
- 2C2G 编号 h123
Lua 介绍
简介一下
Lua是一个轻量小巧的脚本语言,用标准的C语言编写并且开源。
应用场景有:
- 游戏开发
- 独立应用脚本
- Web应用脚本
- 数据库插件
下载安装
# 下载页面
http://www.lua.org/download.html
# 下载地址
https://www.lua.org/ftp/lua-5.4.7.tar.gz
EVAL
EVAL script numkeys key [key ...] arg [arg ...]
上述参数说明:
- script:一段Lua脚本程序,它会被运行在Redis服务器的上下文中
- numkeys:用于指定键名参数的个数
- key:从eval的第三个参数开始算起,使用了numkeys个键,表示在脚本中所用到的那些Redis键。
- arg:可以在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似 ARGV[1]、ARGV[2]等
我们可以通过这样的方式来调用它:
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
redis.call
- 返回值就是Redis命令执行的返回值
- 如果出错,会返回出错信息,不继续执行
redis.pcall
- 返回值就是Redis命令执行的返回值
- 如果出错,会记录错误信息,继续执行
EVALSHA
eval命令要求你在每次执行脚本的时候都发送一次脚本主体(Script Body)
Redis有一个内部缓存机制,因此它不会每次都重新编译脚本。为了减少贷款消耗,Redis实现了 EVALSHA,它接收的第一个参数不是脚本,而是脚本的 SHA1校验。
Script命令
- Script Flush 清除所有脚本缓存
- Script Exists 根据给定的脚本校验和,检查指定脚本是否存在于缓存脚本中
- Script Load 将一个脚本装入脚本缓存 返回SHA1摘要 但并不立即运行
- Script Kill 杀死当前正在运行的脚本
脚本测试1
编写一个脚本
vim /opt/wzk/test01.lua
写入如下内容
return redis.call('set',KEYS[1],ARGV[1])
保存后,执行Shell命令
./redis-cli --eval /opt/wzk/test01.lua name , kangkang
脚本测试2
编写脚本
vim /opt/wzk/test02.lua
写入如下内容
local key=KEYS[1]
local list=redis.call("lrange",key,0,-1);
return list;
保存后,执行Shell命令
./redis-cli --eval /opt/wzk/test02.lua list
执行的结果如下图:
案例1:原子计数器
脚本将实现将键的值+1,然后返回更新的值:
local key = KEYS[1]
local increment = tonumber(ARGV[1])local current = tonumber(redis.call('GET', key) or 0)
local new_value = current + increment
redis.call('SET', key, new_value)return new_value
案例2:检查并设置值
如果键的值等于给定的旧值,则将其设置为新值
local key = KEYS[1]
local old_value = ARGV[1]
local new_value = ARGV[2]if redis.call('GET', key) == old_value thenredis.call('SET', key, new_value)return 1
elsereturn 0
end
案例3:列表的批量插入
local key = KEYS[1]
local elements = {}for i = 1, #ARGV dotable.insert(elements, ARGV[i])
endredis.call('LPUSH', key, unpack(elements))
return redis.call('LRANGE', key, 0, -1)
案例3:获取并删除键值对
local key = KEYS[1]
local value = redis.call('GET', key)if value thenredis.call('DEL', key)
endreturn value
案例4:哈希表字段的批量设置
local key = KEYS[1]for i = 1, #ARGV, 2 doredis.call('HSET', key, ARGV[i], ARGV[i+1])
endreturn redis.call('HGETALL', key)