Redis的五种数据结构

Redis的五种数据结构

一、字符串(String)

字符串是Redis最基本的数据结构,可以存储任意类型的数据,例如文本、数字等。Redis中的字符串是二进制安全的,可以进行基于字符串的操作,如设置、获取、修改、删除等。

  • 应用场景: 单值缓存、对象缓存、计数器

  • 存储结构

Redis的五种数据结构_第1张图片

  • SpringBoot中基本操作

    @Slf4j
    @RestController
    @RequestMapping("/redis/string")
    public class RedisStringController {
    
        @Resource
        private RedisTemplate redisTemplate;
    
        @GetMapping("/set")
        public void setString() {
            redisTemplate.opsForValue().set("key", 1);
        }
    
        @GetMapping("/get")
        public void getString() {
            Object key = redisTemplate.opsForValue().get("key");
            log.info("{}", key);
            if (key.equals(1)) {
                log.info("111");
            }
            if ((Integer) key == 1) {
                log.info("Integer类型");
            }
        }
    
        @GetMapping("/delete")
        public void deleteString() {
            redisTemplate.delete("key");
        }
    }
    

二、列表(List)

列表是一个有序的字符串集合,可以存储多个字符串元素。列表支持在头部或尾部进行元素的插入、删除、获取等操作,还支持根据索引进行访问和修该。列表可以用于实现队列、栈等数据结构。

  • 应用场景: 公众号最新消息

  • 存储结构

    Redis的五种数据结构_第2张图片

  • SpringBoot中基本操作

    @RestController
    @Slf4j
    @RequestMapping("/redis/list")
    public class RedisListController {
    
        @Resource
        private RedisTemplate redisTemplate;
    
        @PostMapping("/push")
        public void pushList() {
            BoundListOperations listOps = redisTemplate.boundListOps("msg:1001");
            listOps.leftPush("123");
            listOps.leftPush("456");
            listOps.rightPush("789");
            //使用list集合
    //        List list = new LinkedList<>();
    //        list.add("123");
    //        list.add("456");
    //        listOps.leftPushAll(list);
        }
    
        @PostMapping("/get")
        public void getList() {
            BoundListOperations listOps = redisTemplate.boundListOps("msg:1001");
            Object index = listOps.index(0);
            log.info("获取指定索引位置的元素: {}", index);
            List range = listOps.range(0, listOps.size() - 1);
            log.info("获取所有元素: {}", range.toString());
        }
    
        @PostMapping("/pop")
        public void popList() {
            BoundListOperations listOps = redisTemplate.boundListOps("msg:1001");
            Object leftPop = listOps.leftPop();
            log.info("从左弹出一个元素: {}", leftPop);
            Object rightPop = listOps.rightPop();
            log.info("从右弹出一个元素: {}", rightPop);
        }
    
        @PostMapping("/del")
        public void delList() {
            redisTemplate.delete("msg:1001");
        }
    }
    

三、哈希表(Hash)

哈希表是一个键值对的无序集合,其中每个键都是一个唯一的字符串,与一个值相关联。哈希表适用于存储对象,每个对象可以有多个属性。在哈希表中,可以对单个键或整个哈希表执行增删改查的操作。

  • 应用场景: 对象缓存、购物车

  • 存储结构

Redis的五种数据结构_第3张图片

  • SpringBoot中基本操作

    @Slf4j
    @RestController
    @RequestMapping("/redis/hash")
    public class RedisHashController {
    
        @Resource
        private RedisTemplate redisTemplate;
    
        @PostMapping("/set")
        public void setHash() {
            BoundHashOperations hashOps = redisTemplate.boundHashOps("user");
            hashOps.put("1:username", "张三");
            hashOps.put("1:password", "123");
            //或者使用putAll
    //        Map map = new HashMap<>();
    //        map.put("1:username", "张三");
    //        map.put("1:password", "123");
    //        hashOps.putAll(map);
            log.info("set-string");
        }
    
        @PostMapping("/get")
        public void getHash() {
            //获取所有key
            BoundHashOperations hashOps = redisTemplate.boundHashOps("user");
            Set keys = hashOps.keys();
            log.info("获取所有key: {}", keys.toString());
            //获取所有value
            List values = hashOps.values();
            log.info("获取所有value: {}", values.toString());
            //根据key获取value
            Object o = hashOps.get("1:username");
            log.info("根据key获取value: {}", o);
            //获取所有键值对集合
            Map entries = hashOps.entries();
            log.info("获取所有键值对集合: {}", entries.toString());
        }
    
        @PostMapping("/find")
        public void findHash() {
            BoundHashOperations hashOps = redisTemplate.boundHashOps("user");
            Boolean hasKey = hashOps.hasKey("1:username");
            log.info("判断hash中是否存在该键值对: {}", hasKey);
        }
    
        @PostMapping("/del")
        public void delHash() {
            //删除key(小key)
            BoundHashOperations hashOps = redisTemplate.boundHashOps("user");
            hashOps.delete("1:username");
            //直接删除hash(大key)
            redisTemplate.delete("user");
        }
    }
    

四、集合(Set)

集合是一组唯一的、无序的字符串元素的集合。集合支持添加、删除、判断元素是否存在等操作,还支持集合间的交集、并集、差集等集合运算操作。集合适用于对成员进行唯一性判断或快速查找。

  • 应用场景: 抽奖、点赞、收藏、标签、微博等平台关注模型(共同好友、可能认识的人等)

  • 存储结构

    Redis的五种数据结构_第4张图片

  • SpringBoot中基本操作

    @RestController
    @Slf4j
    @RequestMapping("/redis/set")
    public class RedisSetController {
    
        @Resource
        private RedisTemplate redisTemplate;
    
        @PostMapping("/add")
        public void addSet() {
            BoundSetOperations setOps = redisTemplate.boundSetOps("act:101");
            setOps.add("001", "002", "003");
        }
    
        @PostMapping("/member")
        public void memberSet() {
            BoundSetOperations setOps = redisTemplate.boundSetOps("act:101");
            List list = setOps.randomMembers(2);
            log.info("随机获取两个元素: {}", list.toString());
            Set members = setOps.members();
            log.info("获取所有的值: {}", members.toString());
        }
    
        @PostMapping("/find")
        public void findSet() {
            BoundSetOperations setOps = redisTemplate.boundSetOps("act:101");
            Boolean member = setOps.isMember("002");
            log.info("判断元素是否存在于set中: {}", member);
        }
    
        @PostMapping("/remove")
        public void removeSet() {
            BoundSetOperations setOps = redisTemplate.boundSetOps("act:101");
            Long remove = setOps.remove("002");
            log.info("移除指定的元素个数: {}", remove);
        }
    
        @PostMapping("/del")
        public void delSet() {
            redisTemplate.delete("act:101");
        }
    }
    

五、有序集合(ZSet)

有序集合是一个有序的字符串集合,每个字符串都与一个分数相关联。有序集合按照分数进行排序,可以根据分数范围或成员值进行范围查询。有序集合常用于排行榜、排序等场景。

  • 应用场景: 排行榜、带权重的任务调度

  • 存储结构

Redis的五种数据结构_第5张图片

  • SpringBoot中基本操作

    @RestController
    @Slf4j
    @RequestMapping("/redis/zset")
    public class RedisZSetController {
    
        @Resource
        private RedisTemplate redisTemplate;
    
        @GetMapping("/add")
        public void addZSet() {
            BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602");
            zSetOps.add("李四", 2);
            zSetOps.add("王五", 1);
            zSetOps.add("刘留", 3);
            zSetOps.add("赵六", 4);
            zSetOps.add("张三", 6);
        }
    
        @GetMapping("/range")
        public void rangeZSet() {
            BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602");
            Set range = zSetOps.range(0, -1);
            log.info("获取ZSet中所有的元素:{}", range);
        }
    
        @GetMapping("/rangeByScore")
        public void rangeByScoreZSet() {
            BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602");
            Set range = zSetOps.rangeByScore(2, 4);
            log.info("获取ZSet中指定score范围中的元素:{}", range);
        }
    
        @GetMapping("/size")
        public void sizeZSet() {
            BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602");
            Long size = zSetOps.size();
            log.info("获取ZSet中元素的长度:{}", size);
        }
    
        @GetMapping("/incrementScore")
        public void incrementScoreZSet() {
            BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602");
            log.info("获取ZSet中增加前[张三]的score:{}", zSetOps.score("张三"));
            zSetOps.incrementScore("张三", 3);
            log.info("获取ZSet中增加后[张三]的score:{}", zSetOps.score("张三"));
        }
    
        @GetMapping("/count")
        public void countZSet() {
            BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602");
            Long count = zSetOps.count(2, 6);
            log.info("获取ZSet中指定score范围内的个数:{}", count);
        }
    
        @GetMapping("/remove")
        public void removeZSet() {
            BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602");
            log.info("获取ZSet中移除[李四]之前的元素:{}", zSetOps.range(0,-1));
            zSetOps.remove("李四");
            log.info("获取ZSet中移除[李四]之后的元素:{}", zSetOps.range(0,-1));
        }
    }
    

你可能感兴趣的:(java,redis,缓存)