注册要在发生指定(redis-key,op)事件时触发的LUA脚本

时间:2017-03-28 02:26:15

标签: triggers lua redis

我可以将LUA脚本设置为关系数据库中使用的 TRIGGER 。 例如,在用密钥' TIMELIST'附加或冲到列表之后,会触发lua脚本在列表上做一些工作?

我快速浏览一下REDIS文档中的lua-script部分,发现似乎只能显式评估脚本。我的想法不可能吗?

EXT: 如果上述想法是不可能的。我应该采取什么来解决这个问题。我有一个排序列表来存储每日配额。我用

public void SwitchTheme ()
{
    if (Resources?.GetType () == typeof (DarkThemeResources))
    { 
        Resources = new LightThemeResources ();
        return;
    }
    Resources = new DarkThemeResources ();
}

添加一个新的配额,其日期为权重。我想排序列表作为有限列表,只保留最近7天'配额。我没有在正常的redis-list上使用LTRIM,因为配额在时间线上可能有 gap 。 Hash不适用,因为出于某种原因,我必须使访问REDIS的应用程序看不到TRUNCATION操作。

我是redis的新手。有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:1)

不,那是不可行的。但是,您可以轻松地使用脚本来执行操作(LPUSHZADD等)以及任何其他类似触发器的逻辑。

答案 1 :(得分:1)

您可以使用ZREMRANGEBYRANK删除旧元素。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYRANK myzset 0 1
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"
redis>

答案 2 :(得分:0)

Redis在这类“触发器”方面有了有趣的发展。您可以使用以下方法完成您想要的: Redis密钥空间通知(在发生事件时得到通知-例如向您的set / zset添加密钥)并运行内部Redis模块(版本5中的新功能) 在某些情况下会执行ZREM设置-有效地使Redis成为“触发”。

从技术上讲,您可以仅使用发送pub / sub事件的键空间通知选项(在Redis中)-但如果您没有该事件的订阅者,则可能会错过事件(Redis中的pub / sub事件并不持久)。

缺点是您将不得不用C / C ++代码编写该模块并验证其是否正常工作。