基于Redis的高并发随机展示 - Set实战之QQ群、微博好友随机推荐

Set实战之QQ群、微博好友随机推荐

QQ群随机推荐

image-20210523194426809

微博随机推荐

image-20210523194630209

随机展示业务场景分析

为什么要随机展示?
因为展示的区域有限,在那么小的地方展示全部数据是不可能的,通常的做法就是随机展示一批数据,然后用户点击“换一换”按钮,再随机展示另一批。

随机展示的redis技术方案

上文已经说了随机展示的原因就是区域有限,而区域有限的地方通常就是首页或频道页,这些位置通常都是访问量并发量非常高的,
一般是不可能采用数据库来实现的,通常都是Redis来实现。
redis的实现技术方案:
步骤1:先把数据准备好,把所有需要展示的内容存入redis的Set数据结构中。
步骤2:通过srandmember命令随机拿一批数据出来。

实现QQ群随机推荐

数据模拟

@Component
public class TaskCrowdService {

    @Autowired
    private RedisTemplate redisTemplate;

    public static final String CROWD_KEY = "crowd";

    /**
     *提前先把数据刷新到redis缓存中。
     */
    @PostConstruct
    public void init(){
        List<String> crowds=this.crowd();
        this.redisTemplate.delete(CROWD_KEY);
        crowds.forEach(t->this.redisTemplate.opsForSet().add(CROWD_KEY,t));
    }

    /**
     * 模拟100个热门群,用于推荐
     */
    public List<String> crowd() {
        List<String> list=new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Random rand = new Random();
            int id= rand.nextInt(100000);
            list.add("群"+id);
        }
        return list;
    }

}

接口实现

@GetMapping(value = "/crowd")
public List<String> crowd() {
    List<String> list=null;
    try {
        //采用redis set数据结构,随机取出10条数据
        list = this.redisTemplate.opsForSet().randomMembers(TaskCrowdService.CROWD_KEY,10);
    } catch (Exception ex) {
        //这里的异常,一般是redis瘫痪 ,或 redis网络timeout
        //TODO 走DB查询
    }
    return list;
}

实现微博榜单随机推荐

微博榜单和QQ群的区别是:微博榜单是整块数据的,所以随机的数据要按块来推荐。所以我们要定义一个java bean来包装整块数据。

什么叫按块分数据的?意思是榜单是不同的,如知音漫画榜、亚洲娱乐榜等等。

构建javaBean

@Data
public class WeiboList {
    
    private int id;
    /**
     * 榜单名称
     */
    private String name;

    private List<String> users;

}

模拟数据

@Component
public class TaskWeibolistService {

    @Autowired
    private RedisTemplate redisTemplate;

    public static final String WEIBO_LIST_KEY = "weibo:list";
    
    @PostConstruct
    public void init() {
        List<WeiboList> crowds = this.list();
        redisTemplate.delete(WEIBO_LIST_KEY);
        crowds.forEach(t->redisTemplate.opsForSet().add(WEIBO_LIST_KEY,t));
    }

    /**
     * 模拟10个热门榜单,用于推荐
     */
    public List<WeiboList> list() {
        List<WeiboList> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            WeiboList wl = new WeiboList();
            wl.setId(i);
            wl.setName("榜单" + i);
            Random rand = new Random();
            List<String> users = new ArrayList<>();
            for (int j = 0; j < 3; j++) {
                int id = rand.nextInt(10000);
                users.add("user:" + id);
            }
            wl.setUsers(users);
            list.add(wl);
        }
        return list;
    }
}

编写随机查询接口

@GetMapping(value = "/weibolist")
public WeiboList weibolist() {
    WeiboList list=null;
    try {
        //随机取1块数据
        list = (WeiboList)this.redisTemplate.opsForSet().randomMember(TaskWeibolistService.WEIBO_LIST_KEY);
    } catch (Exception ex) {
        //这里的异常,一般是redis瘫痪 ,或 redis网络timeout
        //TODO 走DB查询
    }
    return list;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV大魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值