Операция истечения срока действия значения ключа в Redis

Java Redis
Операция истечения срока действия значения ключа в Redis

1. Настройки срока действия

Существует четыре основных способа установить время истечения срока действия в Redis:

  • истекает срок действия ключа в секундах: установите срок действия ключа через n секунд;
  • pexpire key milliseconds: установите срок действия ключа через n миллисекунд;
  • expireat key timestamp: установить срок действия ключа после определенной временной метки (с точностью до секунд);
  • pexpireat key millisecondsTimestamp: установите срок действия ключа после определенной временной метки (с точностью до миллисекунд);

Следующая конкретная реализация этих команд более перспективы.

1) expire: истекает через N секунд

127.0.0.1:6379> set key value
OK
127.0.0.1:6379> expire key 100
(integer) 1
127.0.0.1:6379> ttl key
(integer) 97

где командаttlПолное имяTime To LiveУказывает, что срок действия этого значения ключа истекает через n секунд. Например, результат выше97 ВыражатьkeyИстекает через 97 с.

2) pexpire: истекает через N миллисекунд

127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> pexpire key2 100000
(integer) 1
127.0.0.1:6379> pttl key2
(integer) 94524

вpexpire key2 100000Указывает настройкиkey2Истекает через 100000 миллисекунд (100 секунд).

3) expireat: отметка времени истечения срока действия с точностью до секунд

127.0.0.1:6379> set key3 value3
OK
127.0.0.1:6379> expireat key3 1573472683
(integer) 1
127.0.0.1:6379> ttl key3
(integer) 67

вexpireat key3 1573472683 Выражатьkey3по отметке времени1573472683После истечения срока действия (с точностью до секунды) используйтеttlЗапрос можно найти после 67 сек.key3истечет.

Советы. В Redis вы можете использовать команду time для запроса временной метки текущего времени (с точностью до секунд), например: 127.0.0.1:6379>время

  1. "1573472563"
  2. "248426"

4) pexpireat: отметка времени истечения с точностью до миллисекунд

127.0.0.1:6379> set key4 value4
OK
127.0.0.1:6379> pexpireat key4 1573472683000
(integer) 1
127.0.0.1:6379> pttl key4
(integer) 3522

вpexpireat key4 1573472683000 Выражатьkey4по отметке времени1573472683000По истечении срока действия (с точностью до миллисекунд) используйтеttlЗапрос можно найти через 3522 мсkey4истечет.

5) Операции истечения срока действия в строках

Несколько методов для прямого управления временем истечения срока действия в строке перечислены ниже:

  • установить значение ключа в секундах: укажите время истечения срока действия (с точностью до секунд) при установке пары ключ-значение;
  • Установить значение ключа EX MilliseConds: установка значения ключа для указания времени истечения срока действия (с точностью до миллисекунд);
  • setex key second value: Укажите время истечения срока действия (с точностью до секунд) при установке пары ключ-значение.

Пример реализации следующий:

① установить значение ключа в секундах

127.0.0.1:6379> set k v ex 100
OK
127.0.0.1:6379> ttl k
(integer) 97

② установить значение ключа в миллисекундах

127.0.0.1:6379> set k2 v2 px 100000
OK
127.0.0.1:6379> pttl k2
(integer) 92483

③ Значение секунд ключа setex

127.0.0.1:6379> setex k3 100 v3
OK
127.0.0.1:6379> ttl k3
(integer) 91

2. Удалить время истечения

Используйте команду:persist keyВремя истечения срока действия значения ключа можно удалить, как показано в следующем коде:

127.0.0.1:6379> ttl k3
(integer) 97
127.0.0.1:6379> persist k3
(integer) 1
127.0.0.1:6379> ttl k3
(integer) -1

Видно, что первое использованиеttlЗапросk3истекает через 97 сек. при использованииpersistПосле команды в запросеk3Время жизни для равно -1, что означаетk3Никогда не заканчивается.

3. Java реализует операцию истечения срока действия

В этой статье будет использоваться платформа Jedis для реализации операции времени истечения срока действия Redis, как показано в следующем коде:

public class TTLTest {
    public static void main(String[] args) throws InterruptedException {
        // 创建 Redis 连接
        Jedis jedis = new Jedis("xxx.xxx.xxx.xxx", 6379);
        // 设置 Redis 密码(如果没有密码,此行可省略)
        jedis.auth("xxx");
        // 存储键值对(默认情况下永不过期)
        jedis.set("k", "v");
        // 查询 TTL(过期时间)
        Long ttl = jedis.ttl("k");
        // 打印过期日志
        System.out.println("过期时间:" + ttl);
        // 设置 100s 后过期
        jedis.expire("k", 100);
        // 等待 1s 后执行
        Thread.sleep(1000);
        // 打印过期日志
        System.out.println("执行 expire 后的 TTL=" + jedis.ttl("k"));
    }
}

Результат выполнения программы:

Срок годности: -1 TTL=99 после выполнения expire

Видно, что очень удобно использовать Jedis для манипулирования временем истечения срока действия Redis, которое можно использовать напрямуюjedis.ttl("k")Чтобы запросить время жизни значения ключа, используйтеjedis.expire("k",seconds)Способ установки времени экспирации (с точностью до секунды).

Советы: Прежде чем использовать Jedis, сначала введите Jedis в программу.Если вы используете проект Maven, добавьте следующую ссылку непосредственно в файл pom.xml:

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>version</version>
</dependency>

Дополнительные методы истечения срока действия, следующий список:

  • pexpire(строковый ключ, длинные миллисекунды): срок действия истекает через n миллисекунд;
  • expireAt(String key, long unixTime): истекает после установки метки времени (с точностью до секунд);
  • Pexpireat (строковый ключ, Long MilliseCondstimeStamp): устанавливает метку времени перед расширением (с точностью до миллисекунд);
  • persist(строковый ключ): удалить время истечения срока действия.

Полный пример кода выглядит следующим образом:

public class TTLTest {
    public static void main(String[] args) throws InterruptedException {
        // 创建 Redis 连接
        Jedis jedis = new Jedis("xxx.xxx.xxx.xxx", 6379);
        // 设置 Redis 密码(如果没有密码,此行可省略)
        jedis.auth("xxx");
        // 存储键值对(默认情况下永不过期)
        jedis.set("k", "v");
        // 查询 TTL(过期时间)
        Long ttl = jedis.ttl("k");
        // 打印过期日志
        System.out.println("过期时间:" + ttl);
        // 设置 100s 后过期
        jedis.expire("k", 100);
        // 等待 1s 后执行
        Thread.sleep(1000);
        // 打印过期日志
        System.out.println("执行 expire 后的 TTL=" + jedis.ttl("k"));
        // 设置 n 毫秒后过期
        jedis.pexpire("k", 100000);
        // 设置某个时间戳后过期(精确到秒)
        jedis.expireAt("k", 1573468990);
        // 设置某个时间戳后过期(精确到毫秒)
        jedis.pexpireAt("k", 1573468990000L);
        // 移除过期时间
        jedis.persist("k");
    }
}

4. Просроченные ключи в постоянстве

Выше мы говорили о некоторых случаях использования ключей с истекшим сроком действия в обычной работе Redis, а теперь давайте посмотрим, как Redis обрабатывает ключи с истекшим сроком действия в процессе персистентности. Существует два формата постоянных файлов Redis: RDB (база данных Redis) и AOF (файл только для добавления). Давайте посмотрим на статус представления ключей с истекшим сроком действия в этих двух форматах.

1) Просроченные ключи в RDB

Файлы RDB делятся на две фазы: фазу генерации файла RDB и фазу загрузки.

① Генерация файла RDB

Сохранение в RDB (файлы) из памяти, когда состояние будет проверяться с истекшим сроком действия ключа, ключи с истекшим сроком действия не сохраняются в новый файл RDB, поэтому Redis ключей с истекшим сроком действия не окажет никакого влияния на создание нового файла RDB.

② Загрузка файла RDB

Загрузка RDB делится на следующие два случая:

  • Если основным режимом работы сервера является Redis, при загрузке RDB-файла программа будет проверять ключи, сохраненные в файле, и ключи с истекшим сроком действия не будут загружены в базу данных. Таким образом, ключ с истекшим сроком действия не повлияет на основной сервер, загружающий файл RDB;
  • Если Redis работает в подчиненном режиме, при загрузке файла RDB ключ будет загружен в базу данных независимо от того, истек ли срок действия ключа. Однако, когда ведущий-ведомый сервер синхронизирует данные, данные подчиненного сервера будут очищены. Таким образом, ключ с истекшим сроком действия не повлияет на подчиненный сервер, загружающий файл RDB.

Исходный код загрузки файла RDB можно найти в функции rdbLoad() файла rdb.c, как показано в исходном коде:

/* Check if the key already expired. This function is used when loading
* an RDB file from disk, either at startup, or when an RDB was
* received from the master. In the latter case, the master is
* responsible for key expiry. If we would expire keys here, the
* snapshot taken by the master may not be reflected on the slave. 
*
* 如果服务器为主节点的话,
* 那么在键已经过期的时候,不再将它们关联到数据库中去
*/
if (server.masterhost == NULL && expiretime != -1 && expiretime < now) {
    decrRefCount(key);
    decrRefCount(val);
    // 跳过
    continue;
}

2) AOF с истекшим ключами

① Запись файла AOF

Когда Redis сохраняется в режиме AOF, если ключ с истекшим сроком действия в базе данных не был удален, файл AOF сохранит ключ с истекшим сроком действия.Когда ключ с истекшим сроком действия удален, Redis добавит команду DEL к файлу AOF, чтобы явно удалить ключ ценность.

② Переписать AOF

При перезаписи AOF проверяются пары ключ-значение в Redis. Ключи с истекшим сроком действия не будут сохранены в перезаписанном файле AOF, поэтому это не повлияет на перезапись AOF.

5. Ключ истечения срока действия библиотеки master-slave

Когда Redis работает в режиме Master-Slave, ведомая библиотека не выполняет сканирование срока действия, а ведомая библиотека передает истечении срока действия. То есть, даже если ключевой в ведомой библиотеке истекает, если клиент обращается к ведомому библиотеку, значение, соответствующее ключу, все еще можно получить, который возвращается как нерешенное значение ключа.

Ключевой банк истек из лечения, опирается на первичное управление сервером, главная библиотека в ключевых условиях истекает, увеличит файл Directive DEL AOF, синхронизированную всем из библиотеки, из библиотеки, выполнив эту команду, чтобы удалить истекю ключ.

6. Резюме

В этой статье мы знаем четыре способа установить время истечения срока действия в Redis: expire, pexpire, expireat, pexpireat, среди которых наиболее часто используемый expire — установить значение ключа на истечение через n секунд.

В строке вы можете установить время истечения срока действия при добавлении значения ключа, и вы можете использовать команду persist для удаления времени истечения срока действия. В то же время мы также знаем, что ключ с истекшим сроком действия не будет записан во время записи RDB и перезаписи AOF.

Ключи с истекшим сроком действия В режиме ведущий-ведомый обработка ключей с истекшим сроком действия в ведомой библиотеке полностью зависит от главной библиотеки.После того как главная библиотека удалит ключ с истекшим сроком действия, она отправит команду del всем подчиненным библиотекам.

Знания этой статьи показаны на следующем рисунке:

image.png

7. Цитаты и благодарности

сегмент fault.com/ah/119000001…

Блог Woohoo.cn на.com/Luxing King/Afraid…

Следуйте QR-коду ниже, чтобы подписаться на более интересный контент.

Java中文社群公众号二维码