Redis实现投票功能

2023-11-13

一、背景介绍

投票功能是一个非常常见的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可以简化数据库操作。代码已上传至Github:https://github.com/chatbot-ai/spring-boot-redis-mybatis-vote。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis实现投票功能 的相关文章

随机推荐

  • ps2020无法显示最近打开

    首选项 常规 选择 自动显示主屏幕
  • 关于BeanUtils.copyProperties() 用法及区别

    这两个类在不同的包下面 而这两个类的copyProperties 方法里面传递的参数赋值是相反的 例如 a b为对象BeanUtils copyProperties a b BeanUtils是org springframework bea
  • FakeMsdMiner挖矿病毒分析报告

    近日 亚信安全截获新型挖矿病毒FakeMsdMiner 该病毒利用永恒之蓝 永恒浪漫等NSA漏洞进行攻击传播 该病毒具有远控功能 可以获取系统敏感信息 其通过修改HOST文件方式截获其他挖矿病毒的成果 由于该病毒的挖矿程序伪装成微软系统服务
  • [note] 深度学习 tensorflow 笔记(3) cnn 卷积神经网络

    假设我们想要辨识一张图片里面是不是有猫咪的存在 这只猫咪可以在图片的任何位置 什么办法才能辨别这个图片里面有没有猫呢 一个很简单的想法就是 将图片分成一些子图片的集合 逐个辨别子图片里面有没有猫咪 的确 卷积神经网络就是这样做的 但是 分割
  • Android高德地图自定义Mark并实现聚合效果

    Android高德地图自定义Mark并实现聚合效果 起因 公司本来项目里面用到了高德地图 然后最近老板看见别人的APP里面有个聚合的这个功能 老板 这个效果能不能实现 我也要 没有办法因为以前没有做过高德地图点聚合这个东西 然后只能勉强的答
  • Brocade FOS下载 博科光纤交换机固件升级

    百度网盘 https pan baidu com s 1lCAsjoDG3rMXs7uYoJETWA 输入码 7nv4 1 BT下载 比如用迅雷 17F8E2FAC8CD08C682B3D2A5CC294B48B1DA2ED6 7313C1
  • 韦东山 IMX6ULL和正点原子_「正点原子Linux连载」第四十三章Linux设备树(一)

    1 实验平台 正点原子Linux开发板 2 摘自 正点原子I MX6U嵌入式Linux驱动开发指南 关注官方微信号公众号 获取更多资料 正点原子 前面章节中我们多次提到 设备树 这个概念 因为时机未到 所以当时并没有详细的讲解什么是 设备树
  • 【Dubbo】Dubbo(二)简单实践

    Dubbo 二 实践 安装注册中心 下载zookeeper 在zookeeper路径下新增date文件夹存储数据 conf路径下新增zoo cfg 编辑zoo cfg 修改数据目录dataDir为新增的data文件夹 其他与zoo samp
  • 牛客小白月赛76

    牛客小白月赛76 ACM NOI CSP CCPC ICPC算法编程高难度练习赛 牛客竞赛OJ A 猜拳游戏 AC代码 include
  • COCO数据集的使用笔记

    一 简介 官方网站 http cocodataset org 全称 Microsoft Common Objects in Context MS COCO 支持任务 Detection Keypoints Stuff Panoptic Ca
  • 【C语言】关键字

    1 定义 声明的关键字 关键字 说明 int 声明整型变量或函数返回值类型 signed 声明有符号类型变量或函数 unsigned 声明无符号类型变量或函数 short 声明短整型变量或函数 long 声明长整型变量或函数返回值类型 fl
  • Seaborn lineplot图例标题设置

    详细版本见个人博客 Seaborn lineplot图例标题设置 一 问题描述 下面是我的lineplot 代码 如果此方法用了hue参数同时绘制多个类别图 这时候seaborn会把这个hue的标签当做子标题 sns lineplot x
  • 【BATJ面试必会】Jvm 虚拟机篇

    一 运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 二 垃圾收集 判断一个对象是否可被回收 引用类型 垃圾收集算法 垃圾收集器 三 内存分配与回收策略 Minor GC 和 Full GC 内
  • 网络层——IP协议及IP地址总结

    基本概念 在复杂的网络环境中确定一个合适的路径 主机 配有IP地址 但是不进行路由控制的设备 路由器 既然 配有IP地址 又能进行路由控制 节点 主机和路由器的统称 IP协议的功能 寻址和路由 根据对方的IP地址 寻找出最佳的路径传输信息
  • 数组下标的别致用法

    数组常识 common sense 当一个数组被创建 数组下标都是从0开始计数的 例如 创建了一个名为 arr 的数组 可以通过 arr i 来读取数据 arr 为数组名 i 为数组下标 arr i 在编译器内部会被读取转换为另外一种形式
  • 清华 NLP 团队推荐:必读的77篇机器阅读理解论文

    https mp weixin qq com s 2VhgEieBwXymAv2qxO3MPw 导读 机器阅读理解 Machine Reading Comprehension 是指让机器阅读文本 然后回答和阅读内容相关的问题 阅读理解是自然
  • C语言 学生成绩管理 txt存储数据

    include
  • SQL注入基础知识

    1 注入分类 1 根据注入点分 数值型注入 不需要考虑闭合 和字符型注入 搜索型注入 即文本框注入 2 根据注入方式分 联合注入 报错注入 盲注 二次注入 堆叠注入 宽字节注入 3 根据请求方式注入分 GET型注入 POST型注入 HEAD
  • 麦克风阵列波束形成

    我的书 淘宝购买链接 当当购买链接 京东购买链接 波束形成 beamforming 体现的是声源信号的空域选择性 许多传统波束形成方法具有线性处理结构 波束形成需要考虑三个方面 1 麦克风阵列个数 2 性能 3 鲁棒性 在麦克风较少时 波束
  • Redis实现投票功能

    一 背景介绍 投票功能是一个非常常见的Web应用场景 SpringBoot作为当今流行的Web开发框架 为了提高开发效率和性能 通常需要整合一些第三方组件 Redis是一种高性能的键值对存储数据库 而Mybatis plus则是Mybati