Springboot整合Redis_使用Jedis连接池_详解

2022年6月23日 1327点热度 0人点赞 0条评论

Spring Boot提供了对应的Starter,maven坐标:

<code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt;
&lt;/dependency&gt;</code>

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对 Jedis 客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:针对hash类型的数据操作
  • ListOperations:针对list类型的数据操作

5.3.2 使用方式

5.3.2.1 环境搭建

第一步:创建maven项目springdataredis_demo,配置pom.xml文件

<code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
    &lt;parent&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
        &lt;version&gt;2.4.5&lt;/version&gt;
        &lt;relativePath/&gt;
    &lt;/parent&gt;
    &lt;groupId&gt;com.itheima&lt;/groupId&gt;
    &lt;artifactId&gt;springdataredis_demo&lt;/artifactId&gt;
    &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
    &lt;properties&gt;
        &lt;java.version&gt;1.8&lt;/java.version&gt;
    &lt;/properties&gt;
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;junit&lt;/groupId&gt;
            &lt;artifactId&gt;junit&lt;/artifactId&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
    &lt;build&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
                &lt;version&gt;2.4.5&lt;/version&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
    &lt;/build&gt;
&lt;/project&gt;</code>

第二步:编写启动类

<code class="language-java">package com.itheima;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }

}</code>

第三步:配置application.yml

<code class="language-yaml">spring:
  application:
    name: springdataredis_demo
  #Redis相关配置
  redis:
    host: localhost
    port: 6379
    #password: 123456
    database: 0 #操作的是0号数据库
    jedis:
      #Redis连接池配置
      pool:
        max-active: 8 #最大连接数
        max-wait: 1ms #连接池最大阻塞等待时间
        max-idle: 4 #连接池中的最大空闲连接
        min-idle: 0 #连接池中的最小空闲连接</code>

解释说明:

spring.redis.database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。

可以通过修改Redis配置文件来指定数据库的数量。

第四步:提供配置类

<code class="language-java">package com.itheima.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置类
 */
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate&lt;Object, Object&gt; redisTemplate(RedisConnectionFactory connectionFactory) {

        RedisTemplate&lt;Object, Object&gt; redisTemplate = new RedisTemplate&lt;&gt;();

        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;
    }

}</code>

解释说明:

当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别

第五步:提供测试类

<code class="language-java">package com.itheima.test;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

}</code>
5.3.2.2 操作字符串类型数据
<code class="language-java">/**
 * 操作String类型数据
*/
@Test
public void testString(){
    //存值
    redisTemplate.opsForValue().set(&quot;city123&quot;,&quot;beijing&quot;);

    //取值
    String value = (String) redisTemplate.opsForValue().get(&quot;city123&quot;);
    System.out.println(value);

    //存值,同时设置过期时间
    redisTemplate.opsForValue().set(&quot;key1&quot;,&quot;value1&quot;,10l, TimeUnit.SECONDS);

    //存值,如果存在则不执行任何操作
    Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(&quot;city1234&quot;, &quot;nanjing&quot;);
    System.out.println(aBoolean);
}</code>
5.3.2.3 操作哈希类型数据
<code class="language-java">/**
 * 操作Hash类型数据
*/
@Test
public void testHash(){
    HashOperations hashOperations = redisTemplate.opsForHash();

    //存值
    hashOperations.put(&quot;002&quot;,&quot;name&quot;,&quot;xiaoming&quot;);
    hashOperations.put(&quot;002&quot;,&quot;age&quot;,&quot;20&quot;);
    hashOperations.put(&quot;002&quot;,&quot;address&quot;,&quot;bj&quot;);

    //取值
    String age = (String) hashOperations.get(&quot;002&quot;, &quot;age&quot;);
    System.out.println(age);

    //获得hash结构中的所有字段
    Set keys = hashOperations.keys(&quot;002&quot;);
    for (Object key : keys) {
        System.out.println(key);
    }

    //获得hash结构中的所有值
    List values = hashOperations.values(&quot;002&quot;);
    for (Object value : values) {
        System.out.println(value);
    }
}</code>
5.3.2.4 操作列表类型数据
<code class="language-java">/**
 * 操作List类型的数据
*/
@Test
public void testList(){
    ListOperations listOperations = redisTemplate.opsForList();

    //存值
    listOperations.leftPush(&quot;mylist&quot;,&quot;a&quot;);
    listOperations.leftPushAll(&quot;mylist&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;);

    //取值
    List&lt;String&gt; mylist = listOperations.range(&quot;mylist&quot;, 0, -1);
    for (String value : mylist) {
        System.out.println(value);
    }

    //获得列表长度 llen
    Long size = listOperations.size(&quot;mylist&quot;);
    int lSize = size.intValue();
    for (int i = 0; i &lt; lSize; i++) {
        //出队列
        String element = (String) listOperations.rightPop(&quot;mylist&quot;);
        System.out.println(element);
    }
}</code>
5.3.2.5 操作集合类型数据
<code class="language-java">/**
 * 操作Set类型的数据
*/
@Test
public void testSet(){
    SetOperations setOperations = redisTemplate.opsForSet();

    //存值
    setOperations.add(&quot;myset&quot;,&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;a&quot;);

    //取值
    Set&lt;String&gt; myset = setOperations.members(&quot;myset&quot;);
    for (String o : myset) {
        System.out.println(o);
    }

    //删除成员
    setOperations.remove(&quot;myset&quot;,&quot;a&quot;,&quot;b&quot;);

    //取值
    myset = setOperations.members(&quot;myset&quot;);
    for (String o : myset) {
        System.out.println(o);
    }

}</code>
5.3.2.6 操作有序集合类型数据
<code class="language-java">/**
 * 操作ZSet类型的数据
*/
@Test
public void testZset(){
    ZSetOperations zSetOperations = redisTemplate.opsForZSet();

    //存值
    zSetOperations.add(&quot;myZset&quot;,&quot;a&quot;,10.0);
    zSetOperations.add(&quot;myZset&quot;,&quot;b&quot;,11.0);
    zSetOperations.add(&quot;myZset&quot;,&quot;c&quot;,12.0);
    zSetOperations.add(&quot;myZset&quot;,&quot;a&quot;,13.0);

    //取值
    Set&lt;String&gt; myZset = zSetOperations.range(&quot;myZset&quot;, 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }

    //修改分数
    zSetOperations.incrementScore(&quot;myZset&quot;,&quot;b&quot;,20.0);

    //取值
    myZset = zSetOperations.range(&quot;myZset&quot;, 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }

    //删除成员
    zSetOperations.remove(&quot;myZset&quot;,&quot;a&quot;,&quot;b&quot;);

    //取值
    myZset = zSetOperations.range(&quot;myZset&quot;, 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }
}</code>
5.3.2.7 通用操作
<code class="language-java">/**
 * 通用操作,针对不同的数据类型都可以操作
*/
@Test
public void testCommon(){
    //获取Redis中所有的key
    Set&lt;String&gt; keys = redisTemplate.keys(&quot;*&quot;);
    for (String key : keys) {
        System.out.println(key);
    }

    //判断某个key是否存在
    Boolean itcast = redisTemplate.hasKey(&quot;itcast&quot;);
    System.out.println(itcast);

    //删除指定key
    redisTemplate.delete(&quot;myZset&quot;);

    //获取指定key对应的value的数据类型
    DataType dataType = redisTemplate.type(&quot;myset&quot;);
    System.out.println(dataType.name());

}</code>

小小调酒师

此刻打盹,你将做梦; 此刻学习,你将圆梦。 个人邮箱:shellways@foxmail.com

文章评论