### Question:
RKv extends RBase { public void ttl(String key, int ttl) throws KitDBException { checkTxStart(); try (CloseLock ignored = checkClose()) { byte[] keyb = getKey(key); LockEntity lockEntity = lock.lock(key); try { start(); byte[] key_b = ArrayKits.addAll(HEAD_B, keyb); int time = (int) (System.currentTimeMillis() / 1000) + ttl; putDB(ArrayKits.addAll(HEAD_TTL, keyb), ArrayKits.intToBytes(time), SstColumnFamily.DEFAULT); setTimer(KeyEnum.KV_TIMER, time, key_b); commit(); } finally { lock.unlock(lockEntity); release(); } checkTxCommit(); } catch (Exception e) { checkTxRollBack(); throw e; } } protected  RKv(DB db); void set(String key, byte[] value); long incr(String key, int step, int ttl); long incr(String key, int step); void set(Map<String, byte[]> map); void set(Map<String, byte[]> map, int ttl); void set(String key, byte[] value, int ttl); void ttl(String key, int ttl); Map<String, byte[]> get(List<String> keys); byte[] get(String key); byte[] getNoTTL(String key); void del(String key); void delPrefix(String key_); List<String> keys(String key_, int start, int limit); final static String HEAD; final static byte[] HEAD_TTL; final static byte[] HEAD_B; }### Answer:
@Test public void ttl() throws Exception { RKv kv = db.getrKv(); String head = "ttlA"; try { for (int i = 0; i < 1000; i++) { kv.set(head + i, ("test" + i).getBytes()); } for (int i = 0; i < 1000; i++) { byte[] bytes = kv.get(head + i); Assert.assertArrayEquals(bytes, ("test" + i).getBytes()); } for (int i = 0; i < 1000; i++) { kv.ttl(head + i, 1); } for (int i = 0; i < 1000; i++) { byte[] bytes = kv.get(head + i); Assert.assertArrayEquals(bytes, ("test" + i).getBytes()); } for (int i = 0; i < 1000; i++) { kv.ttl(head + i, 4); } Thread.sleep(3 * 1000); for (int i = 0; i < 1000; i++) { byte[] bytes = kv.get(head + i); Assert.assertArrayEquals(bytes, ("test" + i).getBytes()); } Thread.sleep(1 * 1000); for (int i = 0; i < 1000; i++) { byte[] bytes = kv.get(head + i); Assert.assertNull(bytes); } } finally { kv.delPrefix(head); } }