Redis如何实现投票功能

 更新时间:2024年05月06日 16:08:51   作者:沙漠真有鱼  
这篇文章主要介绍了Redis如何实现投票功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、背景介绍

投票功能是一个非常常见的Web应用场景,SpringBoot作为当今流行的Web开发框架,为了提高开发效率和性能,通常需要整合一些第三方组件。

Redis是一种高性能的键值对存储数据库,而Mybatis-plus则是Mybatis的扩展版本,提供了更强大和便捷的数据库操作方式。

本文将介绍如何将Redis和Mybatis-plus整合到SpringBoot中,实现投票功能。

二、开发环境

  • JDK 1.8
  • SpringBoot 2.5.0
  • Redis 6.2.4
  • Mybatis-plus 3.4.3
  • IntelliJ IDEA

三、技术实现

1. 配置Redis

在SpringBoot的配置文件application.yml中添加Redis的配置:

spring:
  # Redis相关配置
  redis:
    # Redis服务器IP地址
    host: localhost
    # Redis服务器端口号
    port: 6379
    # Redis服务器密码
    password: 
    # Redis连接池最大连接数
    jedis:
      pool:
        max-active: 8
    # Redis连接池最大等待时间(单位:毫秒)
    lettuce:
      pool:
        max-wait: -1ms
    timeout: 5000ms

2. 配置Mybatis-plus

在SpringBoot的配置类中添加Mybatis-plus的配置:

@Configuration
@MapperScan("com.example.mapper")
public class MybatisPlusConfig {

    /**
     * Mybatis-plus分页插件配置
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    /**
     * Mybatis-plus通用Mapper配置
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
        scannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        scannerConfigurer.setBasePackage("com.example.mapper");
        return scannerConfigurer;
    }
}

3. 实现投票功能

首先创建一个投票的实体类Vote,包含投票项的id和投票数count:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Vote implements Serializable {
    private Long id;
    private Integer count;
}

然后创建投票的数据库表vote,包含两个字段id和count,id为主键:

CREATE TABLE `vote` (
  `id` bigint(20) NOT NULL,
  `count` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

接着创建投票的Mapper接口VoteMapper和对应的XML文件VoteMapper.xml,定义增加投票数和查询投票数的方法:

public interface VoteMapper extends BaseMapper<Vote> {
    /**
     * 增加投票数
     * @param id 投票项id
     * @return
     */
    int increaseCount(@Param("id") Long id);

    /**
     * 查询投票数
     * @param id 投票项id
     * @return
     */
    int selectCount(@Param("id") Long id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.VoteMapper">

    <!-- 增加投票数 -->
    <update id="increaseCount">
        update vote set count = count + 1
        where id = #{id}
    </update>

    <!-- 查询投票数 -->
    <select id="selectCount" resultType="int">
        select count
        from vote
        where id = #{id}
    </select>

</mapper>

接下来创建投票的Service类VoteService,其中增加投票数和查询投票数的方法使用了Redis缓存:

@Service
public class VoteService {

    @Autowired
    private VoteMapper voteMapper;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     ** @param id 投票项id
     */
    public void increaseCount(Long id) {
        ValueOperations<String, Object> operations = redisTemplate.opsForValue();
        String key = "vote:" + id;
        // 先从缓存中获取投票数
        Integer count = (Integer) operations.get(key);
        // 如果缓存中没有,则从数据库中获取,并存入缓存
        if (count == null) {
            count = voteMapper.selectCount(id);
            if (count != null) {
                operations.set(key, count);
            }
        }
        // 如果缓存中有,则增加投票数并更新缓存
        if (count != null) {
            operations.increment(key);
            voteMapper.increaseCount(id);
        }
    }

    /**
     * 查询投票数
     * @param id 投票项id
     * @return
     */
    public Integer selectCount(Long id) {
        ValueOperations<String, Object> operations = redisTemplate.opsForValue();
        String key = "vote:" + id;
        // 先从缓存中获取投票数
        Integer count = (Integer) operations.get(key);
        // 如果缓存中没有,则从数据库中获取,并存入缓存
        if (count == null) {
            count = voteMapper.selectCount(id);
            if (count != null) {
                operations.set(key, count);
            }
        }
        return count;
    }
}

最后创建投票的Controller类VoteController,提供增加投票数和查询投票数的接口:

@RestController
public class VoteController {

    @Autowired
    private VoteService voteService;

    /**
     * 增加投票数接口
     * @param id 投票项id
     * @return
     */
    @PostMapping("/vote/increase")
    public String increaseCount(@RequestParam Long id) {
        voteService.increaseCount(id);
        return "success";
    }

    /**
     * 查询投票数接口
     * @param id 投票项id
     * @return
     */
    @GetMapping("/vote/select")
    public Integer selectCount(@RequestParam Long id) {
        Integer count = voteService.selectCount(id);
        return count == null ? 0 : count;
    }
}

四、测试运行

启动SpringBoot应用后,在浏览器中访问http://localhost:8080/vote/select?id=1,可以查询id为1的投票项的投票数;

再访问http://localhost:8080/vote/increase?id=1,可以对id为1的投票项进行投票。

同时可以在Redis客户端中查看投票项的投票数是否正确。

五、总结

本文介绍了如何将Redis和Mybatis-plus整合到SpringBoot中,以实现投票功能。

其中Redis缓存可以增加应用性能,Mybatis-plus可以简化数据库操作。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis安装及基本数据类型

    Redis安装及基本数据类型

    这篇文章主要介绍了Redis安装及基本数据类型,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 关于Redis的慢查询日志功能详解

    关于Redis的慢查询日志功能详解

    Redis慢查询是Redis提供的一项性能优化功能,它可以记录某个查询语句的执行时间、命令参数、执行次数等信息,从而帮助运维人员快速定位某个查询语句的性能问题,需要的朋友可以参考下
    2023-07-07
  • Redis教程(二):String数据类型

    Redis教程(二):String数据类型

    这篇文章主要介绍了Redis教程(二):String数据类型,本文讲解了String数据类型概述、相关命令列表、命令使用示例三部分内容,需要的朋友可以参考下
    2015-04-04
  • Redis高可用之持久化

    Redis高可用之持久化

    在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等),Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和cluster集群,感兴趣的同学可以阅读本文
    2023-04-04
  • 高并发场景分析之redis+lua防重校验

    高并发场景分析之redis+lua防重校验

    这篇文章主要介绍了高并发场景分析之redis+lua防重校验,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Redis使用元素删除的布隆过滤器来解决缓存穿透问题

    Redis使用元素删除的布隆过滤器来解决缓存穿透问题

    本文主要介绍了Redis使用元素删除的布隆过滤器来解决缓存穿透问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Redis实现排行榜及相同积分按时间排序功能的实现

    Redis实现排行榜及相同积分按时间排序功能的实现

    这篇文章主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Redis深入了解内存淘汰与事务操作

    Redis深入了解内存淘汰与事务操作

    将Redis用作缓存时,Redis数据存在内存中,如果内存空间用满,就会自动驱逐老的数据。Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
    2022-07-07
  • 浅谈Redis中的自动过期机制

    浅谈Redis中的自动过期机制

    本文主要介绍了浅谈Redis中的自动过期机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 你了解Redis事务吗

    你了解Redis事务吗

    说到事务,大家会立刻想到Mysql的事务,所谓的事务就是对数据进行一系列的操作,要么都执行成功,要么都执行失败,下面就介绍一下Redis如何实现事务,感兴趣的可以了解一下
    2022-08-08

最新评论