当前位置:   article > 正文

redis简介及在springBoot项目中的简单应用_redis在springboot中的应用

redis在springboot中的应用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、redis简介

1、reids是什么

2、redis优点

3、常用数据结构及应用场景

二、redis在springBoot项目中的简单应用

1、用redisson实现分布式锁

1.1 在pom.xml文件中添加redisson-spring-boot-starter依赖

1.2 在application.yml文件中服务端配置

1.3 在springBoot项目中使用redisson实现分布式锁

2、用redisson实现spring缓存

2.1 在pom.xml文件中追加spring-boot-starter-cache依赖

2.2 在application.yml文件中追加cache配置

2.3 在springBoot项目中的启动类中为指定缓存名称添加cache配置

2.4 在springBoot项目中使用缓存


一、redis简介

1、reids是什么

        Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilippo 使用 C 语言编写。

2、redis优点

  • 性能极高:Redis 基于内存实现数据存储,它的读取速度是 110000次/s,写速度是 81000次/s;
  • 多用途工具: Redis 有很多的用途,比如可以用作缓存、消息队列、搭建 Redis 集群等;
  • 命令提示功能:Redis 客户端拥有强大的命令提示功能,使用起来非常的方便,降低了学习门槛;
  • 可移植性:Redis 使用用标准 C语言编写的,能够在大多数操作系统上运行,比如 Linux,Mac,Solaris 等。
  • Redis 不仅可以将数据完全保存在内存中,还可以通过磁盘实现数据的持久存储;
  • Redis 支持丰富的数据类型,包括 string、list、set、zset、hash 等多种数据类型,因此它也被称为“数据结构服务器”;
  • Redis 支持多种编程语言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等语言。

3、常用数据结构及应用场景

        String:使用场景

                存储json字符串

                计数器

                分布式锁

        Hash

                短网址生成器

                用户登录会话存储

                存储对象(缓存) 

        List(有序列表)

                队列(先进先出)

                分页

                微信朋友圈点赞

        Set(无序不重复集合)

                随机点名 -> 重复点名srandmember  /  不重复点名spop

                关注模型 -> 交集sinter  /  差集sdiff

                唯一计数器 -> 不可录入重复数据

        SortedSet

                热搜榜

        了解redis相关命令及技术http://c.biancheng.net/redis/lists.html

        与 SQL 型数据库截然不同,Redis 没有提供新建数据库的操作,因为它自带了 16 (0—15)个数据库(默认使用 0 库)。在同一个库中,key 是唯一存在的、不允许重复的,它就像一把“密钥”,只能打开一把“锁”。键值存储的本质就是使用 key 来标识 value,当想要检索 value 时,必须使用与 value 相对应的 key 进行查找。

redis官网直通车https://redis.io/

二、redis在springBoot项目中的简单应用

以下示例使用jdk1.8版本进行测试

1、用redisson实现分布式锁

1.1 在pom.xml文件中添加redisson-spring-boot-starter依赖

  1. <!--导入redisson-spring-boot-starter-->
  2. <dependency>
  3. <groupId>org.redisson</groupId>
  4. <artifactId>redisson-spring-boot-starter</artifactId>
  5. <version>3.19.1</version>
  6. </dependency>

1.2 在application.yml文件中服务端配置

spring:
  redis:
    port: 6379  #redis服务器端口(根据实际地址配置)
    host: 192.168.90.66   #redis服务器ip(根据实际地址配置)

        

1.3 在springBoot项目中使用redisson实现分布式锁

示例代码如下:

  1. @RestController
  2. @Slf4j
  3. public class RedissionLockTest {
  4. @Autowired
  5. private RedissonClient redissonClient; //redis客户端
  6. @Autowired
  7. private StringRedisTemplate redisTemplate; //redis中的String数据结构
  8. @GetMapping("/get")
  9. public String get() {
  10. RLock lock = redissonClient.getLock("lockTest");
  11. String getStock;
  12. String tipText = null;
  13. try {
  14. log.info("开始上锁");
  15. //当后续业务执行到此处时,如果当前线程没有执行解锁操作,则会阻塞在此处
  16. lock.lock();
  17. log.info("执行业务");
  18. //尝试从redis中获取stock的值
  19. getStock = redisTemplate.opsForValue().get("stock");
  20. //如果没有存入stock,那么向redis中存入stock,并且值为10
  21. if (getStock == null) {
  22. getStock = "10";
  23. redisTemplate.opsForValue().set("stock", getStock);
  24. }
  25. if (Integer.parseInt(getStock) == 0) {
  26. //没有库存时,提示库存不足,不可在此处直接返回,因为未解锁
  27. tipText = "提交失败,库存不足!";
  28. } else {
  29. //库存足够时,将库存量减1,并提示当前库存量
  30. getStock = (Integer.parseInt(getStock) - 1) + "";
  31. redisTemplate.opsForValue().set("stock", getStock);
  32. tipText = "提交成功,当前库存为:" + getStock;
  33. }
  34. } finally {
  35. log.info("开始解锁");
  36. lock.unlock();
  37. //在解锁后才向前端返回信息
  38. return tipText;
  39. }
  40. }

在项目中添加html页面,用于简单测试并发场景

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <input type="text" value="并发次数:" style="width: 60px" disabled>
  9. <input type="text" style="width: 50px">
  10. <input type="button" onclick="submit()" value="测试分布式锁"></input>
  11. </body>
  12. <script src="../js/jquery-1.12.4.js" type="text/javascript"></script>
  13. <script>
  14. function submit() {
  15. var textValue = $("input:text:last").val()
  16. for (let i = 0; i < textValue; i++) {
  17. //使用jquery发起请求
  18. $.getJSON('http://localhost:8080/get',function (resp) {
  19. console.log(resp)
  20. })
  21. }
  22. }
  23. </script>
  24. </html>

前端运行结果如下:

 结果:数据没有出现访问错误

2、用redisson实现spring缓存

2.1 在pom.xml文件中追加spring-boot-starter-cache依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-cache</artifactId>
  4. </dependency>

2.2 在application.yml文件中追加cache配置

spring:
  redis:
    port: 6379  #redis服务器端口
    host: 192.168.90.66   #redis服务器ip

  #以下为追加部分
  cache:  #spring项目开启缓存的配置
    type: redis
    redis:  #缓存key的有效期,单位为秒,如果在此处配置则适用于所有缓存
      time-to-live: 60  #如不设置,则永久有效。如需单独为每一个key配置有效期,见下文

2.3 在springBoot项目中的启动类中为指定缓存名称添加cache配置

示例代码如下:

  1. @SpringBootApplication
  2. @MapperScan(basePackages = "com.woniuxy.redistest.dao")
  3. @EnableCaching //必须添加此注解开启spring缓存
  4. public class RedisTestApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(RedisTestApplication.class, args);
  7. }
  8. //添加cache配置,如果不用为指定缓存名称设定有效期,可忽略下列代码
  9. @Bean
  10. CacheManager cacheManager(RedissonClient redissonClient){
  11. HashMap<String, CacheConfig> configHashMap = new HashMap<>();
  12. //为指定缓存名称设置有效期,单位为毫秒
  13. configHashMap.put("accountCache",new CacheConfig(30*1000,30*1000));
  14. return new RedissonSpringCacheManager(redissonClient,configHashMap);
  15. }
  16. }

注:即使不为指定缓存名称设置有效期,也要在springBoot启动类中添加@EnableCaching注解

2.4 在springBoot项目中使用缓存

示例代码如下:

  1. @RestController
  2. public class SpringCacheTestController {
  3. @Autowired
  4. private AccountService accountService;
  5. @GetMapping("/getAccountInfo")
  6. //@Cacheable开启缓存,key = "#id"中的id字段需与传入方法中的id字段保持一致
  7. //在redis中便保存了类似于以id的值作为key,以account对象作为value的map对象
  8. //后续调用此接口时便以id的值向redis中获取account对象
  9. @Cacheable(cacheNames = "accountCache",key = "#id")
  10. public Account getAccountInfo(Integer id){
  11. Account account = accountService.getById(id);
  12. return account;
  13. }
  14. @PutMapping("/modifyAccountInfo")
  15. @CachePut(cacheNames = "accountCache",key = "#account.id")
  16. //@CachePut修改缓存中的数据,根据account.id来修改内容
  17. // 其中id为Account类中的属性名,请根据实际情况修改,目的是获取到上个接口中产生的key
  18. //修改的内容就是返回的account对象中的属性
  19. public Account modifyAccountInfo(@RequestBody Account account){
  20. accountService.updateById(account);
  21. return account;
  22. }
  23. @GetMapping("/logoutAccountInfo")
  24. @CacheEvict(cacheNames = "accountCache",key = "#id")
  25. //@CacheEvict删除缓存中的数据,根据key = "#id"中id的值来删除指定缓存
  26. //不需要有返回值
  27. public void logoutAccountInfo(Integer id){}
  28. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/892857
推荐阅读
相关标签
  

闽ICP备14008679号