Redis 6.0 之后为何引入了多线程?6.0 之前为什么不使用多线程?

在 Redis 6.0 之前,Redis 是单线程的,这是因为 Redis 的设计目标是高性能和高并发,而单线程模型可以避免多线程带来的线程切换和锁竞争等开销,从而提高 Redis 的性能和并发能力。此外,Redis 的单线程模型还可以避免多线程带来的复杂性和不稳定性问题,使 Redis 更加简单和可靠。

然而,随着 Redis 的应用场景越来越广泛,数据量和并发量也越来越大,单线程模型已经无法满足需求。因此,在 Redis 6.0 中引入了多线程模型,以提高 Redis 的性能和并发能力。多线程模型可以充分利用多核 CPU 的优势,提高 Redis 的处理能力和吞吐量。同时,Redis 6.0 中的多线程模型采用了无锁设计,避免了锁竞争和线程切换等开销,从而保证了 Redis 的高性能和高并发能力。

Redis怎么开启多线程模式

要开启 Redis 的多线程模式,需要在 Redis 的配置文件中设置 io-threads-do-reads 参数为 yes,并且启动 Redis 时需要使用 --threads <num> 参数指定线程数。例如,要启动 4 个线程的 Redis 实例,可以使用以下命令:

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

需要注意的是,Redis 的多线程模式目前仅支持部分命令,例如读取命令(GET、HGET、LRANGE 等),而写入命令(SET、HSET、LPUSH 等)仍然是单线程模式。因此,在使用多线程模式时需要根据实际情况进行测试和评估,以确定是否能够提高 Redis 的性能和并发能力。

Redis常用命令

Redis 是一种基于内存的高性能键值存储系统,常用于缓存、消息队列、计数器等场景。以下是 Redis 常用命令:

  1. SET key value:设置指定 key 的值为 value。

  2. GET key:获取指定 key 的值。

  3. DEL key:删除指定 key。

  4. INCR key:将指定 key 的值加 1。

  5. DECR key:将指定 key 的值减 1。

  6. EXPIRE key seconds:设置指定 key 的过期时间为 seconds 秒。

  7. TTL key:获取指定 key 的剩余过期时间。

  8. EXISTS key:判断指定 key 是否存在。

  9. KEYS pattern:查找所有符合给定模式 pattern 的 key。

  10. HSET key field value:设置指定 key 的哈希表中给定字段 field 的值为 value。

  11. HGET key field:获取指定 key 的哈希表中给定字段 field 的值。

  12. HMSET key field1 value1 field2 value2 ...:同时设置指定 key 的多个哈希表字段。

  13. HMGET key field1 field2 ...:获取指定 key 的多个哈希表字段的值。

  14. LPUSH key value1 value2 ...:将一个或多个值插入到列表头部。

  15. RPUSH key value1 value2 ...:将一个或多个值插入到列表尾部。

  16. LPOP key:移除并返回列表的第一个元素。

  17. RPOP key:移除并返回列表的最后一个元素。

  18. LRANGE key start stop:获取列表中指定范围内的元素。

  19. SADD key member1 member2 ...:向集合中添加一个或多个成员。

  20. SMEMBERS key:获取集合中的所有成员。

以上是 Redis 常用命令的部分示例,Redis 还有很多其他命令,可以根据实际需求进行选择和使用。

redis结合springboot做分页缓存

springboot结合redis怎么缓存分页数据,这是一个很常见的场景,如果数据量很大,对分页数据进行缓存是很有必要的。

在 Spring Boot 中结合 Redis 进行缓存分页数据,可以通过以下步骤实现:

  1. 在 pom.xml 文件中添加 Redis 相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 在 application.properties 文件中配置 Redis 连接信息:

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. 在 Service 层中,使用 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 进行缓存分页数据的实现方法。需要注意的是,缓存的数据需要根据实际情况进行设置过期时间,避免缓存数据过期后仍然被使用。

但是,以上代码还是存在问题的,如果page数据发生了变化怎么办,redis获取的还是老数据啊!

所以,我们需要在数据更新的时候,也要更新缓存里面的数据。

猜你喜欢

转载自blog.csdn.net/weixin_39570751/article/details/130866012