Springboot 操作 redis 中的String、Set、Map、List、实体类,上传文件

本文介绍了如何在SpringDataRedis中进行String、Map、List和Set的操作,包括存取、删除和检查键值对。同时,提到了对象存储的三种方案,并展示了文件上传到Redis及从Redis下载文件的方法。此外,还提供了根据key删除和判断key存在的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Jedis和SpringDataRedis有何区别?

  • Jedis是Redis官方推荐的面向Java的操作Redis的客户端。

  • SpringDataRedis 中包含 StringRedisTemplate(操作键值对都是字符串的) 、RedisTemplate(操作键值对可能不是字符串的复杂键值对的),是对 JedisApi 的高度封装。

SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用如:SpringCache。

本文对第二条的SpringDataRedis进行讲解。


一、引入依赖:

		<!-- redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 对象池,使用redis时必须引入 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

二、配置文件

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
    # 连接超时时间
    timeout: 10000ms
    # Redis默认情况下有16个分片,这里配置具体使用的分片
    database: 0
    lettuce:
     pool:
      # 连接池最大连接数(使用负值表示没有限制) 默认 8
      max-active: 8
      # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
      max-wait: -1ms
      # 连接池中的最大空闲连接 默认 8
      max-idle: 8
      # 连接池中的最小空闲连接 默认 0
      min-idle: 0

三、操作String

	@Autowired
    private StringRedisTemplate stringRedisTemplate;
      
          //.....省略
          
    //字符串的键值对存入redis(若已经有了“aaa”,再次set会覆盖原来的值)
    stringRedisTemplate.opsForValue().set("aaa", "111");
    
    //字符串的键值对存入redis,设置过期时间为 2秒
    //stringRedisTemplate.opsForValue().set("aaa", "111", 2, TimeUnit.SECONDS);

 	//检查 key是否存在
    //Boolean hasBoolean = stringRedisTemplate.hasKey("isHas");

	//根据 key删除记录
    //Boolean deleteBoolean = stringRedisTemplate.delete(key); 
    
    //从redis中根据键获取值
    String value = stringRedisTemplate.opsForValue().get("aaa"); 

四、操作Map

        @Autowired
        private RedisTemplate redisTemplate;
      
          //.....省略
          
        Map<String, Object> map = new HashMap<>();
        map.put("name", "张三");
        map.put("password", 123456);
        //将map存入redis,key 为 map1
        redisTemplate.opsForHash().putAll("map1", map);
        
        //向redis中的map1中增加键值对"age"->"13"
        redisTemplate.opsForHash().put("map1", "age", "13");
        
        //设置缓存时间有效期10秒
        //redisTemplate.expire("map1", 10, TimeUnit.SECONDS);
        
        //redis中获取整个map
        Map<String, Object> resultMap = redisTemplate.opsForHash().entries("map1");
        
        /*
        //判断 redis的 map1里有没有键 age
        boolean hashKeyBoolean = redisTemplate.opsForHash().hasKey("map1","age");
        
        //redis中获取 map中指定的 key值,没有则返回 null
        String name = (String) redisTemplate.opsForHash().get("map1", "name");
        
        //redis中获取 map1中所有的 key
        Set<String> resultMapSet=redisTemplate.opsForHash().keys("map1");
        
        //redis中获取 map1中所有的 value
        List<String> reslutMapList=redisTemplate.opsForHash().values("map1");
        
        //删除 redis中获取 map1中age的键值对
        redisTemplate.opsForHash().delete("map1","age");
        
        //删除整个 map1
        Boolean deleteBoolean = redisTemplate.delete("map1");
        */

五、操作List

        @Autowired
        private RedisTemplate redisTemplate;
      
          //.....省略
          
	    List<String> list1 = new ArrayList<>();
        list1.add("a1");
        list1.add("a2");
        list1.add("a3");
        //存放到redis
        redisTemplate.opsForList().rightPushAll("list1", list1);
        
        //redis中的list1追加元素a4
        redisTemplate.opsForList().rightPush("list1", "a4");
        
        //设置缓存时间有效期10秒
        //redisTemplate.expire("list1", 10, TimeUnit.SECONDS);
        
        //从redis获取list1中所有元素
        List<String> getList1 = (List<String>) redisTemplate.opsForList().range("list1", 0, -1);

六、操作Set

        @Autowired
        private RedisTemplate redisTemplate;
      
          //.....省略
          
		Set<String> set1 = new HashSet<>();
        set1.add("123");
        set1.add("456");
        set1.add("789");
        //存放到 redis
        redisTemplate.opsForSet().add("set1", set1);
        
        //设置缓存时间有效期10秒
        //redisTemplate.expire("set1", 10, TimeUnit.SECONDS);
        
        //从redis获取
        Set<String> resultSet = redisTemplate.opsForSet().members("set1");

七、操作对象

在Redis中存储Java对象通常有以下三种方式:

  • 方案一:首先将Java对象转化为json字符串,然后在Redis中存储这个转化后的字符串。
  • 方案二:设置Redis的Value和HashValue的序列化方式设置为JDK序列化,然后在Redis中存储序列化后的二进制字节。
  • 方案三:设置Redis的Value和HashValue的序列化方式设置为Jackson序列化,这种方案类似于方案一,在Redis中实际存储的是Jackson序列化后的json字符串,不过好处是不需要自己手动序列化/反序列化JSON字符串这个步骤了。

假设有一个对象Student:

public class Student {
        private String name;
        private String stuendId;
        private String teacherName;
        private String subject;
        private String grade;
        private String schoolName;
        private String age;
        private String fraction;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", stuendId='" + stuendId + '\'' +
                ", teacherName='" + teacherName + '\'' +
                ", subject='" + subject + '\'' +
                ", grade='" + grade + '\'' +
                ", schoolName='" + schoolName + '\'' +
                ", age=" + age +
                ", fraction='" + fraction + '\'' +
                '}';

		//省略get、set方法......
    }
}

方案一示例 (利用fastjson序列化和反序列化):

      @Autowired
      private RedisTemplate redisTemplate;
      
          //.....省略
          
		Student student = new Student();
        student.setAge("11");
        student.setName("张三");
        student.setGrade("5年级");
        //对象序列化为字符串存入redis
        redisTemplate.opsForValue().set("student1", JSONObject.toJSONString(student));
        //从redis中获取字符串对象
        String studentStr = String.valueOf(redisTemplate.opsForValue().get("student1"));
        //字符串反序列化为对象
        Student resultStudent = JSON.parseObject(studentStr, Student.class);

八、文件上传到redis和从redis下载文件

  • 文件上传到redis:
	 @Autowired
      private RedisTemplate redisTemplate;

	 /**
     * 上传文件到redism。key为文件名,需带后缀
     */
      public String setfileType(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        try {
            long start = System.currentTimeMillis();
            redisTemplate.opsForValue().set(fileName, file.getBytes());
            long end = System.currentTimeMillis();
            logger.info("文件上传耗时:{}", end - start);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileName;
    }

Spring Boot做文件上传时,如果上传的文件过大会报错The field file exceeds its maximum permitted size of 1048576 bytes。
需要在配置文件里调整修改上传文件的大小,如果max-file-size和max-request-size都传-1则大小不做限制:

properties配置文件:

spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB

yaml配置文件:

spring:
  #文件上传控制文件的大小,如:max-file-size: 1MB  max-request-size: 5MB ,若传-1则不限制大小
  servlet:
    multipart:
      max-file-size: -1
      max-request-size: -1
  • 从redis获取文件:
	 /**
     * redis获取文件,key是文件名要带后缀
     */
    public String getfile(String key) {
        //从redis里获取存储的文件byte[]
        byte[] file = (byte[]) redisTemplate.opsForValue().get(key);
        //byte[]写入缓冲输出流,保存到本地F:/test/,文件名是key要带后缀
        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:/test/" + key))) {
            bos.write(file);//写入数据
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "成功";
    }

九、其他操作

redis中根据 key 删除

		Boolean deleteBoolean = redisTemplate.delete(key);

判断redis里是否有key

        //判断redis里是否有key
        Boolean haskey = redisTemplate.hasKey(key);

参考:
RedisTemplate中opsForValue的使用
SpringBoot中Redis的set、map、list、value、实体类等基本操作介绍
RedisTemplate集合使用说明-opsForList(二)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值