目 录CONTENT

文章目录

Redis中数据类型在客户端应用

zhouzz
2024-09-07 / 0 评论 / 0 点赞 / 10 阅读 / 28068 字
温馨提示:
本文最后更新于 2024-09-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.准备

我们来学习如何使用Spring Data Redis来操作Redis的各种数据类型.

在Redis中有五种常见类型,SpringData Redis对每一种数据类型都提供了一个xxxOperations的API,他们分别是:

  • ValueOperations :用来操作字符串类型数据
  • HashOperations:用来操作hash类型数据
  • ListOperations:用来操作list类型数据
  • SetOperations:用来操作set类型数据
  • ZSetOperations:用来操作zset类型数据

2.String类型

@SpringBootTest
public class RedisStringTest {
    ObjectMapper objectMapper = new ObjectMapper();
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void testString() throws JsonProcessingException {
        //获取ValueOperations对象
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();

        //向Redis中保存 aa:bb
        operations.set("aa", "bb");

        //相关Redis保存 aa1-- bb1  有效时间为10s
        operations.set("aa1", "bb1", 10, TimeUnit.SECONDS);

        //替换 bb    --->   cc   offset 索引位置是从0开始
        operations.set("aa", "XX", 1);

        //当key不存在的时候,执行保存操作; 当key存在的时候,什么都不做
        operations.setIfAbsent("aa1", "ddd");

        //批量保存
        Map map = new HashMap();
        map.put("aa2", "aa2");
        map.put("aa3", "aa3");
        map.put("aa4", "aa4");

        operations.multiSet(map);

        //追加 当key存在时,会执行追加操作;当key不存在时,会执行保存操作
        operations.append("aa5", "aa5");

        UserEntity user = new UserEntity();
        user.setUsername("张三");
        user.setAge(22);

        String key = "user:info:1001";
        // 保存
        operations.set(key, objectMapper.writeValueAsString(user), 10, TimeUnit.MINUTES);
    }

    @Test
    public void testGet() {
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();

        //根据key获取value
        String value = operations.get("aa");
        System.out.println(value);

        //首先根据key获取value,然后再根据value进行截取,从start位置截取到end位置[包含start和end]
        String value2 = operations.get("aa", 5, 7);
        System.out.println(value2);

        //批量获取
        List<String> keys = new ArrayList<>();
        keys.add("aa2");
        keys.add("aa3");
        keys.add("aa4");
        List<String> values = operations.multiGet(keys);
        for (String s : values) {
            System.out.println(s);
        }

        //根据key获取value的长度
        Long size = operations.size("aa");
        System.out.println(size);
    }

    //自增
    @Test
    public void testIncrement() {
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();

        operations.set("age", "18");
        operations.increment("age");//自增1--->19
        System.out.println(operations.get("age"));
        operations.increment("age", 5);//自增5
        System.out.println(operations.get("age"));//---->24

        //自减
        operations.decrement("age");
    }

    //删除
    @Test
    public void testDelete() {
        //单个删除
        stringRedisTemplate.delete("aa");

        List<String> keys = new ArrayList<>();
        keys.add("aa2");
        keys.add("aa3");
        keys.add("aa4");

        //批量删除
        stringRedisTemplate.delete(keys);
    }
}

3.Hash类型

@SpringBootTest(classes = RedisApplication.class)
public class RedisHashTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //保存
    @Test
    public void testPut() {
        HashOperations<String, String, Object> operations = stringRedisTemplate.opsForHash();

        Map<String, Object> map = new HashMap<>();
        map.put("id", String.valueOf(System.currentTimeMillis()));
        map.put("title", "我的奋斗");
        map.put("author", "李四");
        map.put("createTime", String.valueOf(new Date().getTime()));

        operations.putAll("article:1001", map);
    }

    //获取
    @Test
    public void testGet() {
        HashOperations<String, String, String> operations = stringRedisTemplate.opsForHash();

        String key = "article:1001";
        //判断hashkey是否存在
        Boolean idFlag = operations.hasKey(key, "id");
        System.out.println("idFlag=" + idFlag);

        //根据key和hash kay获取操作
        Object id = operations.get(key, "id");
        System.out.println("id=" + id);

        //根据key获取所有的 hash key
        Set<String> set = operations.keys(key);
        for (String s : set) {
            System.out.println("hash key:" + s);
        }

        List<String> values = operations.values(key);
        for (Object art : values) {
            System.out.println("hash value:" + art);
        }

        Map<String, String> entries = operations.entries(key);
        System.out.println("------------x------------");
        for (Map.Entry<String, String> entry : entries.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

    //删除
    @Test
    public void testDelete() {
        HashOperations<String, String, String> operations = stringRedisTemplate.opsForHash();
        String key = "article:1001";
        //当hash中的数据全部被删除后,整个hash就没了
        operations.delete(key, "title", "createTime");
    }
}

4.List类型

@SpringBootTest(classes = RedisApplication.class)
public class RedisListTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //增加
    @Test
    public void testAdd() {
        ListOperations<String, String> operations = stringRedisTemplate.opsForList();
        // 将所有指定的值插入存储在键的列表的头部(或尾部)。
        // 如果键不存在,则在执行推送操作之前将其创建为空列表。
        operations.leftPush("names", "zhangsan");
        operations.leftPushAll("names", "lisi", "wangwu", "zhaoliu");

        operations.rightPush("names", "sunqi");
        operations.rightPushAll("names", "lisi", "wangwu", "zhaoliu");
    }

    //根据索引查询元素
    @Test
    public void testFind() {
        ListOperations<String, String> operations = stringRedisTemplate.opsForList();
        //0代表左边开始第一个元素
        String name1 = operations.index("names", 0);
        System.out.println(name1);

        //-1代表右边开始第一个元素
        String name2 = operations.index("names", -1);
        System.out.println(name2);

        //range代表一个范围(包含开始索引,结束索引)
        List<String> names = operations.range("names", 0, 1);
        for (String name : names) {
            System.out.println(name);
        }
    }

    //移除某个元素的值
    @Test
    public void testRemove() {
        ListOperations<String, String> operations = stringRedisTemplate.opsForList();
        //从坐标或者右边弹出第一个元素
        operations.rightPop("names");

        //弹出指定的元素
        // count > 0:删除左边起第几个等于指定值的元素
        // count < 0:删除右边起第几个等于指定值的元素
        // count = 0:删除所有等于value的元素。
        operations.remove("names", 1, "zhangsan");
    }
}

5.Set类型

@SpringBootTest(classes = RedisApplication.class)
public class RedisSetTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //添加
    @Test
    public void testAdd() {
        SetOperations<String, String> operations = stringRedisTemplate.opsForSet();

        operations.add("names", "zhangsan", "li", "wangwu");
    }

    //查看集合中元素
    @Test
    public void testFind() {
        SetOperations<String, String> operations = stringRedisTemplate.opsForSet();

        //查询集合中的所有元素
        operations.members("names");

        //随机获取集合中的一个元素
        String name = operations.randomMember("names");
        System.out.println(name);

        //随机获取集合中的多个元素
        operations.randomMembers("names", 2).stream().forEach(System.out::println);
    }

    //移除元素
    @Test
    public void testRemove() {
        SetOperations<String, String> operations = stringRedisTemplate.opsForSet();

        //根据指定的key--value进行移除
        operations.remove("names", "zhangsan", "li");

        //根据key随机移除并返回value
        String name = operations.pop("names");
        System.out.println(name);
    }

    //多集合的操作
    @Test
    public void testMoreSet() {
        SetOperations<String, String> operations = stringRedisTemplate.opsForSet();

        operations.add("names1", "zhangsan", "li", "wangwu");
        operations.add("names2", "zhangsan", "li", "zhaoliu");

        //取交集
        operations.intersect("names1", "names2").stream().forEach(System.out::println);

        //取并集
        operations.union("names1", "names2").stream().forEach(System.out::println);

        //取差集
        operations.difference("names1", "names2").stream().forEach(System.out::println);
    }

}

6.ZSet类型

@SpringBootTest
public class RedisZSetTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //添加
    @Test
    public void testAdd() {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();

        operations.add("students", "zhangsan", 100);
        operations.add("students", "lisi", 80);
        operations.add("students", "wangwu", 90);
    }

    //增减分数
    @Test
    public void testScore() {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();
        //根据key-value来增减分数
        operations.incrementScore("students", "lisi", -50);
    }

    //查询一个元素的信息
    @Test
    public void testFindOne() {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();
        //查询个人分数
        Double score = operations.score("students", "lisi");
        System.out.println(score);

        //查询个人排名
        Long rank = operations.rank("students", "lisi");
        System.out.println(rank);
    }

    //列表查询:分为两大类,正序和逆序。以下只列表正序的,逆序的只需在方法前加上reverse即可
    @Test
    public void testFindList() {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();
        //通过排名区间获取集合元素
        Set<String> students1 = operations.range("students", 1, 2);
        for (String stu : students1) {
            System.out.println(stu);
        }

        //通过排名区间获取集合元素和分数
        Set<ZSetOperations.TypedTuple<String>> students2 =
                operations.rangeWithScores("students", 1, 2);
        for (ZSetOperations.TypedTuple<String> tuple : students2) {
            String value = tuple.getValue();
            Double score = tuple.getScore();
            System.out.println("value-->" + value + ",score-->" + score);
        }

        //通过分数区间获取集合元素
        Set<String> students3 = operations.rangeByScore("students", 80, 90);
        for (String stu : students3) {
            System.out.println(stu);
        }

        //通过分数区间获取集合元素和分数
        Set<ZSetOperations.TypedTuple<String>> students4 =
                operations.rangeByScoreWithScores("students", 80, 90);
        for (ZSetOperations.TypedTuple<String> tuple : students4) {
            String value = tuple.getValue();
            Double score = tuple.getScore();
            System.out.println("value-->" + value + ",score-->" + score);
        }
    }

    //统计元素
    @Test
    public void testCount() {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();
        //统计集合大小
        Long zCard = operations.zCard("students");
        System.out.println(zCard);

        //统计分数区间的元素数量
        Long count = operations.count("students", 85, 95);
        System.out.println(count);
    }

    //移除元素
    @Test
    public void testRemove() {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();
        //通过key--value删除
        operations.remove("students", "zhangsan");

        //通过排名区间删除
        operations.removeRange("students", 0, 1);

        //通过分数区间删除
        operations.removeRangeByScore("students", 80, 90);
    }
}

7.小结

0

评论区