Spring全家桶系列--SpringBoot入门Redis

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Spring全家桶系列--SpringBoot入门Redis

首先,Redis是什么?


Redis是一个开源的,基于内存的键值数据存储,用作数据库,缓存和消息代理。在实现方面,Key-Value存储代表NoSQL空间中最大和最老的成员之一。Redis支持数据结构,如字符串,散列,列表,集和带范围查询的有序集。


在spring data redis的框架,可以很容易地编写,通过提供一个抽象的数据存储使用Redis的键值存储的Spring应用程序。 非关系型数据库,基于内存,存取数据的速度不是关系型数据库所能比拟的 redis是键值对(key-value)的数据库


有5中主要数据类型:


  • 字符串类型 string
  • 散列类型 hash
  • 列表类型 list
  • 集合类型 set
  • 有序集合类型 zset


redis缓存为啥速度快


这么说吧,别人问你什么是“redis”,如果你知道,你可以直接吧啦吧啦一大堆,其实这个时候你的大脑就类似redis缓存,别人问的“redis”就是key,你说出来的结果就是value,而你如果不知道,你就去上网查,然后再告诉别人,这就类似于查询数据库了,你查了再告诉别人当然慢了!


你把脑袋里的东西写进笔记就类似redis持久化保存了;


你过了两个月把这玩意忘了,就是redis的定期删除了;


引自:https://blog.csdn.net/angleflyyy/article/details/81627785


准备工作


项目工具环境:

  • IDEA 2018.2
  • Gradle 4+
  • JDK1.8以上
  • redis服务器


设置Redis服务器


redis下载地址:https://redis.io/download


如果你的电脑是Mac:

  1. brew install redis

然后运行redis服务器

  1. cuifuandeMacBook-Pro:~ cuifuan$ redis-server
  2. 25336:C 29Nov201814:53:42.490# oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  3. 25336:C 29Nov201814:53:42.490# Redis version=5.0.2, bits=64, commit=00000000, modified=0, pid=25336, just started
  4. 25336:C 29Nov201814:53:42.490# Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
  5. 25336:M 29Nov201814:53:42.491*Increased maximum number of open files to 10032(it was originally set to 256).
  6.                _._                                                  
  7.           _.-``__ ''-._                                            
  8.      _.-``    `.  `_.  ''-._           Redis5.0.2(00000000/0)64 bit
  9.  .-``.-```.  ```\/    _.,_ ''-._                                  
  10. (    '      ,       .-`  | `,    )     Running in standalone mode
  11. |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
  12. |    `-._   `._    /     _.-'    |     PID: 25336
  13.  `-._    `-._  `-./  _.-'    _.-'                                  
  14. |`-._`-._    `-.__.-'    _.-'_.-'|                                  
  15. |    `-._`-._        _.-'_.-'    |           http://redis.io        
  16.  `-._    `-._`-.__.-'_.-'    _.-'                                  
  17. |`-._`-._    `-.__.-'    _.-'_.-'|                                  
  18. |    `-._`-._        _.-'_.-'    |                                  
  19.  `-._    `-._`-.__.-'_.-'    _.-'                                  
  20.      `-._    `-.__.-'    _.-'                                      
  21.          `-._        _.-'                                          
  22.              `-.__.-'                                              

  23. 25336:M 29Nov201814:53:42.492# Server initialized
  24. 25336:M 29Nov201814:53:42.492*Ready to accept connections


初始化项目


始界面初始化一个项目


image.png


这里选择的是Gradle,选择完成点击Generate Projrct生成项目,这个时候会自动下载一个压缩包给你,解压过后导入,导入IDEA教程:http://note.youdao.com/noteshare?id=74e2d65e2d22cd684c3fdd6695b3ecdf


Gradle 依赖管理


让我们在build.gradle中为我们正在构建的示例应用程序声明必要的依赖项

  1. buildscript {
  2.    repositories {
  3.        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/'}
  4.    }
  5.    dependencies {
  6.        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.0.RELEASE")
  7.    }
  8. }

  9. apply plugin:'java-library'
  10. apply plugin:'org.springframework.boot'
  11. apply plugin:'io.spring.dependency-management'

  12. group='com.example'
  13. version ='0.0.1-SNAPSHOT'
  14. sourceCompatibility =1.8

  15. repositories {
  16.    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/'}
  17. }

  18. dependencies {
  19.    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  20.    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
  21.    implementation 'org.springframework.boot:spring-boot-starter-web'
  22.    implementation 'mysql:mysql-connector-java'
  23.    implementation 'org.projectlombok:lombok'
  24.    implementation 'org.apache.commons:commons-pool2:2.4.2'
  25.    implementation 'com.alibaba:fastjson:1.2.51'
  26.    testImplementation 'org.springframework.boot:spring-boot-starter-test'
  27. }


开始使用


凭借着SpringBoot的开箱即用的特点,集成Redis也不例外


  • redisTemplate.opsForValue();//操作字符串
  • redisTemplate.opsForHash();//操作hash
  • redisTemplate.opsForList();//操作list
  • redisTemplate.opsForSet();//操作set
  • redisTemplate.opsForZSet();//操作有序set


image.png


在Spring的测试类中开始使用:


  1. redisTemplate.opsForValue().set("username","test");


执行过后发现存在redis中的数据:


image.png


是乱的,是因为在set后redis会序列化key和value,所以我们要在config中重写一下redisTemplate

src/main/java/com/example/springbootredisdemo/config/RedisConfig.java

  1. package com.example.springbootredisdemo.config;

  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.data.redis.serializer.GenericToStringSerializer;
  7. import org.springframework.data.redis.serializer.RedisSerializer;
  8. import org.springframework.data.redis.serializer.StringRedisSerializer;

  9. @Configuration
  10. publicclassRedisConfig{

  11.    privatefinalRedisTemplate redisTemplate;

  12.    @Autowired
  13.    publicRedisConfig(RedisTemplate redisTemplate){
  14.        this.redisTemplate = redisTemplate;
  15.    }

  16.    @Bean
  17.    @SuppressWarnings("unchecked")
  18.    publicRedisTemplate<String,Object> redisTemplate(){
  19.        RedisSerializer<String> stringSerializer =newStringRedisSerializer();
  20.        RedisSerializer<Object> jsonString =newGenericToStringSerializer<>(Object.class);
  21.        redisTemplate.setKeySerializer(stringSerializer);
  22.        redisTemplate.setValueSerializer(jsonString);
  23.        redisTemplate.setHashKeySerializer(stringSerializer);
  24.        redisTemplate.setHashValueSerializer(jsonString);
  25.        return redisTemplate;
  26.    }

  27. }


再去执行一下刚刚的方法


image.png


经过自定义的序列化之后可以了,没有乱码了

opsForList()添加操作
  1.    @Test
  2.    publicvoidCsetListRedis(){
  3.        List<String> trap =newArrayList<>();
  4.        trap.add("张三");
  5.        trap.add("张无忌");
  6.        trap.add("新垣结衣");
  7.        //循环向userlist左添加值
  8.        trap.forEach(value->redisTemplate.opsForList().leftPush("userlist",value));
  9.        //向userlist右添加值
  10.        redisTemplate.opsForList().rightPush("userlist","rightValue");
  11.        log.info("userlist->{}",redisTemplate.opsForList().range("userlist",0,10));
  12.    }


image.png


opsForList()删除操作
  1.    @Test
  2.    publicvoidDlistRedisRemove(){
  3.        redisTemplate.opsForList().remove("userlist",0,"张无忌");
  4.    }


image.png


通过源码看这里有三个参数:

  • key 对应的是redis中存的key值
  • count 正数就是从左边开始删除 负数是从右面 例如-1就从右删除第一个值为value的,0代表删除全部值为value的
  • value 就是需要从list移除的值
opsForSet()添加操作

利用了set值的不可重复

  1.    @Test
  2.    publicvoidCsetRedis(){
  3.        List<String> trap =newArrayList<>();
  4.        trap.add("张三");
  5.        trap.add("里斯");
  6.        trap.add("里斯");
  7.        trap.add("张无忌");
  8.        trap.add("新垣结衣");
  9.        System.out.print(trap.toString());
  10.        //循环向userlist左添加值
  11.        trap.forEach(value->redisTemplate.opsForSet().add("userSet",value));
  12.        log.info("取出userSet->{}",redisTemplate.opsForSet().members("userSet"));
  13.    }


结果


image.png


符合了Set集合的无序和不可重复性

opsForSet()的删除操作

这个删除操作就比较容易了,直接根据set的key值,后面参数写其需要删除的value就可以

  1.    @Test
  2.    publicvoidEsetRedisRemove(){
  3.        redisTemplate.opsForSet().remove("userSet","张无忌");
  4.    }

opsForHash()操作
  1.    //opsForHash()操作
  2.    @Test
  3.    publicvoidFhashRedisAdd(){
  4.        //添加
  5.        redisTemplate.opsForHash().put("user","phone",10086);
  6.        redisTemplate.opsForHash().put("user","address","Shanghai");
  7.        redisTemplate.opsForHash().put("user","del","mubaba");
  8.        redisTemplate.opsForHash().put("user","dada","达达");
  9.        //修改
  10.        redisTemplate.opsForHash().put("user","address","Beijing");
  11.        //删除
  12.        redisTemplate.opsForHash().delete("user","del","dada");
  13.    }

结果


image.png


测试类SpringbootRedisDemoApplicationTests


src/test/java/com/example/springbootredisdemo/SpringbootRedisDemoApplicationTests.java


  1. package com.example.springbootredisdemo;

  2. import com.example.springbootredisdemo.service.NovelService;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.junit.FixMethodOrder;
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.junit.runners.MethodSorters;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import org.springframework.data.redis.core.RedisTemplate;
  11. import org.springframework.test.context.junit4.SpringRunner;

  12. import java.util.ArrayList;
  13. import java.util.List;

  14. //根据测试方法名字搞定执行顺序
  15. @FixMethodOrder(MethodSorters.NAME_ASCENDING)
  16. @RunWith(SpringRunner.class)
  17. @SpringBootTest
  18. @Slf4j
  19. publicclassSpringbootRedisDemoApplicationTests{

  20.    @Autowired
  21.    privateNovelService novelService;

  22.    @Autowired
  23.    privateRedisTemplate<String,Object> redisTemplate;

  24.    privatefinalstaticString KEY ="username";
  25.    privatefinalstaticString VALUE ="test";


  26.    @Test
  27.    publicvoidAstringRedis(){
  28.        redisTemplate.opsForValue().set(KEY,VALUE);
  29.        log.info("string set存储:{}->{}",KEY,VALUE);
  30.        redisTemplate.opsForValue().get(KEY);
  31.        log.info("string 根据{}取出{}",KEY,VALUE);
  32.    }

  33.    @Test
  34.    publicvoidBlistRedis(){
  35.        List<String> trap =newArrayList<>();
  36.        trap.add("张三");
  37.        trap.add("张三");
  38.        trap.add("张无忌");
  39.        trap.add("新垣结衣");
  40.        //循环向userlist左添加值
  41.        trap.forEach(value->redisTemplate.opsForList().leftPush("userlist",value));
  42. //        redisTemplate.opsForList().leftPushAll("userlist",trap);
  43.        //向userlist右添加值
  44.        redisTemplate.opsForList().rightPush("userlist","rightValue");
  45.        //取出userlist的值
  46.        log.info("userlist->{}",redisTemplate.opsForList().range("userlist",0,10));
  47.    }

  48.    @Test
  49.    publicvoidCsetRedis(){
  50.        List<String> trap =newArrayList<>();
  51.        trap.add("张三");
  52.        trap.add("里斯");
  53.        trap.add("里斯");
  54.        trap.add("张无忌");
  55.        trap.add("新垣结衣");
  56.        System.out.print(trap.toString());
  57.        //循环向userlist左添加值
  58.        trap.forEach(value->redisTemplate.opsForSet().add("userSet",value));
  59.        log.info("取出userSet->{}",redisTemplate.opsForSet().members("userSet"));
  60.    }

  61.    @Test
  62.    publicvoidDlistRedisRemove(){
  63.        redisTemplate.opsForList().remove("userlist",0,"张无忌");
  64.    }


  65.    @Test
  66.    publicvoidEsetRedisRemove(){
  67.        redisTemplate.opsForSet().remove("userSet","张无忌");
  68.    }

  69.    //opsForHash()操作
  70.    @Test
  71.    publicvoidFhashRedisAdd(){
  72.        //添加
  73.        redisTemplate.opsForHash().put("user","phone",10086);
  74.        redisTemplate.opsForHash().put("user","address","Shanghai");
  75.        redisTemplate.opsForHash().put("user","del","mubaba");
  76.        redisTemplate.opsForHash().put("user","dada","达达");
  77.        //修改
  78.        redisTemplate.opsForHash().put("user","address","Beijing");
  79.        //删除
  80.        redisTemplate.opsForHash().delete("user","del","dada");
  81.    }
  82. }


小知识


方法名字前加ABCD...是为了让方法有执行顺序,根据测试方法名字搞定执行顺序,在方法上加注解 @FixMethodOrder(MethodSorters.NAME_ASCENDING)


日志注解@Slf4j是为了让日志书写更方便


  1. //之前写日志  
  2. log.info("输出a"+index+"b");
  3. //现在
  4. log.info("输出a{}b",index);


多个参数可以用多个{},总之,喜欢哪个用哪个,谢谢!


码云代码地址


https://gitee.com/cuifuan/SpringBoot


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
36 1
|
1月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
84 2
|
1月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
62 8
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
67 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
27 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
31 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
21天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
34 0
下一篇
无影云桌面