当前位置:网站首页>巧用redis实现点赞功能,它不比mysql香吗?
巧用redis实现点赞功能,它不比mysql香吗?
2022-06-27 13:51:00 【InfoQ】
MAP_USER_LIKED被点赞用户id::点赞用户id1或者0MAP_USER_LIKED_COUNT被点赞用户idcount/**
* 将用户被其他用户点赞的数据存到redis
*/
@Override
public void saveLiked2Redis(String likedUserId, String likedPostId) {
String key = RedisKeyUtils.getLikedKey(likedUserId, likedPostId);
redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED,key, LikedStatusEnum.LIKE.getCode());
}
//取消点赞
@Override
public void unlikeFromRedis(String likedUserId, String likedPostId) {
String key = RedisKeyUtils.getLikedKey(likedUserId, likedPostId);
redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED,key,LikedStatusEnum.UNLIKE.getCode());
}
/**
* 将被点赞用户的数量+1
*/
@Override
public void incrementLikedCount(String likedUserId) {
redisTemplate.opsForHash().increment(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT,likedUserId,1);
}
//-1
@Override
public void decrementLikedCount(String likedUserId) {
redisTemplate.opsForHash().increment(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT, likedUserId, -1);
}
/**
* 获取Redis中的用户点赞详情记录
*/
@Override
public List<UserLikeDetail> getLikedDataFromRedis() {
Cursor<Map.Entry<Object,Object>> scan = redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED, ScanOptions.NONE);
List<UserLikeDetail> list = new ArrayList<>();
while (scan.hasNext()){
Map.Entry<Object, Object> entry = scan.next();
String key = (String) entry.getKey();
String[] split = key.split("::");
String likedUserId = split[0];
String likedPostId = split[1];
Integer value = (Integer) entry.getValue();
//组装成 UserLike 对象
UserLikeDetail userLikeDetail = new UserLikeDetail(likedUserId, likedPostId, value);
list.add(userLikeDetail);
//存到 list 后从 Redis 中删除
redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED, key);
}
return list;
}
/**
* 获取Redis中的用户被点赞数量
*/
@Override
public List<UserLikCountDTO> getLikedCountFromRedis() {
Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT, ScanOptions.NONE);
List<UserLikCountDTO> list = new ArrayList<>();
while(cursor.hasNext()){
Map.Entry<Object, Object> map = cursor.next();
String key = (String) map.getKey();
Integer value = (Integer) map.getValue();
UserLikCountDTO userLikCountDTO = new UserLikCountDTO(key,value);
list.add(userLikCountDTO);
//存到 list 后从 Redis 中删除
redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT,key);
}
return list;
}


DROP TABLE IF EXISTS `user_like_detail`;
CREATE TABLE `user_like_detail` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`liked_user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '被点赞的用户id',
`liked_post_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '点赞的用户id',
`status` tinyint(1) NULL DEFAULT 1 COMMENT '点赞状态,0取消,1点赞',
`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `liked_user_id`(`liked_user_id`) USING BTREE,
INDEX `liked_post_id`(`liked_post_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户点赞表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
DROP TABLE IF EXISTS `user_like_count`;
CREATE TABLE `user_like_count` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`like_num` int(11) NULL DEFAULT 0,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
//同步redis的用户点赞数据到数据库
@Override
@Transactional
public void transLikedFromRedis2DB() {
List<UserLikeDetail> list = redisService.getLikedDataFromRedis();
list.stream().forEach(item->{
//查重
UserLikeDetail userLikeDetail = userLikeDetailMapper.selectOne(new LambdaQueryWrapper<UserLikeDetail>()
.eq(UserLikeDetail::getLikedUserId, item.getLikedUserId())
.eq(UserLikeDetail::getLikedPostId, item.getLikedPostId()));
if (userLikeDetail == null){
userLikeDetail = new UserLikeDetail();
BeanUtils.copyProperties(item, userLikeDetail);
//没有记录,直接存入
userLikeDetail.setCreateTime(LocalDateTime.now());
userLikeDetailMapper.insert(userLikeDetail);
}else{
//有记录,需要更新
userLikeDetail.setStatus(item.getStatus());
userLikeDetail.setUpdateTime(LocalDateTime.now());
userLikeDetailMapper.updateById(item);
}
});
}
@Override
@Transactional
public void transLikedCountFromRedis2DB() {
List<UserLikCountDTO> list = redisService.getLikedCountFromRedis();
list.stream().forEach(item->{
UserLikeCount user = userLikeCountMapper.selectById(item.getKey());
//点赞数量属于无关紧要的操作,出错无需抛异常
if (user != null){
Integer likeNum = user.getLikeNum() + item.getValue();
user.setLikeNum(likeNum);
//更新点赞数量
userLikeCountMapper.updateById(user);
}
});
}
边栏推荐
- 赛迪顾问发布《“十四五” 关键应用领域之数据库市场研究报告》(附下载)
- American chips are hit hard again, and another chip enterprise after Intel will be overtaken by Chinese chips
- 国产数据库乱象
- Too many requests at once, and the database is in danger
- 请求一下子太多了,数据库危
- AXI總線
- 【OS命令注入】常见OS命令执行函数以及OS命令注入利用实例以及靶场实验—基于DVWA靶场
- How to split microservices
- Shell concise tutorial
- EventLoop learning
猜你喜欢

以前国产手机高傲定价扬言消费者爱买不买,现在猛降两千求售
![[OS command injection] common OS command execution functions and OS command injection utilization examples and range experiments - based on DVWA range](/img/f2/458770fc74971bef23f96f87733ee5.png)
[OS command injection] common OS command execution functions and OS command injection utilization examples and range experiments - based on DVWA range

一次性彻底解决 Web 工程中文乱码问题
机械硬盘和ssd固态硬盘的原理对比分析

芯片供给过剩之际,进口最多的中国继续减少进口,美国芯片慌了

基于 xml 配置文件的入门级 SSM 框架整合

Domestic database disorder
![[安洵杯 2019]Attack](/img/1a/3e82a54cfcb90ebafebeaa8ee1ec01.png)
[安洵杯 2019]Attack

External memory

Redis master-slave replication, sentinel mode, cluster cluster
随机推荐
打印输出数(递归方法解决)
After the deployment is created, the pod problem handling cannot be created
[a complete human-computer interface program framework]
With the advent of the era of Internet of everything, Ruijie released a scenario based wireless zero roaming scheme
Axi bus
EventLoop learning
[OS command injection] common OS command execution functions and OS command injection utilization examples and range experiments - based on DVWA range
Redis 主从复制、哨兵模式、Cluster集群
CCID Consulting released the database Market Research Report on key application fields during the "14th five year plan" (attached with download)
CMOS level circuit analysis
Shell 简明教程
Learning records of numpy Library
为什么 Oracle 云客户必须在Oracle Cloud 季度更新发布后自行测试?
How to use 200 lines of code to implement Scala's Object Converter
Summary of basic usage of command line editor sed
[安洵杯 2019]Attack
国产数据库乱象
Dynamic Networks and Conditional Computation论文简读和代码合集
[PHP code injection] common injectable functions of PHP language and utilization examples of PHP code injection vulnerabilities
芯片供给过剩之际,进口最多的中国继续减少进口,美国芯片慌了