Redis如何實(shí)現(xiàn)投票功能
一、背景介紹
投票功能是一個(gè)非常常見(jiàn)的Web應(yīng)用場(chǎng)景,SpringBoot作為當(dāng)今流行的Web開(kāi)發(fā)框架,為了提高開(kāi)發(fā)效率和性能,通常需要整合一些第三方組件。
Redis是一種高性能的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù),而Mybatis-plus則是Mybatis的擴(kuò)展版本,提供了更強(qiáng)大和便捷的數(shù)據(jù)庫(kù)操作方式。
本文將介紹如何將Redis和Mybatis-plus整合到SpringBoot中,實(shí)現(xiàn)投票功能。
二、開(kāi)發(fā)環(huán)境
- JDK 1.8
- SpringBoot 2.5.0
- Redis 6.2.4
- Mybatis-plus 3.4.3
- IntelliJ IDEA
三、技術(shù)實(shí)現(xiàn)
1. 配置Redis
在SpringBoot的配置文件application.yml中添加Redis的配置:
spring: # Redis相關(guān)配置 redis: # Redis服務(wù)器IP地址 host: localhost # Redis服務(wù)器端口號(hào) port: 6379 # Redis服務(wù)器密碼 password: # Redis連接池最大連接數(shù) jedis: pool: max-active: 8 # Redis連接池最大等待時(shí)間(單位:毫秒) lettuce: pool: max-wait: -1ms timeout: 5000ms
2. 配置Mybatis-plus
在SpringBoot的配置類(lèi)中添加Mybatis-plus的配置:
@Configuration @MapperScan("com.example.mapper") public class MybatisPlusConfig { /** * Mybatis-plus分頁(yè)插件配置 */ @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. 實(shí)現(xiàn)投票功能
首先創(chuàng)建一個(gè)投票的實(shí)體類(lèi)Vote,包含投票項(xiàng)的id和投票數(shù)count:
@Data @AllArgsConstructor @NoArgsConstructor public class Vote implements Serializable { private Long id; private Integer count; }
然后創(chuàng)建投票的數(shù)據(jù)庫(kù)表vote,包含兩個(gè)字段id和count,id為主鍵:
CREATE TABLE `vote` ( `id` bigint(20) NOT NULL, `count` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
接著創(chuàng)建投票的Mapper接口VoteMapper和對(duì)應(yīng)的XML文件VoteMapper.xml,定義增加投票數(shù)和查詢(xún)投票數(shù)的方法:
public interface VoteMapper extends BaseMapper<Vote> { /** * 增加投票數(shù) * @param id 投票項(xiàng)id * @return */ int increaseCount(@Param("id") Long id); /** * 查詢(xún)投票數(shù) * @param id 投票項(xiàng)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"> <!-- 增加投票數(shù) --> <update id="increaseCount"> update vote set count = count + 1 where id = #{id} </update> <!-- 查詢(xún)投票數(shù) --> <select id="selectCount" resultType="int"> select count from vote where id = #{id} </select> </mapper>
接下來(lái)創(chuàng)建投票的Service類(lèi)VoteService,其中增加投票數(shù)和查詢(xún)投票數(shù)的方法使用了Redis緩存:
@Service public class VoteService { @Autowired private VoteMapper voteMapper; @Autowired private RedisTemplate<String, Object> redisTemplate; /** ** @param id 投票項(xiàng)id */ public void increaseCount(Long id) { ValueOperations<String, Object> operations = redisTemplate.opsForValue(); String key = "vote:" + id; // 先從緩存中獲取投票數(shù) Integer count = (Integer) operations.get(key); // 如果緩存中沒(méi)有,則從數(shù)據(jù)庫(kù)中獲取,并存入緩存 if (count == null) { count = voteMapper.selectCount(id); if (count != null) { operations.set(key, count); } } // 如果緩存中有,則增加投票數(shù)并更新緩存 if (count != null) { operations.increment(key); voteMapper.increaseCount(id); } } /** * 查詢(xún)投票數(shù) * @param id 投票項(xiàng)id * @return */ public Integer selectCount(Long id) { ValueOperations<String, Object> operations = redisTemplate.opsForValue(); String key = "vote:" + id; // 先從緩存中獲取投票數(shù) Integer count = (Integer) operations.get(key); // 如果緩存中沒(méi)有,則從數(shù)據(jù)庫(kù)中獲取,并存入緩存 if (count == null) { count = voteMapper.selectCount(id); if (count != null) { operations.set(key, count); } } return count; } }
最后創(chuàng)建投票的Controller類(lèi)VoteController,提供增加投票數(shù)和查詢(xún)投票數(shù)的接口:
@RestController public class VoteController { @Autowired private VoteService voteService; /** * 增加投票數(shù)接口 * @param id 投票項(xiàng)id * @return */ @PostMapping("/vote/increase") public String increaseCount(@RequestParam Long id) { voteService.increaseCount(id); return "success"; } /** * 查詢(xún)投票數(shù)接口 * @param id 投票項(xiàng)id * @return */ @GetMapping("/vote/select") public Integer selectCount(@RequestParam Long id) { Integer count = voteService.selectCount(id); return count == null ? 0 : count; } }
四、測(cè)試運(yùn)行
啟動(dòng)SpringBoot應(yīng)用后,在瀏覽器中訪問(wèn)http://localhost:8080/vote/select?id=1,可以查詢(xún)id為1的投票項(xiàng)的投票數(shù);
再訪問(wèn)http://localhost:8080/vote/increase?id=1,可以對(duì)id為1的投票項(xiàng)進(jìn)行投票。
同時(shí)可以在Redis客戶(hù)端中查看投票項(xiàng)的投票數(shù)是否正確。
五、總結(jié)
本文介紹了如何將Redis和Mybatis-plus整合到SpringBoot中,以實(shí)現(xiàn)投票功能。
其中Redis緩存可以增加應(yīng)用性能,Mybatis-plus可以簡(jiǎn)化數(shù)據(jù)庫(kù)操作。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于SpringBoot 使用 Redis 分布式鎖解決并發(fā)問(wèn)題
針對(duì)上面問(wèn)題,一般的解決方案是使用分布式鎖來(lái)解決,本文通過(guò)場(chǎng)景分析給大家介紹關(guān)于SpringBoot 使用 Redis 分布式鎖解決并發(fā)問(wèn)題,感興趣的朋友一起看看吧2021-11-11Redis的幾種數(shù)據(jù)類(lèi)型使用詳解
這篇文章主要介紹了Redis的幾種數(shù)據(jù)類(lèi)型使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04React實(shí)現(xiàn)組件之間通信的幾種常用方法
在?React?中,組件之間的通信是構(gòu)建復(fù)雜應(yīng)用程序的核心部分,良好的組件間通信能夠提高代碼的可維護(hù)性和可讀性,同時(shí)能夠高效地管理應(yīng)用狀態(tài),在這篇博客中,我們將探討?React中幾種常用的組件通信方法,并提供示例代碼來(lái)幫助你理解,需要的朋友可以參考下2025-02-02Redis分布式鎖升級(jí)版RedLock及SpringBoot實(shí)現(xiàn)方法
這篇文章主要介紹了Redis分布式鎖升級(jí)版RedLock及SpringBoot實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02基于redis 7.2.3的makefile源碼解讀學(xué)習(xí)
這篇文章主要為大家介紹了基于redis 7.2.3的makefile源碼解讀學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12