Java中怎么操作Reids?

本文详细介绍了如何在Spring应用中集成和使用SpringDataRedis,包括依赖管理、配置、RedisTemplate的使用以及对五种数据类型(String、Hash、List、Set和ZSet)的操作示例。

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

本文章重点讲解Spring Data Redis。

Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。

想要在Java客户端中操作Redis首先需要在pom文件中导入maven坐标:

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

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

  • ValueOperations:string数据操作

  • SetOperations:set类型数据操作 无序存储

  • ZSetOperations:zset类型数据操作 每个成员由一个浮点类型的分数 有序存储

  • HashOperations:hash类型的数据操作 散列 适合存储对象

  • ListOperations:list类型的数据操作 列表 顺序存储

在application配置文件中指定端口号等信息:

sky:
  redis:
    host: localhost //IP地址
    port: 6379 //端口号
    database: 10 //要操作的数据库

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

编写配置类,创建RedisTemplate对象:

当前配置类不是必须的,Spring Boot 框架会自动装配 RedisTemplate 对象,默认的key序列化器为JdkSerializationRedisSerializer,这里的操作是将key序列化器设置为StringRedisSerializer序列化器。

@Configuration
@Slf4j
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建redis模板对象...");
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

新建测试类:

@SpringBootTest
public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testRedisTemplate(){
        System.out.println(redisTemplate);
        //string数据操作 可以存储任意类型的数据,包括文本、数字、图片等
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //hash类型的数据操作 一个存储空间保存多个键值对数据非常适合存储对象
        HashOperations hashOperations = redisTemplate.opsForHash();
        //list类型的数据操作  成员有序排列
        ListOperations listOperations = redisTemplate.opsForList();
        //set类型数据操作 不能有重复成员无序排列
        SetOperations setOperations = redisTemplate.opsForSet();
        //zset类型数据操作 不能有重复成员且每个成员都有一个浮点类型的分数
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }
}

启动测试类,说明RedisTemplate对象注入成功,并且通过该RedisTemplate对象获取操作5种数据类型相关对象。

接下来对5种常见类型进行操作

1、String字符串类型数据

    /**
     * 操作字符串类型的数据
     */
    @Test
    public void testString(){
        //set设置key值 
        redisTemplate.opsForValue().set("name","月亮");

        //get 获取key值
        String city = (String) redisTemplate.opsForValue().get("name");
        System.out.println(city);

        //设置该键值3分钟后过期
        redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);

        //setIfAbsent当key不存在时设置key的值
        redisTemplate.opsForValue().setIfAbsent("lock","1");
        redisTemplate.opsForValue().setIfAbsent("lock","2");

        String lock = (String) redisTemplate.opsForValue().get("lock");
        System.out.println(lock);
    }

运行该测试方法:

同时可以打开Redis可视化工具查看数据的存储:

2、Hash哈希类型数据

    /**
     * 操作哈希类型的数据
     */
    @Test
    public void testHash(){
        //创建hash操作对象
        HashOperations hashOperations = redisTemplate.opsForHash();

        //put 设置hash表中的键和字段
        hashOperations.put("LOL","name","盖伦");
        hashOperations.put("LOL","age","20");

        //get 获取指定字段的值
        String name = (String) hashOperations.get("LOL", "name");
        System.out.println(name);

        //获取键中字段的key
        Set keys=hashOperations.keys("LOL");
        System.out.println(keys);

        //获取key中字段的value值
        List values=hashOperations.values("LOL");
        System.out.println(values);

        //删除指定字段
        hashOperations.delete("100","age","name");
    }

运行该测试方法:

Redis中存储:

3、List顺序类型数据

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

        //leftPushAll 将多个值插入列表头部 先插入的数据在最后
        listOperations.leftPushAll("MM","小七","小樱","小枫","小山");

        //leftPush 向列表中插入单个值
        listOperations.leftPush("MM","神木丽");

        //range获取列表中指定范围内的元素
        List mm= listOperations.range("MM", 0, -1);
        System.out.println(mm);

        //rightPop移除列表中的最后一个元素
        listOperations.rightPop("MM");

        //range获取列表中指定范围内的元素(0,-1)就是所有数据
        List mm1= listOperations.range("MM", 0, -1);
        System.out.println(mm1);

        //获取列表的大小
        Long size = listOperations.size("MM");
        System.out.println(size);
    }

运行该测试方法:

Redis中存储:

4、Set无序集合类型数据

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

        //add向集合添加一个或多个成员
        setOperations.add("set1","a","b","c","d");
        setOperations.add("set2","a","b","x","y");

        //members返回集合中的所有成员
        Set members = setOperations.members("set1");
        System.out.println(members);

        //获取集合的成员数
        Long size = setOperations.size("set1");
        System.out.println(size);

        //获取指定集合的交集
        Set intersect = setOperations.intersect("set1", "set2");
        System.out.println(intersect);

        //获取指定集合并集
        Set union = setOperations.union("set1", "set2");
        System.out.println(union);

        //移除集合中的成员
        setOperations.remove("set1","a","b");
    }

运行该测试方法:

Redis中存储:

5、ZSet有序集合类型数据

//操作有序集合类型的数据
    @Test
    public void testZset(){
        
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        //向集合中添加成员
        zSetOperations.add("A","花",99);
        zSetOperations.add("A","枫",88);
        zSetOperations.add("A","七",66);

        //返回指定范围内集合的成员
        Set zset = zSetOperations.range("A", 0, -1);
        System.out.println(zset);

        //给集合中指定成员的分数加增量
        zSetOperations.incrementScore("A","枫",10);

        //移除指定成员
        zSetOperations.remove("A","七");
    }

运行该测试方法:

Redis中存储:

通用命令

    /**
     * 通用命令操作
     */

    @Test
    public void testCommon(){
        
        //查找所有key
        Set keys = redisTemplate.keys("*");
        System.out.println(keys);

        //检查给定的key是否存在
        Boolean name = redisTemplate.hasKey("name");
        Boolean av = redisTemplate.hasKey("A");

        //遍历所有key存储的数据类型
        for (Object key : keys) {
            DataType type = redisTemplate.type(key);
            System.out.println(type.name());
        }
        //删除指定key
        redisTemplate.delete("MM");
        redisTemplate.delete("LOL");
        redisTemplate.delete("lock");
        redisTemplate.delete("name");

    }

运行该测试方法:

Redis中存储:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值