本文共 4974 字,大约阅读时间需要 16 分钟。
在Spring Boot项目中集成Redis缓存,可以有效提升点赞功能的性能。以下是详细的实现步骤和思路:
首先,在项目中引入Redis依赖,并配置RedisTemplate。
org.springframework.boot spring-boot-starter-data-redis
在启动类添加@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); }} 创建Redis配置类RedisConfig,设置RedisTemplate的序列化器。
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.serializer.Jackson2JsonRedisSerializer;@Configurationpublic class RedisConfig { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate redisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(mapper); RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(serializer); template.setValueSerializer(serializer); template.setHashKeySerializer(serializer); template.setHashValueSerializer(serializer); template.afterPropertiesSet(); return template; } @Bean @ConditionalOnMissingBean(name = "stringRedisTemplate") public StringRedisTemplate stringRedisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; }} Redis用Hash类型存储点赞数据,键为likedUserId::likedPostId,值为点赞状态。
public class RedisKeyUtils { public static final String MAP_KEY_USER_LIKED = "MAP_USER_LIKED"; public static final String MAP_KEY_USER_LIKED_COUNT = "MAP_USER_LIKED_COUNT"; public static String getLikedKey(String likedUserId, String likedPostId) { StringBuilder builder = new StringBuilder(); builder.append(likedUserId).append("::").append(likedPostId); return builder.toString(); }} 定义RedisService接口,包含基本操作和数据同步。
public interface RedisService { void saveLiked2Redis(String likedUserId, String likedPostId); void unlikeFromRedis(String likedUserId, String likedPostId); void deleteLikedFromRedis(String likedUserId, String likedPostId); void incrementLikedCount(String likedUserId); void decrementLikedCount(String likedUserId); List getLikedDataFromRedis(); List getLikedCountFromRedis();} 实现RedisService的具体操作,包括点赞、取消点赞、删除、计数等。
@Servicepublic class RedisServiceImpl implements RedisService { private RedisTemplate redisTemplate; private LikedService likedService; 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()); } // 其他操作类似...} 设计用户点赞表,存储点赞状态和相关信息。
CREATE TABLE `user_like` ( `id` int NOT NULL AUTO_INCREMENT, `liked_user_id` varchar(32) NOT NULL COMMENT '被点赞用户ID', `liked_post_id` varchar(32) NOT NULL COMMENT '点赞用户ID', `status` tinyint(1) DEFAULT '1' COMMENT '点赞状态:1为点赞,0为取消', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `liked_user_id` (`liked_user_id`), INDEX `liked_post_id` (`liked_post_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
使用Quartz配置定时同步Redis数据到数据库。
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.quartz.QuartzJobBean;@Servicepublic class LikeTask extends QuartzJobBean { private LikedService likedService; public LikeTask() { super(LikeTask.class); } @Override protected void executeInternal(JobExecutionContext jobContext) throws JobExecutionException { likedService.transLikedFromRedis2DB(); likedService.transLikedCountFromRedis2DB(); }} 确保数据一致性和高可用性,避免重复点赞记录,使用锁机制加以保障。
通过Redis缓存和定时任务,有效提升点赞功能的性能和用户体验。
以上是完整的点赞功能设计与实现,结合了Redis缓存、数据库设计、定时任务等多个方面,确保系统高效稳定运行。
转载地址:http://jiqfk.baihongyu.com/