Day 8-4 使用Spring Data Redis操作Redis 基础环境&序列设置&操作各类型数据及对应命令

本文介绍了使用Spring Data Redis操作Redis的基础环境配置,包括在pom.xml中添加依赖和配置application.yml文件。接着详细讲解了如何操作Redis的五大常见数据类型:String、Hash、List、Set和ZSet,包括各种操作命令和对应的RedisTemplate方法。同时,文章还提到了序列化设置,确保key和value正确存取。

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

一、基础环境
  1. 首先在pom.xml中导入依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下(其实就是对应五大常用数据类型):

  • ValueOperations:简单K-V操作 -String类型
  • SetOperations:set类型数据操作 -无序集合set类型
  • ZSetOperations:zset类型数据操作 -有序集合set类型
  • HashOperations:针对map类型的数据操作 -哈希类型
  • ListOperations:针对list类型的数据操作 -list类型
  1. 配置application.yml文件
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 #连接池中的最小空闲连接

这里的database默认操作0号数据库,Redis为我们默认提供了16个数据库。具体看配置文件redis.windows.conf
在这里插入图片描述
在这里插入图片描述

二、序列设置及操作常用五大类类型
1. 操作String类型数据

redisTemplate由Spring管理且在我们没有配置该类可以被直接注入。

在这里插入图片描述

redisTemplate为我们提供了opsForxxx方法 对应五种常用类型,直接set即可
HashOperations hashOperations = redisTemplate.opsForHash();
redisTemplate.opsForHash()得到的类型为HashOperations
其他的opsForxxx也同样对应五大常用数据类型。

 @Test
    public void testString(){
        redisTemplate.opsForValue().set("city","beijing");
    }

在直接set之后,我们发现Redis数据库中并不存在city 而是:

在这里插入图片描述

这里是由于redisTemplate在往Redis数据库存入的时候进行了序列化,这里需要我们重新设置序列化器保证key不被序列化

/**
 * Redis配置类
 */

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }

RedisTemplate在由Spring管理有条件(如果我们没有配置该类则调用Spring所提供的RedisTemplate),由于在存入时RedisTemplate会将我们存入的key进行序列化(默认序列化器为:JdkSerializationRedisSerializer),所以我们需要配置新的序列化器保证存入key不被序列化,这时我们@Autowired自动注入进来的是我们所写的配置类

配置完成后,key可以被正常查出来,但是发现value也被序列化了,这里就不需要管了,因为在我们客户端查询它还会被反序列化出来

在这里插入图片描述
在这里插入图片描述

2. 操作hash类数据

操作hash数据对应的是redisTemplate.opsForHash()方法,返回值是hashOperations类型
hashOperations.put 为存值 --相当于命令行中 hset
hashOperations.get 为取值 --相当于命令行中 hget
hashOperations.keys 为获取所有字段(key值) --相当于命令行中 hkeys
hashOperations.values 为获取hash结构的所有值(value值) --相当于命令函中的hvals

 @Test
    public void testHash(){
        HashOperations hashOperations = redisTemplate.opsForHash();

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

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

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

        //获得hash结构中的所有值
        List values = hashOperations.values("002");
        for (Object value : values) {
            System.out.println(value);
        }
    }
3. 操作list类型数据

操作list数据是redisTemplate.opsForList()方法,返回类型是ListOperations
listOperations.leftPush为存值(只存一个),listOperations.leftPushAll为存值(存多个) --lpush
listOperations.range为取值 --相当于命令行lrange
listOperations.size为获取长度 --相当于命令行llen
listOperations.rightPop为移除最后一个元素 --相当于命令行rpop

    /**
     * 操作List类型的数据
     */
    @Test
    public void testList(){
        ListOperations listOperations = redisTemplate.opsForList();

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

        //取值
        List<String> mylist = listOperations.range("mylist", 0, -1);
        for (String value : mylist) {
            System.out.println(value); // d c b a
        }

        //获得列表长度 llen
        Long size = listOperations.size("mylist");
        int lSize = size.intValue();
        for (int i = 0; i < lSize; i++) {
            //出队列
            String element = (String) listOperations.rightPop("mylist");
            System.out.println(element); // a b  c d
           
        }
    }
4. 操作set类型数据(无序、不可重复)

操作set类型数据是redisTemplate.opsForSet(),返回类型为SetOperations
setOperations.add是存值,可以存一个或多个。 --对应命令行sadd
setOperations.members是取值。 --对应命令行为smembers
setOperations.remove是删除成员。 --对应命令行srem

/**
     * 操作Set类型的数据
     */
    @Test
    public void testSet(){
        SetOperations setOperations = redisTemplate.opsForSet();

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

        //取值
        Set<String> myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }

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

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

    }

5. 操作zset类型数据(有序)

操作zset类型的是redisTemplate.opsForZSet(),返回类型ZSetOperations
zSetOperations.add 存值 --zadd
zSetOperations.range 取值 --zrange
zSetOperations.remove 删除成员 --zrem

    /**
     * 操作ZSet类型的数据
     */
    @Test
    public void testZset(){
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

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

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

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

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

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

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

6.操作通用命令(针对不同的类型都可以操作)

redisTemplate.keys(“*”)获取数据库所有的key字段 --keys *
redisTemplate.hasKey判断key值是否存在 --exists (key)
redisTemplate.delete删除key – del (key)
redisTemplate.type获取指定key的类型 --type(key) 这里返回的为DataType类型,dataType.name()为其类型所对应名称

    /**
     * 通用操作,针对不同的数据类型都可以操作
     */
    @Test
    public void testCommon(){
        //获取Redis中所有的key
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

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

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

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

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值