2013-12-19

SSDB 支持 TTL 过期机制

Views: 60021 | 22 Comments

从 SSDB 1.6.7 版本开始, 增加了 Key 过期功能, 可以支持 Key 到期自动删除, 这样, SSDB 就可以作为一个持久化的缓存服务来使用. 该功能和 Redis 的 ttl/expire 一样, 使用方法是:

$ssdb->setx('key', 'value', 60);

这段代码表示, 设置 key=value, 同时到 60 秒后, 自动删除 key. 需要注意的是, TTL 只支持 KV 数据结构, hash(map) 和 zset 不支持.

下载 SSDB NoSQL 数据库源码: https://github.com/ideawu/ssdb

Related posts:

  1. SSDB 1.6.6 稳定版发布, 支持 hclear/zclear
  2. 单实例支撑每天上亿个请求的SSDB
  3. SSDB 采用里程碑式版本发布机制
  4. SSDB 支持 Snappy 压缩了
Posted by ideawu at 2013-12-19 13:28:40 Tags: , ,

22 Responses to "SSDB 支持 TTL 过期机制"

  • @ideawu

    $ssdb->setx(‘key1′, ‘value1′, 60); // 10:30:00 十点三十分零秒
    // 过了30秒再对同一key执行TTL和value更新 即:10:30:30
    $ssdb->setx(‘key1′, ‘value2′, 120);

    Key1的TTL会被重置120秒超时吗? 并且value会更新? 谢谢! Reply
  • 你好。请问关于ssdb过期的支持。我看代码的实现方式好像是有一个ExpirationHandler,在内存中维护着一个可能过期的key,如果过期,会有线程把这些过期的key删除掉。但是如果ssdb发生重启,请问ExpirationHandler从哪里初始化这些过期的key呢?好像引擎中过期的key也没有特殊字段吧? Reply
    @mhtest: 哦,是有一个内置的list,key为EXPIRATION_LIST_KEY,里面保存着所有具备过期功能的key,对吧? Reply
    @mhtest: 呵呵, 你自己找到了! 没错, 就是这个. Reply
  • 你好,能不能增加支持CAS的接口,比如说:
    1、获取value值,同时将value置0;
    2、只能当value等于某值时才对value赋值。
    我花了两天看了你的源码,里面似乎是用一个单线程在操作leveldb库,如果能在底层完成这个功能应该不太困难,嘿嘿,希望能得到作者ideawu的回复,谢啦。 Reply
    @Aegsea: Hi, CAS 的接口是什么意思? 能否解释下? Reply
    @ideawu:
    Hi,CAS我指的是Compare & Set操作,我的需求需要这样的功能:
    第一种情况,通过key获取value值,同时将value置0,这是一个原子操作
    第二种情况,只能当value等于某值时才对value赋值,否则不赋值,这也是一个原子操作

    因为我现在已经在项目中运用了你的SSDB,非常稳定,但现在想增加一点新的需求,需要用到上面两个类似功能,但好像目前的接口实现不了,最后花了些时间研究了下你的源码,觉得写的非常的棒,非常感谢你对开源做的贡献。你的架构中加入这样的功能也不太复杂,希望你能把我的建议做个考虑。 Reply
    @Aegsea: 好的, 你提的这个功能很有用. 你到 github 上提一个 issue, 记录一下, 我实现后, 也可在那个 issue 里回复你. 谢谢你使用 SSDB, 你可以给我发邮件, 简单介绍下你们使用 SSDB 的情况. Reply
    @ideawu:
    你好,我已经在github上提了issue,希望ssdb做的越来越好。 Reply
  • 你好,能不能增加支持CAS的接口,比如说:
    1、获取value值,同时将value置0;
    2、只能当value等于某值时才对value赋值。 Reply
  • 怎么获取某个值的ttl呢? Reply
  • 感谢作者,我最近需要一个简单的支持持久化的队列,没找到合适的。看ssdb代码写的不错,就直接采用现有的hash写了一个队列。目前支持qoffer,qpoll,qpeek,qsize几个操作,测试了一下,服务器实现比在客户端的实现性能提高了一倍,而且线程安全。核心思想就是队列名就是hash的名称,hash中放了tail,head两个变量,用于存储队列的头尾的索引,然后以数字为key存储所有放入队列的东西。这几天正在测试,测试好了,我会提交代码。 Reply
    @大飞: 嗯, 不错! 期待你的代码. 不过, 我提几个建议:

    1. 可以不用设置 tail, head 两个变量, 因为 hash 是按 key 排序的, 第一个元素和最后一个元素是隐含的.

    2. 我觉得命令名可以参考 C++ STL queue, 改为 qpush, qpop, qback, qfront, qsize.

    3. 用 hash 来实现队列, 这个思路不错! Reply
    @ideawu: 我是按照java的习惯命名的。呵呵。你说hash是按key排序的,怎么获得第一个和最后一个元素呢?有方法吗? Reply
    @大飞: 用 hscan/hrscan 即可. Reply
    @ideawu: 代码已经pull requests。请查收github,我觉得c++中的命名与实现的语义不符,所以仍旧采用offer,poll,peek命名,另外没有用hscn和hrsan操作,对于一个队列来说,tail和head的存储空间应该是可以容忍的。直接操作tail和head应该性能更好一些,个人认为,也许不对。先提交一个可以用的版本,以后再优化吧。 Reply
  • 感谢作者。支持 ttl 过期后,我的存储空间可以缩小不少。同时程序代码可以减少一些。 Reply
  • 1.6.6 可以正常安装。 刚下载了 1.6.7 版,这回出错在 make 这步。
    g++ -o ../ssdb-server ssdb-server.o ssdb.o t_kv.o t_hash.o t_zset.o link.o backend_dump.o backend_sync.o slave.o binlog.o serv.o iterator.o ttl.o util/log.o util/fde.o util/config.o util/bytes.o -pthread "/home/wen130/ssdb-stable-1.6.7/deps/leveldb-1.14.0/libleveldb.a" "/home/wen130/ssdb-stable-1.6.7/deps/snappy-1.1.0/.libs/libsnappy.a" "/home/wen130/ssdb-stable-1.6.7/deps/jemalloc-3.3.1/lib/libjemalloc.a"
    g++: error: /home/wen130/ssdb-stable-1.6.7/deps/snappy-1.1.0/.libs/libsnappy.a: No such file or directory
    make[1]: *** [all] Error 1
    make[1]: Leaving directory `/home/wen130/ssdb-stable-1.6.7/src’
    make: *** [all] Error 2 Reply
    @一介布衣: Hi, 应该是你的环境不干净. 可以重新下载一份源码, 或者 cd deps/jemalloc-3.3.1; make; 手动编译一下 jemalloc. Reply
  • 安装出错,请求指点。
    执行:make install PREFIX=/home/ssdb/
    显示信息如下
    mkdir -p /home/ssdb/
    mkdir -p /home/ssdb//_cpy_
    mkdir -p /home/ssdb//deps
    mkdir -p /home/ssdb//var
    mkdir -p /home/ssdb//var_slave
    cp ssdb-server ssdb.conf ssdb_slave.conf /home/ssdb/
    cp -r api /home/ssdb/
    cp -r \
    tools/ssdb-bench tools/ssdb-cli \
    tools/ssdb-cli.cpy tools/ssdb-dump \
    tools/ssdb-repair \
    tools/ssdb-startup.sh tools/unittest.php \
    /home/ssdb/
    cp: cannot stat `tools/ssdb-startup.sh': No such file or directory
    make: *** [install] Error 1 Reply
    @一介布衣: Hi, 麻烦更新下代码, 之前的版本的安装脚本有个bug. Reply
    补充我的操作系统环境为 Linux debian 3.2.0-4-486 #1 Debian 3.2.51-1 i686 GNU/Linux Reply

Leave a Comment