Home 成长之路 Redis实现关注列表,共同关注等(Set实践)

Redis实现关注列表,共同关注等(Set实践)

0 52

运行环境和另一篇博客(Zset)的一样,读者需要可自行查找:http://yangbili.co/redis%e6%88%90%e7%bb%a9%e6%8e%92%e8%a1%8c%e6%a6%9c%e5%ae%9e%e7%8e%b0%ef%bc%88set%ef%bc%89/

废话不多说,直接上代码:

 



import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.List;
import java.util.Set;


/**
 * 2021.4.2
 * 学习了Redis的基本数据类型,决定在Springboot环境下进行使用
 *
 * 目的:实现对其他人的查询,添加,删除及共同好友的查看
 * 采用Set数据结构,
 */

@SpringBootTest
public class YangSetTest {


    //注入rediTemplate
    @Autowired
    private RedisTemplate<String,String> redisTemplate;


    //创建用户A
    private final String ANAME = "咩咩咩";

    //创建用户B
    private final String BNAME = "大黑狗";

    /*1.批量添加关注列表,模拟从数据库中获得*/
    @Test
    void batchAdd() {
        Long start = System.currentTimeMillis();
        for(int i = 0; i < 10; i++){
            redisTemplate.opsForSet().add(ANAME,i+"号明星");
        }
        System.out.println("添加成功");
        System.out.println("批量新增关注所消耗的时间:"+(System.currentTimeMillis()-start));
    }

    /*2.关注某人*/
    @Test
    void add(){
        redisTemplate.opsForSet().add(BNAME,"电气鼠");
        System.out.println("关注成功");
    }

    /*3.获取当前的关注总数(基数)*/
    @Test
    void getCardNum(){
        Long size = redisTemplate.opsForSet().size(ANAME);
        System.out.println(ANAME+"的关注总数为:"+size);
    }

    /*4.取消单个关注*/
    @Test
    void remmove(){
        redisTemplate.opsForSet().remove(ANAME,"3号关注");
        System.out.println("取消成功");
    }

    /*5.查找单个关注*/
    @Test
    void selete(){
        Boolean member = redisTemplate.opsForSet().isMember(ANAME, BNAME);
        if(member == true){
            System.out.println("名为"+BNAME+"的人是"+ANAME+"的关注!");
        }
        else {
            System.out.println("对方不是+"+ANAME+"的关注!");
        }
    }

    /** 6.事务,A添加B,B同意
     *  那么A的列表和B的列表都要变化
     *  如果只有一个有变化,那么添加失败
     */
    @Test
    void addMulti() {
        //开启乐观锁(模拟多线程下)
        //这里假设B是明星,多个人关注B
        redisTemplate.watch(BNAME);
        //开启事务
        redisTemplate.multi();
        try {
            //A关注B
            redisTemplate.opsForSet().add(ANAME, BNAME);
            //B的粉丝列表也要变化;
            redisTemplate.opsForSet().add(BNAME, ANAME);
            System.out.println("关注成功!");
        } catch (Exception e) {
            System.out.println("出现错误!关注失败,事务取消");
            //取消事务,事务队列中的所有命令都不会被执行
            redisTemplate.discard();
            //解锁
            redisTemplate.unwatch();
        }
    }

    /*7.看破红尘,取消所有关注*/
//    @Test
//    void removerAll(){
//        重复调用remove()方法
//        redisTemplate.opsForSet().remove(ANAME,"","");
//    }

    /*8.一览天下,获取用户关注列表*/
    @Test
    void lookMem(){
        //调用psForSet().members
        Set<String> members = redisTemplate.opsForSet().members(BNAME);
        //使用JSON.toJSONString(Object)将对象转换为JSON字符串
        System.out.println(JSON.toJSONString(members));
    }

    /*9.宠幸后宫,翻牌子随机获取一个关注对象*/
    @Test
    void randomLookMem(){
        //调用psForSet().members
        String s = redisTemplate.opsForSet().randomMember(ANAME);
        System.out.println(s);
    }

    /*10.多人运动,随机选出关注列表中的元素,获取多个关注对象*/
    @Test
    void randomLookMems(){
        //个数为:3
        List<String> strings = redisTemplate.opsForSet().randomMembers(ANAME,3);
        System.out.println(strings);
    }

    /*11.推荐关注,将用户A关注列表中的对象推送给B*/
    @Test
    void move() {
        //调用opsForSet().move()方法
        redisTemplate.opsForSet().move(ANAME,"8号明星",BNAME);
        System.out.println("推荐关注成功!");
    }

    /**
     * 12.并,差,交及的使用
     *
     * 交集,可做共同关注
     * 实验步骤:
     * 1.先往用户A,B中添加共同关注对象"电气鼠"
     * 2.查看二者的共同关注(也可以获得多个,略)
     */
    @Test
    void comment(){
        Set<String> intersect = redisTemplate.opsForSet().intersect(ANAME, BNAME);
        System.out.println(ANAME+"和"+BNAME+"的共同关注对象为:"+intersect);
        System.out.println(ANAME+"和"+BNAME+"都是LSP...");
    }

    /*并集,统计两个用户的关注对象之合*/
    @Test
    void union(){
        Set<String> union = redisTemplate.opsForSet().union(ANAME, BNAME);
        System.out.println(ANAME+"和"+BNAME+"的关注合列表为:"+union);
    }

    /*差集,可以判断用户之间的关注差异*/
    @Test
    void differ(){
        Set<String> difference = redisTemplate.opsForSet().difference(ANAME, BNAME);
        System.out.println(ANAME+"和"+BNAME+"的关注列表差集为:"+difference);
        System.out.println("根据此功能也可以推送让B用户关注其他");
    }

}

SIMILAR ARTICLES

发表评论

发表评论