赞
踩
# 指定用户 user_id 的某个行为 action 在特定时间内 period 只允许发生该行为的最大次数 max_count # 维护一次时间窗口,将窗口外的记录全部清理掉,只保留窗口内的记录 local function is_action_allowed(red, userid, action, period, max_count) local key = tab_concat({"hist", userid, action}, ":") local now = zv.time() red:init_pipeline() -- 记录行为 red:zadd(key, now, now) -- 移除时间窗口之前的行为记录,剩下的都是时间窗口内的记录 red:zremrangebyscore(key, 0, now - period * 100) -- 获取时间窗口内的行为数量 red:zcard(key) -- 设置过期时间,避免冷用户持续占用内存 时间窗口的长度 + 1秒 red:expire(key, period + 1) local res = red:commit_pipeline() return res[3] <= max_count end
# 订阅频道 subscribe 频道 # 订阅模式频道 psubscribe 频道 # 取消订阅频道 unsubscribe 频道 # 取消订阅模式频道 punsubscribe 频道 # 发布具体频道或模式频道的内容 publish 频道 内容 # 客户端收到具体频道内容 message 具体频道 内容 # 客户端收到模式频道内容 pmessage 模式频道 具体频道 内容 subscribe news.A news.B news.C psubscribe news.* publish new.B 'zcoder is good'
# 开启事务
MUITI
# 提交事务
EXEC
# 取消事务
DISCARD
# 检测 key 对应的 value 的变动,若在事务执行中,value 变动则取消事务并返回 nil。
# 在事务开启前调用,乐观锁实现(cas)
WATCH
WATCH score
val = GET score
MULTI
SET score val * 2
EXEC
# 测试使用
EVAL script numkeys key [key ...] arg [arg ...]
# 线上使用
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
script load
加载项目中使用的 lua 脚本,script load
会返回对应 lua 脚本的 hash 值。script flush
然后可以使用订阅发布功能通知所有服务器重新加载 lua 脚本。script kill
暂停当前阻塞脚本的执行。# 从文件中读取 lua脚本内容
cat test.lua | redis-cli script load --pipe
# 加载 lua脚本字符串 生成 sha1
> script load 'local val = KEYS[1]; return val'
"b8059ba43af6ffe8bed3db65bac35d452f8115d8"
# 检查脚本缓存中,是否有该 sha1 散列值的lua脚本
> script exists "b8059ba43af6ffe8bed3db65bac35d452f8115d8"
1) (integer) 1
# 清除所有脚本缓存
> script flush
OK
# 如果当前脚本运行时间过长(死循环),可以通过 script kill杀死当前运行的脚本
> script kill
(error) NOTBUSY No scripts in execution right now.
lua 脚本满足原子性和隔离性,不满足一致性和持久性
。a. 创建 socket, 设置 fd 为非阻塞 io
b. 调用 connect(fd, &addr, &len)
c. 将 fd 注册到 epoll, 注册写事件
d. 如果连接建立成功, fd 的写事件会进行响应, 然后注销写事件
a. int n = write(fd, buf, sz)
如果 n < sz && n != -1 或者 n == -1 && errno = EWOULDBLOCK
说明 fd 对应的发送缓冲区已经满了
b. 注册写事件, 如果写事件触发, 继续 write(fd, buf, sz),
如果发送完毕, 注销写事件
c. 注册读事件
a. 读事件触发, int n = read(fd, buf, sz)
b. 根据 redis 协议分割数据包
c. 使用 redis 协议解密
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。