小工具知识网

当前位置: 首页 > 行业知识 > Redis的五种数据结构

行业知识

Redis的五种数据结构

2026-10-19 00:09:00 来源:互联网转载

Redis的五种数据结构

一、字符串(String)

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

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

  • 存储结构

    • 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)

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

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

      • 存储结构

      • 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)

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

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

        • 存储结构

          • 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)

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

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

            • 存储结构

            • 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)

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

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

              • 存储结构

                • 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));    }}

上一篇:服务器问题原因分析怎么写?

下一篇:一玩吃鸡游戏主机就蓝屏