在资讯类的项目中,我们常常遇到文章评论和点赞等功能实现。但是这些功能再项目中是高频出现的,如果直接操作数据库的话,对数据库压力太大。那遇到这个问题怎么解决?

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如何实现点赞功能相关推荐

  1. 基于控制台的JAVA购物系统

    基于控制台的JAVA购物系统 01效果展示: 系统功能: 1. 会员中心 ​ 1.1修改资料 ​ 1.2我的订单 ​ 1.3我的礼物 ​ 1.4返回上层 2. 进入购物 ​ 2.1选择商品 ​ 2.2 ...

  2. (附源码)Springboot网上购物系统 毕业设计 311236

    Springboot网上购物系统的开发 摘  要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买.然而在快节奏的新时代中,人们不一定能为购买各 ...

  3. spring boot网上购物系统毕业设计源码311236

    Springboot网上购物系统的开发 摘  要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买.然而在快节奏的新时代中,人们不一定能为购买各 ...

  4. (附源码)spring boot网上购物系统 毕业设计 311236

    Springboot网上购物系统的开发 摘  要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买.然而在快节奏的新时代中,人们不一定能为购买各 ...

  5. ssm基于jsp的网上购物系统 毕业设计-附源码190917

    网上购物系统的设计与实现 摘 要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流快递. ...

  6. 基于Springboot网上购物系统 毕业设计-附源码311236

    Springboot网上购物系统的开发 摘 要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买.然而在快节奏的新时代中,人们不一定能为购买各类 ...

  7. ssm网上购物系统 毕业设计源码123361

    基于ssm网上购物系统 摘要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流快递.安全 ...

  8. (附源码)ssm网上购物系统 毕业设计123361

    基于ssm网上购物系统 摘要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流快递.安全 ...

  9. nodejs购物系统app-计算机毕设 附源码 90766

    nodejs购物系统app 目  录 摘要 1 绪论 1.1研究背景和意义 1.2研究现状 1.3node.js主要功能 1.4框架说明 1.5论文结构与章节安排 2购物系统app系统分析 2.1 可 ...

最新文章

  1. Python-HTML CSS题目
  2. 磁盘和文件系统管理(一)
  3. 自然语言处理库——Gensim之Word2vec
  4. Gromacs文件-Chapter1
  5. centos php 开启socket,centos下phpsocket连接,该如何解决
  6. python-pcl
  7. SpringCloud配置中心内容加密
  8. do{}while(0)只执行一次无意义?你可能真的没理解!
  9. 安装tensorflow时候报错ImportError: DLL load failed: 找不到指定的模块。Failed to load the native TensorFlow runtime.
  10. 推荐20个值得收藏的前端开源项目
  11. html5个人博客毕业论文,基于HTML的个人博客网页设计.docx
  12. 《白帽子讲web安全》学习笔记——web安全概述
  13. Myeclipse项目内容没有报错但是项目上面却有红色叉叉
  14. 共码未来 | 2022 Google 谷歌开发者大会参会现场记
  15. 为什么要“推销自己”?
  16. 捡到的苹果手机怎么解id锁_苹果手机维修中软解与硬解的区别
  17. 艺多不压身—摩尔斯电码
  18. Superset安装部署
  19. 图像的灰度化灰度值的读取Matlab
  20. 关于object对象转换为int类型

热门文章

  1. 苹果内购、支付宝微信app支付H5支付、退款
  2. 精神疾病与情绪有关,好心情教您5招赶走坏情绪
  3. ChipScope 使用问题和解决方案
  4. java 蛋糕_1263: 你会做蛋糕吗?(Java)
  5. spring的冷门知识
  6. 10GX:结构化布线的里程碑(转)
  7. RxJava中Observable的基本用法
  8. eFPGA设计开源框架 FABulous 系列(一)开发环境搭建
  9. 基于GPU的数字图像并行处理研究
  10. CRC-16/XMODEM串行计算的Verilog源码及仿真