Redis API(springboot整合,已封装)

发布于:2024-12-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

结构

在这里插入图片描述


maven导包 pom.xml

依赖项主要添加如下

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

application.yml

server:
  port: 8080

spring:
  redis:
    host: 127.0.0.1
    port: 6379
  datasource:
    url: jdbc:mysql://localhost:3306/a_01
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

redis 配置类编写

在进行redis使用时,需要对其进行序列化
序列化理由

  1. 数据转换:
    Redis是一个键值存储系统,它本身并不理解Java对象或其他编程语言中的复杂数据结构。序列化器的作用就是将Java对象转换成Redis能够理解和存储的格式(如字符串、二进制数据等),以及将Redis中的数据转换回Java对象。这是实现Java应用与Redis之间数据交换的基础。
  2. 数据一致性: 使用合适的序列化器可以确保在Java应用中序列化的对象与从Redis中反序列化的对象保持一致。这对于保持数据的完整性和准确性至关重要,尤其是在分布式系统中。
  3. 性能优化: 不同的序列化器在序列化和反序列化的效率上可能有所不同。选择适合应用场景的序列化器可以优化性能,减少数据转换所需的时间和资源。
  4. 灵活性: Spring Data Redis提供了多种序列化器供选择,如StringRedisSerializer、Jackson2JsonRedisSerializer、GenericJackson2JsonRedisSerializer等。这些序列化器支持不同的数据类型和格式,使得开发者可以根据具体需求灵活配置。
  5. 支持复杂对象: 对于需要存储复杂对象(如自定义类实例)的场景,使用如Jackson2JsonRedisSerializer这样的序列化器可以将对象序列化为JSON字符串,从而方便地在Redis中存储和检索。
  6. 兼容性: 通过配置序列化器,可以确保在不同版本的Java应用或不同语言的应用之间共享Redis数据时保持兼容性。只要遵循相同的序列化规则,不同应用就能正确地解析和存储数据。

RedisConfig.java

package com.wunaiieq.tmp_redis_20241217.Config;


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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    /**
     * 创建RedisTemplate:用于执行Redis操作的方法
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory)   {
        RedisTemplate<String, Object> redisTemplate= new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(factory);

        //设置通用序列化器
        //对于其他的列表集合等的类型,不需要额外设置序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());    //key设置为String的序列化方式
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());     //value设置为JSON的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}

Service方法

对常用的CRUD方法按数据类型进行了封装

package com.wunaiieq.tmp_redis_20241217.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    /**Hash类型**/
    public boolean hset(String key, String field, Object value, long seconds) {
        try {
            redisTemplate.opsForHash().put(key, field, value);
            expire(key, seconds); // 假设有一个通用的expire方法
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public Object hget(String key, String field) {
        return redisTemplate.opsForHash().get(key, field);
    }

    private void expire(String key, long seconds) {
        redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
    }

    /**List类型**/
    public boolean lrpush(String key, Object value) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public List<Object> getList(String key, int start, int end) {
        try {
            return redisTemplate.opsForList().range(key, start, end);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**Set类型**/
    public long sset(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().add(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    public long sgetSize(String key) {
        try {
            return redisTemplate.opsForSet().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    public Set<Object> sgetAll(String key) {
        try {
            return redisTemplate.opsForSet().members(key);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**String类型**/
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    public boolean setex(String key, Object value, long expire) {
        try {
            redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**ZSet类型**/
    public boolean zadd(String key, Object member, double score) {
        try {
            return redisTemplate.opsForZSet().add(key, member, score);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public Set<String> zrange(String key, int start, int end) {
        try {
            Set<Object> range = redisTemplate.opsForZSet().range(key, start, end);
            if (range == null || range.isEmpty()) {
                return null;
            }
            return range.stream().map(Object::toString).collect(Collectors.toSet());
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

调用示例

 @Test
    public void test() {
        Student student = new Student(1, "wunaiieq");
        stringRedisService.set("k1", student);
    }