教你用Redis高效完成点赞功能

手把手教你用Redis 实现点赞功能并且与数据库同步

一、Redis 缓存设计及实现

Linux下安装Redis或者Docker下安装Redis并且启动(redis-server)

SpringBoot整合Redis

1.在 pom.xml 中引入依赖

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

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

3.编写 Redis 配置类 RedisConfig

@Configuration
public 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 存储两种数据:

类似于这样:

在service层操作Redis

实现类 RedisServiceImpl :

RedisKeyUtils, 用于根据一定规则生成 key

三、数据库设计

对应的对象 UserLike

在service层操作数据库

LikedServiceImpl 实现类

四、开启定时任务持久化存储到数据库

这里使用的是定时任务 Quartz框架

1、 添加依赖

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

2、 编写配置文件

@Configuration
public class QuartzConfig {
          
   

    private static final String LIKE_TASK_IDENTITY = "LikeTaskQuartz";

    @Bean
    public JobDetail quartzDetail(){
          
   
        return JobBuilder.newJob(LikeTask.class).withIdentity(LIKE_TASK_IDENTITY).storeDurably().build();
    }

    @Bean
    public Trigger quartzTrigger(){
          
   
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(10)  //设置时间周期单位秒
                .withIntervalInHours(2)  //两个小时执行一次
                .repeatForever();
        return TriggerBuilder.newTrigger().forJob(quartzDetail())
                .withIdentity(LIKE_TASK_IDENTITY)
                .withSchedule(scheduleBuilder)
                .build();
    }
}

3、 编写执行任务的类继承自 QuartzJobBean

在定时任务中直接调用 LikedService 封装的方法完成数据同步。

五、注意事项

经验分享 程序员 微信小程序 职场和发展