java购物系统点赞功能实现_springboot如何实现点赞功能
在资讯类的项目中,我们常常遇到文章评论和点赞等功能实现。但是这些功能再项目中是高频出现的,如果直接操作数据库的话,对数据库压力太大。那遇到这个问题怎么解决?
redis缓存
首先我们想到的就是添加缓存处理机制。用户点赞可以放在Redis中,然后持久化到数据库中。
点赞、取消点赞是高频次的操作,若每次都读写数据库,大量的操作会影响数据库性能,所以需要做缓存
实战
知道了解决方案,我们就要去测试效果。
redis安装不用介绍了,大家都可以安装运行。下面来讲springboot怎么解决这个问题。
导入依赖
在启动类中添加缓存注解 @EnableCaching
接下来我们需要配置redis
@Configuration
public class RedisConfig {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate redisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
@Bean
@ConditionalOnMissingBean(StringRedisTemplate.class)
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
这样基本环境搭建完成,我们需要做的就是redis的工具类了。
redis存储格式
现在知道了redis缓存,但是我们怎么把点赞存储到redis中。redis支持数据格式很多,我们需要把点赞人和被点赞人,点赞状态都给记录下来。
由于需要记录点赞人和被点赞人,还有点赞状态(点赞、取消点赞),还要固定时间间隔取出 Redis 中所有点赞数据,分析了下 Redis 数据格式中 Hash 最合适。
hash的存储方式我们确定了,接下来就是模仿用户点赞存储数据。
如果用户点赞,存储的键为:likedUserId::likedPostId,对应的值为 1 。取消点赞,存储的键为:likedUserId::likedPostId,对应的值为 0 。取数据时把键用 :: 切开就得到了两个id,也很方便。
现在主要的实现方法就是从redis中定时从缓存中持久化到数据库中。
@Override
public List getLikedDataFromRedis() {
Cursor> cursor = redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED, ScanOptions.NONE);
List list = new ArrayList<>();
while (cursor.hasNext()){
Map.Entry entry = cursor.next();
String key = (String) entry.getKey();
//分离出 likedUserId,likedPostId
String[] split = key.split("::");
String likedUserId = split[0];
String likedPostId = split[1];
Integer value = (Integer) entry.getValue();
//组装成 UserLike 对象
UserLike userLike = new UserLike(likedUserId, likedPostId, value);
list.add(userLike);
//存到 list 后从 Redis 中删除
redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED, key);
}
return list;
}
@Override
public List getLikedCountFromRedis() {
Cursor> cursor = redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT, ScanOptions.NONE);
List list = new ArrayList<>();
while (cursor.hasNext()){
Map.Entry map = cursor.next();
//将点赞数量存储在 LikedCountDT
String key = (String)map.getKey();
LikedCountDTO dto = new LikedCountDTO(key, (Integer) map.getValue());
list.add(dto);
//从Redis中删除这条记录
redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT, key);
}
return list;
}
这二个方法就可以实现点赞记录和点赞次数的统计到数据库中。其实,redis主要就是实现点赞和点赞次数直接的一个缓存的作用。
但是问题来了,如果客户在点赞后,刷新了页面,此时redis没有持久化到数据库中,用户就会觉得点赞失效,继续点赞。导致可以体验不好。因为有定时器的影响,就会带来这种麻烦。大家有更好的解决办法分享一下。
以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!
java购物系统点赞功能实现_springboot如何实现点赞功能相关推荐
- 基于控制台的JAVA购物系统
基于控制台的JAVA购物系统 01效果展示: 系统功能: 1. 会员中心 1.1修改资料 1.2我的订单 1.3我的礼物 1.4返回上层 2. 进入购物 2.1选择商品 2.2 ...
- (附源码)Springboot网上购物系统 毕业设计 311236
Springboot网上购物系统的开发 摘 要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买.然而在快节奏的新时代中,人们不一定能为购买各 ...
- spring boot网上购物系统毕业设计源码311236
Springboot网上购物系统的开发 摘 要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买.然而在快节奏的新时代中,人们不一定能为购买各 ...
- (附源码)spring boot网上购物系统 毕业设计 311236
Springboot网上购物系统的开发 摘 要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买.然而在快节奏的新时代中,人们不一定能为购买各 ...
- ssm基于jsp的网上购物系统 毕业设计-附源码190917
网上购物系统的设计与实现 摘 要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流快递. ...
- 基于Springboot网上购物系统 毕业设计-附源码311236
Springboot网上购物系统的开发 摘 要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买.然而在快节奏的新时代中,人们不一定能为购买各类 ...
- ssm网上购物系统 毕业设计源码123361
基于ssm网上购物系统 摘要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流快递.安全 ...
- (附源码)ssm网上购物系统 毕业设计123361
基于ssm网上购物系统 摘要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流快递.安全 ...
- nodejs购物系统app-计算机毕设 附源码 90766
nodejs购物系统app 目 录 摘要 1 绪论 1.1研究背景和意义 1.2研究现状 1.3node.js主要功能 1.4框架说明 1.5论文结构与章节安排 2购物系统app系统分析 2.1 可 ...
最新文章
- Python-HTML CSS题目
- 磁盘和文件系统管理(一)
- 自然语言处理库——Gensim之Word2vec
- Gromacs文件-Chapter1
- centos php 开启socket,centos下phpsocket连接,该如何解决
- python-pcl
- SpringCloud配置中心内容加密
- do{}while(0)只执行一次无意义?你可能真的没理解!
- 安装tensorflow时候报错ImportError: DLL load failed: 找不到指定的模块。Failed to load the native TensorFlow runtime.
- 推荐20个值得收藏的前端开源项目
- html5个人博客毕业论文,基于HTML的个人博客网页设计.docx
- 《白帽子讲web安全》学习笔记——web安全概述
- Myeclipse项目内容没有报错但是项目上面却有红色叉叉
- 共码未来 | 2022 Google 谷歌开发者大会参会现场记
- 为什么要“推销自己”?
- 捡到的苹果手机怎么解id锁_苹果手机维修中软解与硬解的区别
- 艺多不压身—摩尔斯电码
- Superset安装部署
- 图像的灰度化灰度值的读取Matlab
- 关于object对象转换为int类型