点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能

点赞是作为整个系统的一个小模块,代码在 user-service 用户服务下。

本文基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再每隔两小时从 Redis 读取点赞数据写入数据库中做持久化存储。

点赞功能在很多系统中都有,但别看功能小,想要做好需要考虑的东西还挺多的。

点赞、取消点赞是高频次的操作,若每次都读写数据库,大量的操作会影响数据库性能,所以需要做缓存。

至于多久从 Redis 取一次数据存到数据库中,根据项目的实际情况定吧,我是暂时设了两个小时。

项目需求需要查看都谁点赞了,所以要存储每个点赞的点赞人、被点赞人,不能简单的做计数。

# Redis 缓存设计及实现

1 Redis 安装及运行

Redis 安装请自行查阅相关教程。

说下Docker 安装运行 Redis

docker run -d -p 6379:6379 redis:4.0.8

复制代码如果已经安装了 Redis,打开命令行,输入启动 Redis 的命令

redis-server

2 Redis 与 SpringBoot 项目的整合

1、在 pom.xml 中引入依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2、在启动类上添加注释 @EnableCaching

@SpringBootApplication@EnableDiscoveryClient@EnableSwagger2@EnableFeignClients(basePackages = "com.solo.coderiver.project.client")@EnableCachingpublic class UserApplication {
  

    public static void main(String[] args) {
          SpringApplication.run(UserApplication.class, args);    }}

3、编写 Redis 配置类 RedisConfig

​​​​​​​

import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import java.net.UnknownHostException;



@Configurationpublic class RedisConfig {
  

    @Bean    @ConditionalOnMissingBean(name = "redisTemplate")    public RedisTemplate<String, Object> redisTemplate(            RedisConnectionFactory redisConnectionFactory)            throws UnknownHostException {
  

        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);

        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();        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 在 SpringBoot 项目中的配置已经完成,可以愉快的使用了。

3 Redis 的数据结构类型

Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。

下面来对这5种数据结构类型作简单的介绍:

4 点赞数据在 Redis 中的存储格式

用 Redis 存储两种数据,一种是记录点赞人、被点赞人、点赞状态的数据,另一种是每个用户被点赞了多少次,做个简单的计数。

由于需要记录点赞人和被点赞人,还有点赞状态(点赞、取消点赞),还要固定时间间隔取出 Redis 中所有点赞数据,分析了下 Redis 数据格式中 Hash 最合适。

因为 Hash 里的数据都是存在一个键里,可以通过这个键很方便的把所有的点赞数据都取出。这个键里面的数据还可以存成键值对的形式,方便存入点赞人、被点赞人和点赞状态。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你好!实现点赞和评论功能可以使用Spring Boot作为后端框架,Redis作为缓存数据库,MySQL作为持久化数据库,UniApp作为前端框架。以下是一个简单的实现步骤: 1. 创建Spring Boot项目并配置MySQL和Redis的连接。 2. 创建实体类,如User、Post等,用于表示用户和帖子。 3. 创建MySQL数据库表,包括用户表和帖子表。 4. 使用Spring Data JPA或MyBatis等框架进行数据库操作,实现用户和帖子的增删改查功能。 5. 在帖子表中添加字段用于存储点赞数和评论数。 6. 在后端编写点赞和评论的接口,分别处理点赞和评论的业务逻辑。 - 点赞接口可以接收用户ID和帖子ID,将点赞数加一,并更新数据库。 - 评论接口可以接收用户ID、帖子ID和评论内容,将评论数加一,并将评论保存到数据库。 7. 使用Redis进行缓存,可以将点赞数和评论数存储在Redis中,以提高访问速度。 - 在点赞接口中,先查询Redis中是否存在点赞数,如果存在则直接返回;否则从数据库中查询并存储到Redis中。 - 在评论接口中,同样先查询Redis中是否存在评论数,如果存在则直接返回;否则从数据库中查询并存储到Redis中。 8. 在UniApp中使用Vue.js等技术进行前端开发,调用后端提供的接口实现点赞和评论的功能。 - 在页面中展示帖子列表,并显示点赞数和评论数。 - 点击点赞按钮时,调用后端的点赞接口,并更新页面上的点赞数。 - 点击评论按钮时,调用后端的评论接口,并更新页面上的评论数。 以上是一个简单的实现方案,具体的细节还需要根据你的实际需求进行调整和完善。希望对你有所帮助!如有更多问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值