博客
关于我
Redis如何高效实现点赞、取消点赞功能
阅读量:796 次
发布时间:2023-03-22

本文共 4974 字,大约阅读时间需要 16 分钟。

Redis缓存与点赞功能实现

Redis缓存设计

在Spring Boot项目中集成Redis缓存,可以有效提升点赞功能的性能。以下是详细的实现步骤和思路:

1. Redis配置

首先,在项目中引入Redis依赖,并配置RedisTemplate。

org.springframework.boot
spring-boot-starter-data-redis

在启动类添加@EnableCaching注释,启用缓存功能。

@SpringBootApplication@EnableDiscoveryClient@EnableSwagger2@EnableFeignClients(basePackages = "com.solo.coderiver.project.client")@EnableCaching
public 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;
@Configuration
public 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;
}
}

2. 数据结构设计

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();
}
}

3. 接口设计

定义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();
}

4. 实现类

实现RedisService的具体操作,包括点赞、取消点赞、删除、计数等。

@Service
public 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());
}
// 其他操作类似...
}

5. 数据库设计

设计用户点赞表,存储点赞状态和相关信息。

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;

6. 定时任务

使用Quartz配置定时同步Redis数据到数据库。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
@Service
public class LikeTask extends QuartzJobBean {
private LikedService likedService;
public LikeTask() {
super(LikeTask.class);
}
@Override
protected void executeInternal(JobExecutionContext jobContext) throws JobExecutionException {
likedService.transLikedFromRedis2DB();
likedService.transLikedCountFromRedis2DB();
}
}

7. 数据同步

确保数据一致性和高可用性,避免重复点赞记录,使用锁机制加以保障。

8. 性能优化

通过Redis缓存和定时任务,有效提升点赞功能的性能和用户体验。

以上是完整的点赞功能设计与实现,结合了Redis缓存、数据库设计、定时任务等多个方面,确保系统高效稳定运行。

转载地址:http://jiqfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现多组输入(附完整源码)
查看>>
Objective-C实现多项式函数在某个点的评估算法(附完整源码)
查看>>
Objective-C实现多项式哈希算法(附完整源码)
查看>>
Objective-C实现大位数乘法(附完整源码)
查看>>
Objective-C实现大根堆(附完整源码)
查看>>
Objective-C实现奇偶检验码(附完整源码)
查看>>
Objective-C实现奇偶转置排序算法(附完整源码)
查看>>
Objective-C实现奇异值分解SVD(附完整源码)
查看>>
Objective-C实现子集总和算法(附完整源码)
查看>>
Objective-C实现字符串autocomplete using trie(使用 trie 自动完成)算法(附完整源码)
查看>>
Objective-C实现字符串boyer moore search博耶摩尔搜索算法(附完整源码)
查看>>
Objective-C实现字符串IP地址转DWORD地址(附完整源码)
查看>>
Objective-C实现字符串jaro winkler算法(附完整源码)
查看>>
Objective-C实现字符串manacher马拉车算法(附完整源码)
查看>>
Objective-C实现字符串wildcard pattern matching通配符模式匹配算法(附完整源码)
查看>>
Objective-C实现字符串word patterns单词模式算法(附完整源码)
查看>>
Objective-C实现字符串Z 函数或 Z 算法(附完整源码)
查看>>
Objective-C实现字符串加解密(附完整源码)
查看>>
Objective-C实现字符串复制功能(附完整源码)
查看>>
Objective-C实现字符串是否回文Palindrome算法 (附完整源码)
查看>>