以windows版的redis为例
下载
github上下载
https://github.com/MicrosoftArchive/redis/releases
可以下载zip版本,解压到一个目录就行,例如我的目录是:D:\redis
启动
打开一个 cmd 窗口 使用 cd 命令切换目录到 D:\redis 运行如下命令即可:
redis-server.exe redis.windows.conf
如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:
这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。
切换到 redis 目录下运行:
redis-cli.exe -h 127.0.0.1 -p 6379
设置键值对:
set myKey helloworld
取出键值对:
get myKey
Redis 数据类型
Redis支持五种数据类型:<1>string(字符串),<2>hash(哈希),<3>list(列表),<4>set(集合)及<5>zset(sorted set:有序集合)。
1)String类型的操作命令
Redis 的 SET 和 GET 命令
2)hash类型的操作命令
HMSET, HGET 命令
3)list类型的操作命令
lpush,lrange 命令
4)set类型的操作命令
sadd,smembers 命令
5)zset(sorted set:有序集合)类型的操作命令
zadd命令,ZRANGEBYSCORE
常用命令
1、Expire --> expire设置过期时间的单位是秒,如设置name的过期时间为1000秒,超过时间后会自动删除key,但是不一定是立即删除,因为redis的过期策略是惰性删除和定期删除的策略。
语法格式:Expire KEY_NAME TIME_IN_SECONDS
案例:expire name 1000
redis和lua结合
1、调用Lua脚本的语法:
redis-cli.exe --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ... --键和值之间有一个逗号,不能少。
eg: d:\redis>redis-cli.exe -h localhost -p 6379 --eval d:\redis\redis.lua name age , lee
--eval,告诉redis-cli读取并运行后面的lua脚本
d:\redis\redis.lua,是lua脚本的位置
KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取。【特别注意】这些键要现在redis中存在,不然就获取不到对应的值。
ARGV[1] ARGV[2],参数在lua脚本中通过ARGV[1], ARGV[2]获取。
local name=redis.call("get",KEYS[1])
local age=redis.call("get",KEYS[2])
if name=="giaa" then --先在redis中设置以一个name且值是giaa
redis.call("set",KEYS[1],ARGV[1])
redis.call("incr",KEYS[2])
end
以上代码保存为redis.lua,并存放在d:\redis\中即可。
2、在脚本中调用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的数据类型。
3、redis命令行中的lua代码
EVAL语法: eval lua_code numkeys key [key ...] arg [arg ...]
通过key和arg这两类参数向脚本传递数据,它们的值在脚本中分别使用KEYS和ARGV两个表类型的全局变量访问。
script: 是双引号中的lua代码
numkeys:表示有几个key,分别是KEYS[1],KEYS[2]...,如果有值,从第numkeys+1个开始就是参数值,ARGV[1],ARGV[2]...
注意: EVAL命令依据参数numkeys来将其后面的所有参数分别存入脚本中KEYS和ARGV两个table类型的全局变量。当脚本不需要任何参数时,也不能省略这个参数(设为0)
eg:localhost:6379> eval "return redis.call('set',KEYS[1],ARGV[1])" 1 sex female
4、案例 使用Lua控制IP访问频率
local visitNum = redis.call('incr', KEYS[1])
if visitNum == 1 then
redis.call('expire', KEYS[1], ARGV[1])
end
if visitNum > tonumber(ARGV[2]) then
return 0
end
return 1;
## LimitIP:127.0.0.1为key, 10 3表示:同一IP在10秒内最多访问三次
## 前三次返回1,代表未被限制;第四、五次返回0,代表127.0.0.1这个ip已被拦截