Uso básico de Redis em Java

Este filme apresentará o uso básico do Redis em Java



1. Use jedis para operar redis

1.1 Introdução aos Jedis

Jedis é um kit de ferramentas cliente Redis desenvolvido em linguagem Java, que é usado para interagir com dados Redis em linguagem Java.

Endereço do site oficial do Jedi no github: https://github.com/redis/jedis#readme

Jedis é apenas um encapsulamento de comandos Redis, e você pode facilmente começar a usar Jedis dominando os comandos Redis.

Jedis é desenvolvido seguindo a especificação do protocolo RESP e possui boa versatilidade e legibilidade.

1.2. Apresente a dependência Maven de jedis
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.4.3</version>
        </dependency>
1.2. Obtenha conexão

Para muitos aplicativos, é necessário conectar-se ao Redis. É melhor usar um pool de conexões. Um pool de conexões Jedis pode ser instanciado assim:

JedisPool pool = new JedisPool("localhost", 6379);

Para a instância JedisPool, você pode usar o bloco try-With-resources para obter a conexão e executar o comando Redis (desta forma, você não precisa fechá-lo manualmente).

try (Jedis jedis = pool.getResource()) {
    
    
	// 运行单个 SET 命令
  jedis.set("clientName", "Jedis");
}
1.3. Exemplos de uso

Escreva o seguinte código:

    public static void main(String[] args) {
    
    
        // Redis服务端IP和端口号
        JedisPool pool = new JedisPool("127.0.0.1", 6379);
        try (Jedis jedis = pool.getResource()) {
    
    
            // 使用相关Redis的命令
            // 选择第0个数据库进行操作
            jedis.select(0);
            // 向0号数据库写入,字符串数据
            jedis.set("Java", "best");
            jedis.set("PHP", "good");
            // 查询是否写入
            System.out.println(jedis.get("Java"));
            System.out.println(jedis.get("PHP"));
        }
    }

Execute o caso de teste:

imagem-20230812233428661

A instância Jedis implementa a maioria dos comandos Redis. Para esses comandos, você pode consultar os métodos correspondentes aos comandos em https://www.javadoc.io/doc/redis.clients/jedis/latest/redis/clients/jedis/ Jedis.htmlApI .

imagem-20230812233859534


2. Para uso do JedisPooled

2.1. Usar JedisPooled

Usar um bloco try-with-resources para cada comando pode ser complicado, então podemos considerar o uso do JedisPooled.

JedisPooled jedis = new JedisPooled("localhost", 6379);

Código detalhado:

    public static void main(String[] args) {
    
    
        JedisPooled pool = new JedisPooled("127.0.0.1", 6379, null, null);
        pool.set("Java", "best");
        pool.set("PHP", "good");
        System.out.println(pool.get("Java"));
        System.out.println(pool.get("PHP"));
    }

resultado em execução:

imagem-20230812233428661

2.2, sobre o pool de conexões

Usar o pool de conexões é a maneira oficialmente recomendada de usá-lo. Você pode usar Jedis melhor por meio do pool de conexões. Podemos configurar o pool de conexões por meio do GenericObjectPoolConfig. Documentação da API GenericObjectPoolConfig: https://commons.apache.org/proper/commons- pool/apidocs/org/apache/commons/pool2/impl/GenericObjectPoolConfig.html

Configure o pool de conexões através do objeto GenericObjectPoolConfig, o código específico é o seguinte:

    public static void main(String[] args) {
    
    
        GenericObjectPoolConfig config = new JedisPoolConfig();
        // 设置连接池中最多允许放100个Jedis对象
        config.setMaxTotal(100);
        // 设置连接池中最大允许空闲连接
        config.setMaxIdle(100);
        // 设置连接池中最小允许的连接数
        config.setMinIdle(10);
        // 借出连接的时候是否测试有效性,推荐false
        config.setTestOnBorrow(false);
        // 归还时是否测试,推荐false
        config.setTestOnReturn(false);
        // 创建时是否测试有效  开发的时候设置为false,实践运行的时候设置为true
        config.setTestOnCreate(false);
        // 当连接池内jedis无可用资源时,是否等待资源,true
        config.setBlockWhenExhausted(true);
        // 没有获取资源时最长等待1秒,1秒后没有还没有的话就报错
        config.setMaxWaitMillis(1000);

        JedisPool pool = new JedisPool(config, "127.0.0.1", 6379);

        try (Jedis jedis = pool.getResource()) {
    
    
            // 使用相关Redis的命令
            // 选择第0个数据库进行操作
            jedis.select(0);
            // 向0号数据库写入,字符串数据
            jedis.set("Java", "best");
            jedis.set("PHP", "good");

            // 查询是否写入
            System.out.println(jedis.get("Java"));
            System.out.println(jedis.get("PHP"));
        }
    }

resultado em execução:

imagem-20230812233428661


3. Use Redis no SpringBoot

3.1. Apresentando dependências do Maven

Primeiro, você precisa adicionar dependências do Redis ao arquivo pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Essa dependência inclui Spring Data Redis, bem como a implementação de dois clientes Redis, Jedis e Lettuce.

3.2. Configurar conexão Redis

No projeto SpringBoot, você pode configurar as informações de conexão do Redis no arquivo application.properties ou application.yml. Aqui está um exemplo:

spring:
  data:
    redis:
      timeout: 3000
      database: 0
      password: password
      port: 6379
      host: localhost

Entre eles, host e porta são o endereço e número da porta do servidor Redis respectivamente, senha é a senha do Redis (se não houver senha, pode deixar em branco), timeout é o tempo limite da conexão Redis, e jedis .pool é a configuração relacionada do pool de conexões.

3.3. Criar modelo Redis

Para operar Redis com Spring Data Redis, a classe RedisTemplate geralmente é usada. Por conveniência, podemos criar uma classe de ferramenta para gerenciar a criação e uso do RedisTemplate. Aqui está um exemplo:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtils {
    
    

    /**
     * 如果使用 @Autowired 注解完成自动装配 那么
     * RedisTemplate要么不指定泛型,要么泛型 为<Stirng,String> 或者<Object,Object>
     * 如果你使用其他类型的 比如RedisTemplate<String,Object>
     * 那么请使用 @Resource 注解
     * */
    @Resource
    private RedisTemplate<String,Object> redisTemplate;

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 缓存value
     *
     * @param key -
     * @param value -
     * @param time -
     * @return -
     */
    public boolean cacheValue(String key, Object value, long time) {
    
    
        try {
    
    
            ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
            valueOperations.set(key, value);
            if (time > 0) {
    
    
                // 如果有设置超时时间的话
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Throwable e) {
    
    
            logger.error("缓存[" + key + "]失败, value[" + value + "] " + e.getMessage());
        }
        return false;
    }

    /**
     * 缓存value,没有设置超时时间
     *
     * @param key -
     * @param value -
     * @return -
     */
    public boolean cacheValue(String key, Object value) {
    
    
        return cacheValue(key, value, -1);
    }

    /**
     * 判断缓存是否存在
     *
     * @param key
     * @return
     */
    public boolean containsKey(String key) {
    
    
        try {
    
    
            return redisTemplate.hasKey(key);
        } catch (Throwable e) {
    
    
            logger.error("判断缓存是否存在时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return false;
    }

    /**
     * 根据key,获取缓存
     *
     * @param key -
     * @return -
     */
    public Object getValue(String key) {
    
    
        try {
    
    
            ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
            return valueOperations.get(key);
        } catch (Throwable e) {
    
    
            logger.error("获取缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return null;
    }

    /**
     * 移除缓存
     *
     * @param key -
     * @return -
     */
    public boolean removeValue(String key) {
    
    
        try {
    
    
            redisTemplate.delete(key);
            return true;
        } catch (Throwable e) {
    
    
            logger.error("移除缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return false;
    }

    /**
     * 根据前缀移除所有以传入前缀开头的key-value
     *
     * @param pattern -
     * @return -
     */
    public boolean removeKeys(String pattern) {
    
    
        try {
    
    
            Set<String> keySet = redisTemplate.keys(pattern + "*");
            redisTemplate.delete(keySet);
            return true;
        } catch (Throwable e) {
    
    
            logger.error("移除key[" + pattern + "]前缀的缓存时失败", "err[" + e.getMessage() + "]");
        }
        return false;
    }

}

Neste exemplo, @Resourceinjetamos automaticamente um RedisTemplate<String, Object>objeto usando anotações. Em seguida, fornecemos três métodos para operar no Redis: o método cacheValue é usado para armazenar dados em cache, o método getValue é usado para obter dados armazenados em cache e o método removeValue é usado para excluir dados armazenados em cache. Esses métodos são implementados por meio do objeto redisTemplate.

Deve-se observar que ao usar RedisTemplate, o tipo de par chave-valor precisa ser especificado. Neste exemplo, especificamos que a chave é do tipo String e o valor é do tipo Object.

3.4, use RedisTemplate

No exemplo acima, criamos um objeto RedisTemplate e fornecemos alguns métodos para operar no Redis. Agora, podemos usar esta classe de ferramenta em qualquer lugar do projeto SpringBoot para operações de cache. Aqui está um exemplo:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    
    

    @Autowired
    private RedisUtils redisUtils;

    @Autowired
    private UserService userService;

    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {
    
    

        String key = "user_" + id;
        User user = (User) redisUtils.getValue(key);
        if (user == null) {
    
    
            user = userService.getUserById(id);
            redisUtils.cacheValue(key, user);
        }
        return user;
    }
}

Neste exemplo, criamos uma classe UserController para lidar com solicitações HTTP. No método getUserById, primeiro construímos uma chave em cache e, em seguida, usamos redisUtils.getValue o método para obter os dados em cache do Redis. Se não houver dados no cache, chamamos userService.getUserByIdo método para obter os dados do banco de dados e usamos redisUtils.cacheValueo método para armazenar os dados no cache Redis. Por fim, retorne os dados obtidos.

Através deste exemplo, podemos ver o processo de utilização do Redis como cache no projeto SpringBoot. Primeiro precisamos adicionar dependências do Redis e, em seguida, configurar as informações de conexão do Redis no arquivo de configuração. A seguir, criamos uma classe de ferramenta RedisUtil para gerenciar a criação e uso do RedisTemplate. Finalmente, usamos RedisUtils no controlador para armazenar em cache o Redis.

Acho que você gosta

Origin blog.csdn.net/weixin_45187434/article/details/132373648
Recomendado
Clasificación