感兴趣的人、榜单、QQ群随机展示解决方案
「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战」
随机展示业务场景分析
- 在电商平台中,因为展示的
区域有限
,在很小的地方展示全部数据是不可能的,通常的做法就是随机展示一批数据,然后用户点击“换一换
”按钮,再随机展示另一批。 - 如果推荐的数据太多,也不可能一下加载全部,对网络资源也是一个问题。
随机展示的redis技术方案
上文已经说了随机展示的原因就是区域有限,而区域有限的地方通常就是首页
或频道页
,这些位置通常都是访问量高并发量
的,一般是不可能采用数据库来实现的,通常都是Redis来实现。
redis的实现技术方案:
- 步骤1:先把数据准备好,把所有需要展示的内容存入redis的Set数据结构中。
- 步骤2:通过srandmember命令随机拿一批数据出来。
感兴趣的人,QQ群随机推荐
QQ群随机推荐 微博感兴趣的人推荐
步骤1:提前先把数据刷新到redis缓存中。
/**
*刷数据到redis缓存中
*/
@PostConstruct
public void init(){
log.info("启动初始化qq群..........");
List<String> crowds=this.crowd();
this.redisTemplate.delete(Constants.CROWD_KEY);
//set结构
crowds.forEach(t->this.redisTemplate.opsForSet().add(Constants.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(10000);
list.add("群"+id);
}
return list;
}
复制代码
步骤2:编写随机查询接口
@GetMapping(value = "/crowd")
public List<String> crowd() {
List<String> list=null;
try {
//采用redis set数据结构,随机取出10条数据
list = this.redisTemplate.opsForSet().randomMembers(Constants.CROWD_KEY,10);
log.info("查询结果:{}", list);
} catch (Exception ex) {
//这里的异常,一般是redis瘫痪 ,或 redis网络timeout
log.error("exception:", ex);
//TODO 走DB查询
}
return list;
}
复制代码
微博榜单随机推荐
微博榜单和QQ群的区别是: 微博榜单是整块数据的,点击换一换是另一个榜单的数据,而QQ群是随机展示的群,换一换还是推荐的群,并没有块的概念。所以随机的数据要按块来推荐所以我们要定义一个java bean来包装整块数据
热搜榜单推荐:
点击换一换,整个榜单如下:
步骤1:提前先把数据刷新到redis缓存中。
@Data
public class WeiboList {
private int id;
/**
* 榜单名称
*/
private String name;
private List<String> users;
}
复制代码
/**
* 定时把数据库的 ,刷新到redis缓存中。
*/
@PostConstruct
public void init(){
log.info("启动初始化 榜单..........");
List<WeiboList> crowds=this.list();
this.redisTemplate.delete(Constants.WEIBO_LIST_KEY);
crowds.forEach(t->this.redisTemplate.opsForSet().add(Constants.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;
}
复制代码
步骤2:编写随机查询接口
@GetMapping(value = "/weibolist")
public WeiboList weibolist() {
WeiboList list=null;
try {
//随机取1块数据
list = (WeiboList)this.redisTemplate.opsForSet().randomMember(Constants.WEIBO_LIST_KEY);
log.info("查询结果:{}", list);
} catch (Exception ex) {
//这里的异常,一般是redis瘫痪 ,或 redis网络timeout
log.error("exception:", ex);
//TODO 走DB查询
}
return list;
}
复制代码
redis分布式缓存系列
- redis分布式缓存(一)一一 redis安装(linux和docker)
- redis分布式缓存(二)一一 RDB和AOF
- redis分布式缓存(三)一一 SpringBoot集成Mybatis-Plus,Redis和Swagger
- redis分布式缓存(四)一一 SpringCache集成Redis
- redis分布式缓存(五)一一 常用命令(String)
- redis分布式缓存(六)一一 文章的阅读量PV解决方案
- redis分布式缓存(七)一一 分布式全局id解决方案
- redis分布式缓存(八)一一 高并发原子性操作(Redis+Lua)
- redis分布式缓存(九)一一 黑客防刷攻击解决方案
- redis分布式缓存(十)一一 常用命令(Hash)
- redis分布式缓存(十一)一一 储存java bean对象业务剖析
- redis分布式缓存(十二)一一 短链接解决方案
- redis分布式缓存(十三)一一 京东购物车解决方案
- redis分布式缓存(十四)一一 分布式session不一致性解决方案
- redis分布式缓存(十五)一一 高可用的用户注册解决方案
- redis分布式缓存(十六)一一 用户发微博解决方案
- redis分布式缓存(十七)一一 常用命令(Set)
- redis分布式缓存(十八)一一 黑名单校验器解决方案
- redis分布式缓存(十九)一一 京东京豆抽奖解决方案
- redis分布式缓存(二十)一一 支付宝抽奖解决方案
- 文章持续更新中...