美文网首页
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