Почему многопоточность появилась после Redis 6.0? Почему многопоточность не использовалась до версии 6.0?

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

Однако по мере того, как сценарии приложений Redis становятся все более и более обширными, а объем данных и параллелизм также увеличиваются, однопоточная модель больше не может удовлетворить спрос. Поэтому в Redis 6.0 была введена многопоточная модель для повышения производительности и параллелизма Redis. Многопоточная модель может в полной мере использовать преимущества многоядерных ЦП для повышения вычислительной мощности и пропускной способности Redis. В то же время многопоточная модель в Redis 6.0 использует дизайн без блокировок, что позволяет избежать накладных расходов на конкуренцию блокировок и переключение потоков, тем самым обеспечивая высокую производительность и высокий уровень параллелизма Redis.

Как включить многопоточный режим в Redis

Для включения многопоточного режима Redis необходимо задать io-threads-do-readsпараметр yes, и с помощью --threads <num>параметра . Например, чтобы запустить экземпляр Redis с 4 потоками, вы можете использовать следующую команду:

redis-server --threads 4 /path/to/redis.conf

Следует отметить, что многопоточный режим Redis в настоящее время поддерживает только некоторые команды, такие как команды чтения (GET, HGET, LRANGE и т. д.), в то время как команды записи (SET, HSET, LPUSH и т. д.) по-прежнему находятся в однопоточном режиме. режим. Поэтому при использовании многопоточного режима необходимо тестировать и оценивать в соответствии с реальной ситуацией, чтобы определить, можно ли улучшить производительность и параллелизм Redis.

Общие команды Redis

Redis — это высокопроизводительная система хранения ключей и значений на основе памяти, которая часто используется в таких сценариях, как кеш, очередь сообщений и счетчик. Ниже приведены общие команды для Redis:

  1. SET key value: Установите значение указанного ключа в значение.

  2. Ключ GET: получить значение указанного ключа.

  3. Клавиша DEL: удалить указанный ключ.

  4. Ключ INCR: добавьте 1 к значению указанного ключа.

  5. Ключ DECR: уменьшение на 1 значения указанного ключа.

  6. EXPIRE key second: Установите время истечения срока действия указанного ключа в секундах.

  7. Ключ TTL: Получите оставшееся время истечения срока действия указанного ключа.

  8. Ключ EXISTS: определить, существует ли указанный ключ.

  9. Шаблон KEYS: найти все ключи, соответствующие заданному шаблону шаблона.

  10. Значение поля ключа HSET: установите значение данного поля поля в хэш-таблице указанного ключа в значение.

  11. Ключевое поле HGET: получить значение данного поля поля в хэш-таблице указанного ключа.

  12. Ключ HMSET поле1 значение1 поле2 значение2 ...: одновременно установить несколько полей хэш-таблицы указанного ключа.

  13. Ключ HMGET поле1 поле2...: получить значения нескольких полей хэш-таблицы указанного ключа.

  14. LPUSH ключ значение1 значение2...: Вставить одно или несколько значений в начало списка.

  15. Ключ RPUSH значение1 значение2 ...: Вставьте одно или несколько значений в конец списка.

  16. Ключ LPOP: удалить и вернуть первый элемент списка.

  17. Ключ RPOP: удалить и вернуть последний элемент списка.

  18. Клавиша LRANGE start stop: Получить элементы в указанном диапазоне в списке.

  19. Ключ SADD элемент1 элемент2 ...: Добавляет один или несколько элементов в набор.

  20. Ключ SMEMBERS: получить всех членов коллекции.

Выше приведены некоторые примеры распространенных команд Redis.В Redis есть много других команд, которые можно выбирать и использовать в соответствии с реальными потребностями.

Redis в сочетании с springboot для кеша подкачки

Как Springboot объединяет Redis для кэширования данных подкачки — очень распространенный сценарий.Если объем данных большой, необходимо кэшировать данные подкачки.

Объединение Redis в Spring Boot для кэширования данных подкачки может быть выполнено с помощью следующих шагов:

  1. Добавьте связанные с Redis зависимости в файл pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. Настройте информацию о соединении Redis в файле application.properties:

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
  1. Создайте объект RedisTemplate для работы с кешем Redis:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}
  1. На уровне службы используйте объект RedisTemplate для операций кэширования. Например, для операций запроса на разбиение на страницы можно кэшировать результаты запроса в Redis, получать данные из Redis в следующем запросе, если его нет в кеше, выполнять запрос к базе данных и кэшировать результаты запроса в Redis:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private UserDao userDao;

    @Override
    public List<User> getUsersByPage(int pageNum, int pageSize) {
        String key = "user:page:" + pageNum + ":" + pageSize;
        List<User> users = (List<User>) redisTemplate.opsForValue().get(key);
        if (users == null) {
            PageHelper.startPage(pageNum, pageSize);
            users = userDao.getUsers();
            PageInfo<User> pageInfo = new PageInfo<>(users);
            redisTemplate.opsForValue().set(key, pageInfo, 1, TimeUnit.MINUTES);
        }
        return users;
    }
}

В приведенном выше коде подключаемый модуль PageHelper используется для запроса разбиения на страницы, а результат запроса кэшируется в Redis на 1 минуту. В следующем запросе, если в кеше есть данные, они будут получены напрямую из кеша, избегая частых операций запроса к БД.

Выше приведен метод реализации Spring Boot в сочетании с Redis для кэширования данных подкачки. Следует отметить, что для кэшированных данных необходимо установить время истечения срока действия в соответствии с реальной ситуацией, чтобы избежать использования кэшированных данных после истечения срока их действия.

Однако с приведенным выше кодом все еще есть проблемы: что, если данные страницы изменятся, redis все равно получит старые данные!

Поэтому нам нужно обновлять данные в кеше при обновлении данных.

おすすめ

転載: blog.csdn.net/weixin_39570751/article/details/130866012