Java spring usa RedisTemplate para operar o banco de dados Redis

1. O que é Redis

O Redis é um banco de dados não relacional com alto desempenho de acesso, geralmente usado como banco de dados cache para reduzir a pressão de armazenamento normal do banco de dados.

O Redis pode armazenar o mapeamento entre chaves e 5 tipos de estrutura de dados diferentes. Os 5 tipos de estrutura de dados são String (string), List (lista), Set (coleção), Hash (hash) e Zset (ordenado). Set).

Aqui está uma breve introdução a esses cinco tipos de estrutura de dados:
Insira a descrição da imagem aqui

Dois. RedisTemplate e métodos relacionados

1. RedisTemplate
Spring encapsula o objeto RedisTemplate para executar várias operações no Redis e oferece suporte a todas as APIs nativas do Redis. RedisTemplate está localizado no pacote spring-data-redis. O RedisTemplate fornece várias operações de redis, manipulação e serialização de exceções, oferece suporte para publicação e assinatura e implementa o cache Spring 3.1. O RedisTemplate fornece várias operações de redis, manipulação e serialização de exceções, oferece suporte para publicação e assinatura e implementa o cache Spring 3.1. O RedisTemplate fornece várias operações de redis, manipulação e serialização de exceções, oferece suporte para publicação e assinatura e implementa o cache Spring 3.1. O RedisTemplate fornece várias operações de redis, manipulação e serialização de exceções, oferece suporte para publicação e assinatura e implementa o cache Spring 3.1.
Insira a descrição da imagem aqui

Observe que RedisTemplate é uma classe de modelo cuja chave e valor são genéricos.Em geral, a chave é do tipo String, como: RedisTemplate <String, Object>.

Além disso, se não houver circunstâncias especiais, não o defina como RedisTemplate <Objeto, Objeto>, caso contrário, ele causará erros de tipo quando usado de acordo com o princípio de substituição de Richter.

spring-data-redis fornece as seguintes funções para jedis:
1. Gerenciamento automático de pool de conexão, fornecendo uma classe "RedisTemplate" altamente encapsulada
2. Classificar e encapsular um grande número de APIs no cliente jedis, encapsulando o mesmo tipo de operação como Operação Interface
ValueOperations: operação KV simples

       SetOperations:set类型数据操作

       ZSetOperations:zset类型数据操作

       HashOperations:针对map类型的数据操作

       ListOperations:针对list类型的数据操作
       ```
2.RedisTemplate中定义了对5种数据结构操作
```c
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
opsForXXX和boundXXXOps的区别?

XXX é o tipo de valor. O primeiro obtém um operador, mas não especifica o objeto de operação (chave) e pode operar várias chaves e valores correspondentes dentro de uma conexão (transação); o último obtém um objeto de operação especificado (chave ), só pode operar o valor correspondente a esta chave dentro de uma conexão (transação).

Há um bug na API de contagem (incremento), você precisa prestar atenção a ele. Após a contagem do incremento, quando você obtém o valor da contagem por meio do método get, uma exceção EOF pode ser lançada (relacionada ao jdk local e versão compilada redis). Considere o uso de boundValueOps (key) .get (0, -1) para obter o valor de contagem.

3. Exemplos específicos de RedisTemplate operacional do banco de dados Redis

1. Operação de tipo de valor:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestValue {
    
    
    @Autowired
    private RedisTemplate redisTemplate;    
    @Test
    public void setValue(){
    
    
//存值,针对值类型,ops相当于options
        redisTemplate.boundValueOps("name").set("itcast");      
    }   
    @Test
    public void getValue(){
    
    
        String str = (String) redisTemplate.boundValueOps("name").get();
        System.out.println(str);
    }   
    @Test
    public void deleteValue(){
    
    
        redisTemplate.delete("name");
    }   
}

2. O tipo de operação Set type da operação set type não é ordenado, ou seja, a sequência de acesso não é necessariamente a mesma

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestSet {
    
    
     
    @Autowired
    private RedisTemplate redisTemplate;
     
    /**
     * 存入值
     */
    @Test
    public void setValue(){
    
    
        redisTemplate.boundSetOps("nameset").add("曹操");     
        redisTemplate.boundSetOps("nameset").add("刘备"); 
        redisTemplate.boundSetOps("nameset").add("孙权");
    }
     
    /**
     * 提取值
     */
    @Test
    public void getValue(){
    
    
        Set members = redisTemplate.boundSetOps("nameset").members();
        System.out.println(members);
    }
     
    /**
     * 删除集合中的某一个值
     */
    @Test
    public void deleteValue(){
    
    
        redisTemplate.boundSetOps("nameset").remove("孙权");
    }
     
    /**
     * 删除整个集合
     */
    @Test
    public void deleteAllValue(){
    
    
        redisTemplate.delete("nameset");
    }
}

Resultado de saída: [Sun Quan, Liu Bei, Cao Cao], além disso, os elementos do tipo conjunto não podem ser repetidos. Quando o conjunto não tem valor, ele retornará um []
3. Operação do tipo lista

O tipo de lista é dividido em dois tipos, um é a pilha push à esquerda e o outro é a pilha push à direita

Empurre a pilha para a direita:

/**
 * 右压栈:后添加的对象排在后边,相当于队列,相当于先进先出
 */
@Test
public void testSetValue1(){
    
            
    redisTemplate.boundListOps("namelist1").rightPush("刘备");
    redisTemplate.boundListOps("namelist1").rightPush("关羽");
    redisTemplate.boundListOps("namelist1").rightPush("张飞");        
}
 
/**
 * 显示右压栈集合,range 表示查询的索引,从第几个查到第几个,如果想查询所有的数的话只能将第二个数写得大一点。
 */
@Test
public void testGetValue1(){
    
    
    List list = redisTemplate.boundListOps("namelist1").range(0, 10);
    System.out.println(list);
}

Resultado da corrida: [Liu Bei, Guan Yu, Zhang Fei], os elementos podem ser repetidos

Empurre a pilha para a esquerda:

/**
 * 左压栈:后添加的对象排在前边,相当于栈,先进后出
 */
@Test
public void testSetValue2(){
    
            
    redisTemplate.boundListOps("namelist2").leftPush("刘备");
    redisTemplate.boundListOps("namelist2").leftPush("关羽");
    redisTemplate.boundListOps("namelist2").leftPush("张飞");     
}
 
/**
 * 显示左压栈集合
 */
@Test
public void testGetValue2(){
    
    
    List list = redisTemplate.boundListOps("namelist2").range(0, 10);
    System.out.println(list);
}

Resultados da corrida: [Zhang Fei, Guan Yu, Liu Bei]

Elementos de consulta com base no índice

/**
 * 查询集合某个元素
 */
@Test
public void testSearchByIndex(){
    
    
    String s = (String) redisTemplate.boundListOps("namelist1").index(1);
    System.out.println(s);
}

Resultado da operação: retorna o valor do elemento cujo índice é 1 e remove um elemento

/**
 * 移除集合某个元素,其中remove中第一个参数是移除的个数
 */
@Test
public void testRemoveByIndex(){
    
    
    redisTemplate.boundListOps("namelist1").remove(1, "关羽");
}

Isso significa remover um "Guan Yu".

4. Operação do tipo hash

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/applicationContext-redis.xml")
public class TestHash {
    
    
  @Autowired
  private RedisTemplate redisTemplate;
  
  //  存值
  @Test
  public void testSetValue() {
    
    
    redisTemplate.boundHashOps("namehash").put("a", "唐僧");
    redisTemplate.boundHashOps("namehash").put("b", "悟空");
    redisTemplate.boundHashOps("namehash").put("c", "八戒");
    redisTemplate.boundHashOps("namehash").put("d", "沙僧");
  }
  
  //获取所有的key
  @Test
  public void testGetKeys() {
    
    
    Set s = redisTemplate.boundHashOps("namehash").keys();
    System.out.println(s);
  }
  
  //  获取所有的value
  @Test
  public void testGetValues() {
    
    
    List values = redisTemplate.boundHashOps("namehash").values();
    System.out.println(values);
  }
  
  //  根据key获取值
  @Test
  public void testGetValueByKey() {
    
    
    Object object = redisTemplate.boundHashOps("namehash").get("b");
    System.out.println(object);
  }
  
  //根据key移除值
  @Test
  public void testRemoveValueByKey() {
    
    
    redisTemplate.boundHashOps("namehash").delete("c");
  }
  
}

Quatro. A diferença entre RedisTemplate e StringRedisTemplate

A relação entre os dois é que StringRedisTemplate herda RedisTemplate.

Os dados dos dois não são comuns; ou seja, StringRedisTemplate só pode gerenciar dados em StringRedisTemplate e RedisTemplate só pode gerenciar dados em RedisTemplate.

Existem duas estratégias de serialização adotadas pelo SDR por padrão, uma é a estratégia de serialização de String e a outra é a estratégia de serialização de JDK.

StringRedisTemplate adota a estratégia de serialização de String por padrão, e as chaves e valores salvos são serializados e salvos usando essa estratégia.

O RedisTemplate usa a estratégia de serialização JDK por padrão, e as chaves e valores salvos são serializados e salvos usando essa estratégia.

A classe de sequência usada pelo RedisTemplate está na operação de dados, por exemplo, quando os dados são armazenados, os dados serão serializados em uma matriz de bytes e depois armazenados no banco de dados Redis. Neste momento, ao abrir o Redis para visualizar, você verá que seus dados não estão em um formato legível, mas em uma matriz de bytes, semelhante a
Insira a descrição da imagem aqui

Claro, ao obter dados do Redis, os dados serão convertidos como uma matriz de bytes por padrão. Isso causará um problema. Quando os dados que precisam ser obtidos não são armazenados no redis como uma matriz de bytes, mas é uma string legível normal , Por exemplo, o seguinte formulário
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/dcj19980805/article/details/115179473
Recomendado
Clasificación