脚本宝典收集整理的这篇文章主要介绍了redis分布式缓存一一 帖子点赞解决方案~,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
嗨~大家好,这里是SharingOfficer,一起来聊一聊帖子点赞解决方案,咱们往下看😉
点赞的关键技术就是要判断该用户是否点赞,已重复点赞的不允许再点赞,即过滤重复,虽然业务不复杂,可以采用数据库直接实现,但是对于微博这种高并发的场景,不可能查数据库的,一般是缓存,即redis
采用的是redis的set数据结构,key=like:postid value={userid}
采用sadd命令,添加点赞
127.0.0.1:6379> sadd like:1000 101
(integer) 1
127.0.0.1:6379> sadd like:1000 102
(integer) 1
127.0.0.1:6379> sadd like:1000 103
(integer) 1
127.0.0.1:6379> smembers like:1000
1) "101"
2) "102"
3) "103"
复制代码
采用srem命令,取消点赞
127.0.0.1:6379> srem like:1000 101
(integer) 1
127.0.0.1:6379> smembers like:1000
1) "102"
2) "103"
复制代码
采用scard命令,点赞总数
127.0.0.1:6379> smembers like:1000
1) "102"
2) "103"
127.0.0.1:6379> scard like:1000
(integer) 2
复制代码
采用sismember命令,判断是否点赞
127.0.0.1:6379> smembers like:1000
1) "102"
2) "103"
127.0.0.1:6379> sismember like:1000 102
(integer) 1
127.0.0.1:6379> sismember like:1000 101
(integer) 0
复制代码
/**
* 点赞
*/
@GetMapping(value = "/dolike")
public String dolike(int postid,int userid) {
String result="";
try {
String key=Constants.LIKE_KEY+postid;
long object = this.redisTemplate.opsForSet().add(key,userid);
if (object==1){
result="点赞成功";
}else{
result="你已重复点赞";
}
LOG.info("查询结果:{}", object);
} catch (Exception ex) {
log.error("exception:", ex);
}
return result;
}
复制代码
/**
* 取消点赞
*/
@GetMapping(value = "/undolike")
public String undolike(int postid,int userid) {
String result="";
try {
String key=Constants.LIKE_KEY+postid;
long object = this.redisTemplate.opsForSet().remove(key,userid);
if (object==1){
result="取消成功";
}else{
result="你已重复取消点赞";
}
log.info("查询结果:{}", object);
} catch (Exception ex) {
log.error("exception:", ex);
}
return result;
}
复制代码
/**
* 根据postid userid查看帖子信息,返回结果是点赞总数和是否点赞
*/
@GetMapping(value = "/getpost")
public Map getpost(int postid,int userid) {
Map map=new HashMap();
String result="";
try {
String key=Constants.LIKE_KEY+postid;
long size = this.redisTemplate.opsForSet().size(key);
boolean bo=this.redisTemplate.opsForSet().isMember(key,userid);
map.put("size",size);
map.put("isLike",bo);
log.info("查询结果:{}", map);
} catch (Exception ex) {
log.error("exception:", ex);
}
return map;
}
复制代码
/**
* 查看点赞明细,就是有哪些人
*/
@GetMapping(value = "/likedetail")
public Set likedetail(int postid) {
Set set=null;
try {
String key=Constants.LIKE_KEY+postid;
set = this.redisTemplate.opsForSet().members(key);
log.info("查询结果:{}", set);
} catch (Exception ex) {
log.error("exception:", ex);
}
return set;
}
以上是脚本宝典为你收集整理的redis分布式缓存一一 帖子点赞解决方案~全部内容,希望文章能够帮你解决redis分布式缓存一一 帖子点赞解决方案~所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。