До 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:
-
SET key value: Установите значение указанного ключа в значение.
-
Ключ GET: получить значение указанного ключа.
-
Клавиша DEL: удалить указанный ключ.
-
Ключ INCR: добавьте 1 к значению указанного ключа.
-
Ключ DECR: уменьшение на 1 значения указанного ключа.
-
EXPIRE key second: Установите время истечения срока действия указанного ключа в секундах.
-
Ключ TTL: Получите оставшееся время истечения срока действия указанного ключа.
-
Ключ EXISTS: определить, существует ли указанный ключ.
-
Шаблон KEYS: найти все ключи, соответствующие заданному шаблону шаблона.
-
Значение поля ключа HSET: установите значение данного поля поля в хэш-таблице указанного ключа в значение.
-
Ключевое поле HGET: получить значение данного поля поля в хэш-таблице указанного ключа.
-
Ключ HMSET поле1 значение1 поле2 значение2 ...: одновременно установить несколько полей хэш-таблицы указанного ключа.
-
Ключ HMGET поле1 поле2...: получить значения нескольких полей хэш-таблицы указанного ключа.
-
LPUSH ключ значение1 значение2...: Вставить одно или несколько значений в начало списка.
-
Ключ RPUSH значение1 значение2 ...: Вставьте одно или несколько значений в конец списка.
-
Ключ LPOP: удалить и вернуть первый элемент списка.
-
Ключ RPOP: удалить и вернуть последний элемент списка.
-
Клавиша LRANGE start stop: Получить элементы в указанном диапазоне в списке.
-
Ключ SADD элемент1 элемент2 ...: Добавляет один или несколько элементов в набор.
-
Ключ SMEMBERS: получить всех членов коллекции.
Выше приведены некоторые примеры распространенных команд Redis.В Redis есть много других команд, которые можно выбирать и использовать в соответствии с реальными потребностями.
Redis в сочетании с springboot для кеша подкачки
Как Springboot объединяет Redis для кэширования данных подкачки — очень распространенный сценарий.Если объем данных большой, необходимо кэшировать данные подкачки.
Объединение Redis в Spring Boot для кэширования данных подкачки может быть выполнено с помощью следующих шагов:
-
Добавьте связанные с Redis зависимости в файл pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
-
Настройте информацию о соединении Redis в файле application.properties:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
-
Создайте объект 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;
}
}
-
На уровне службы используйте объект 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 все равно получит старые данные!
Поэтому нам нужно обновлять данные в кеше при обновлении данных.