美文网首页
redis常用数据类型以及使用场景

redis常用数据类型以及使用场景

作者: 小方块886 | 来源:发表于2021-04-04 22:54 被阅读0次

    redis常用数据类型: string hash list set zset

    本文使用stringRedisTemplate作为测试对象

            // string
            stringRedisTemplate.opsForValue();
            // hash
            stringRedisTemplate.opsForHash();
            // list
            stringRedisTemplate.opsForList();
            // set
            stringRedisTemplate.opsForSet();
            // zSet
            stringRedisTemplate.opsForZSet();
    

    string

        /**
         * 应用场景:用户基本信息等等,基本适用很多场景
         * 数据结构是key value
         */
        @GetMapping("value")
        public void value(){
           // 设置一个String类型的数据
            stringRedisTemplate.opsForValue().set("user:001","张三");
            // 设置一个String类型的数据,并家上过期时间
            stringRedisTemplate.opsForValue().set("user:001","张三",600, TimeUnit.SECONDS);
            // 获取String类型的数据
            stringRedisTemplate.opsForValue().get("user:001");
            // 设置过期时间
            stringRedisTemplate.expire("user:001", 600, TimeUnit.SECONDS);
            // 获取过期时间
            stringRedisTemplate.getExpire("user:001");
            // 删除String类型的数据
            stringRedisTemplate.delete("user:001");
        }
    

    hash

         /**
         * 应用场景:电商购物车等
         * 数据结构是 h hk hv
         * h为用户id
         * hk为商品id
         * hv为商品数量
         */
        @GetMapping("hash")
        public void hash(){
            // 使用缺点1: Hash无法为里面的hk元素设置过期时间,只能针对最外面的h设置过期时间
            // 使用缺点2: 如果一个h过大的话,会有问题,全量查询的时候速度会很慢
    
            // 添加一个商品,注意,如果key相同,后面的会覆盖前面的
            stringRedisTemplate.opsForHash().put("user:001","10086","1");
            stringRedisTemplate.opsForHash().put("user:001","10087","2");
            // 获取一个商品数据
            stringRedisTemplate.opsForHash().get("user:001", "10086");
            // 商品数量 +1
            stringRedisTemplate.opsForHash().increment("user:001","10086",1);
            // 获取商品总数
            stringRedisTemplate.opsForHash().size("user:001");
            // 获取所有商品
            stringRedisTemplate.opsForHash().entries("user:001");
            // 删除Hash类型的数据
            stringRedisTemplate.opsForHash().delete("user:001","10086");
        }
    

    list

        /**
         * 应用场景:消息队列
         * list是一个个集合,redis支持可以从左边或者从右边添加元素
         * k:用户id
         * v:消息id
         */
        @GetMapping("list")
        public void list(){
            // 从左边添加消息
            stringRedisTemplate.opsForList().leftPush("user:007","message:10086");
            stringRedisTemplate.opsForList().leftPush("user:007","message:10087");
            // 从右边添加消息
            stringRedisTemplate.opsForList().rightPush("user:007","message:10088");
            // 批量插入
            stringRedisTemplate.opsForList().leftPushAll("user:007","message:10088","message:10099","message:10010");
            // 从左边获取一条消息
            stringRedisTemplate.opsForList().leftPop("user:007");
            // 从右边获取一条消息
            stringRedisTemplate.opsForList().rightPop("user:007");
            // 获取所有消息,从最左边的元素开始遍历
            List<String> range1 = stringRedisTemplate.opsForList().range("user:007", 0, -1);
            // 获取最新两条消息,从最左边开始获取两个消息
            List<String> range = stringRedisTemplate.opsForList().range("user:007", 0, 1);
            // 删除一条消息,如果有多条10086消息,会从左边删除第一条
            stringRedisTemplate.opsForList().remove("user:007",1,"message10086");
            // 删除所有10086的消息
            stringRedisTemplate.opsForList().remove("user:007",0,"message10086");
    
        }
    

    set

         /**
         * 应用场景:抽奖模型 关注模型等
         * set也是一个集合,不会存在重复的元素
         */
        @GetMapping("set")
        public void set(){
            System.out.println("========抽奖模型============");
            // 添加用户001 002 003到用户集合中
            stringRedisTemplate.opsForSet().add("user","001","002","003");
            // 获取所有的用户
            stringRedisTemplate.opsForSet().members("user");
            // 随机抽取一位用户,抽到后不会从集合中删除
            stringRedisTemplate.opsForSet().randomMember("user");
            // 随机抽取两位两户,抽到后不会从集合中删除
            stringRedisTemplate.opsForSet().randomMembers("user", 2);
            // 随机抽取一位用户,抽到后会从集合中删除
            stringRedisTemplate.opsForSet().pop("user",1);
            Long user = stringRedisTemplate.opsForSet().size("user");
    
            System.out.println("========微信朋友圈点赞模型============");
            // 用户001给朋友圈的消息点赞
            stringRedisTemplate.opsForSet().add("message:1000","user:001");
            // 用户001取消点赞
            stringRedisTemplate.opsForSet().remove("message:1000","user:001");
            // 查看用户是否点赞
            Boolean member = stringRedisTemplate.opsForSet().isMember("message:1000", "user:001");
            // 获取点赞列表
            Set<String> members = stringRedisTemplate.opsForSet().members("message:1000");
    
            System.out.println("========关注模型============");
            // 有两个两户张三和王五,分别关注了自己喜欢明星的微博
            stringRedisTemplate.opsForSet().add("user:张三","胡歌","刘亦菲","王一博","蔡徐坤");
            stringRedisTemplate.opsForSet().add("user:王五","胡歌","刘亦菲","邓超","李晨");
            // 求交集,共同关注模型(微信的朋友圈点赞也类似,好友发的朋友圈有很多人点赞,但是我只能看到共同好友的点赞和评论)
            Set<String> intersect = stringRedisTemplate.opsForSet().intersect("user:张三", "user:王五");
            // 求差集,可能认识的人模型 (王五跟张三是好友,那么张三认识的明星可能王五也认识)
            Set<String> difference = stringRedisTemplate.opsForSet().difference("user:张三", "user:王五");
        }
    

    zSet

       @GetMapping("zSet")
        public void zSet(){
            System.out.println("====ZSet集合和set是一样的,ZSet提供了集合的有序性===");
        }
    

    相关文章

      网友评论

          本文标题:redis常用数据类型以及使用场景

          本文链接:https://www.haomeiwen.com/subject/vsrrkltx.html