点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
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 then redis.call('SET', key, new_value) return 1 else return 0 end
案例3:列表的批量插入
local key = KEYS[1] local elements = {} for i = 1, #ARGV do table.insert(elements, ARGV[i]) end redis.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 then redis.call('DEL', key) end return value
案例4:哈希表字段的批量设置
local key = KEYS[1] for i = 1, #ARGV, 2 do redis.call('HSET', key, ARGV[i], ARGV[i+1]) end return redis.call('HGETALL', key)