从.Net到Java学习第四篇——spring boot+redis
“学习java已经十天,有时也怀念当初.net的经典,让这语言将你我相连,怀念你......”接上一篇,本篇使用到的框架redis、FastJSON。
环境准备
安装redis,下图是我本机的redis绿色版,你可以网上自行下载安装,如果不知道如何怎么操作,可以移步到我的另一篇文章:ASP.NET Redis 开发
以管理员身份打开CMD窗口:
- C:\Users\zouqj>e:
- E:\>cd E:\Redis-x64-3.2.
- E:\Redis-x64-3.2.>redis-server --service-install redis.windows.conf --loglevel verbose --service-name redis --port
运行之后,记得启动redis服务,我这里redis没有设置密码。
启动服务命令:net start redis
关于FastJSON框架的使用呢可以参考文章:高性能JSON框架之FastJson的简单使用
修改pom.xml,添加redis的依赖
- <!--redis-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-redis</artifactId>
- <version>1.3.8.RELEASE</version>
- </dependency>
- <!--JSON-->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.1.23</version>
- </dependency>
修改项目配置文件,添加如下配置节点
- redis:
- database: 0
- host: 127.0.0.1
- port: 6379
- pool:
- max-active: 100
- max-idle: 10
- max-wait: 100000
- timeout: 0
最终配置如下:
redis配置项说明:
- # REDIS (RedisProperties)
- # Redis数据库索引(默认为0)
- spring.redis.database=0
- # Redis服务器地址
- spring.redis.host=127.0.0.1
- # Redis服务器连接端口
- spring.redis.port=6379
- # Redis服务器连接密码(默认为空)
- spring.redis.password=
- # 连接池最大连接数(使用负值表示没有限制)
- spring.redis.pool.max-active=8
- # 连接池最大阻塞等待时间(使用负值表示没有限制)
- spring.redis.pool.max-wait=-1
- # 连接池中的最大空闲连接
- spring.redis.pool.max-idle=8
- # 连接池中的最小空闲连接
- spring.redis.pool.min-idle=0
- # 连接超时时间(毫秒)
- spring.redis.timeout=0
新建一个redis的配置类RedisConfig,因为是配置类,所以要在类上面添加注解@Configuration
@EnableAutoConfiguration注解我们看下它的源码,发现它是一个组合注解
- @Target({ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Inherited
- @AutoConfigurationPackage
- @Import({EnableAutoConfigurationImportSelector.class})
- public @interface EnableAutoConfiguration {
- String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
- Class<?>[] exclude() default {};
- String[] excludeName() default {};
- }
@EnableAutoConfiguration注解大致处理流程就是:
1、先去扫描已经被@Component所注释的类,当然会先判断有没有@Condition相关的注解。
2、然后递归的取扫描该类中的@ImportResource,@PropertySource,@ComponentScan,@Bean,@Import。一直处理完。
参考:@EnableAutoConfiguration 配置解释
- @Configuration
- @EnableAutoConfiguration
- public class RedisConfig {
- @Bean
- @ConfigurationProperties(prefix = "spring.redis.pool")
- public JedisPoolConfig getRedisConfig() {
- JedisPoolConfig config = new JedisPoolConfig();
- return config;
- }
- @Bean
- @ConfigurationProperties(prefix = "spring.redis")
- public JedisConnectionFactory getConnectionFactory() {
- JedisConnectionFactory factory = new JedisConnectionFactory();
- factory.setUsePool(true);
- JedisPoolConfig config = getRedisConfig();
- factory.setPoolConfig(config);
- return factory;
- }
- @Bean
- public RedisTemplate<?, ?> getRedisTemplate() {
- JedisConnectionFactory factory = getConnectionFactory();
- RedisTemplate<?, ?> template = new StringRedisTemplate(factory);
- return template;
- }
- }
添加一个redis的接口服务RedisService
- package com.yujie.service;
- public interface RedisService {
- /**
- * set存数据 * @param key * @param value * @return
- */
- boolean set(String key, String value);
- /**
- * get获取数据 * @param key * @return
- */
- String get(String key);
- /**
- * 设置有效天数 * @param key * @param expire * @return
- */
- boolean expire(String key, long expire);
- /**
- * 移除数据 * @param key * @return
- */
- boolean remove(String key);
- }
添加redis实现类RedisServiceImpl,注意下面代码中标红了的代码,这里设置redis的key和value以字符串的方式进行存储,如果不配置的话,默认是以16进制的形式进行存储,到时候我们读取的时候,就会看着很乱。
- @Service("redisService")
- public class RedisServiceImpl implements RedisService {
- @Resource
- private RedisTemplate<String, ?> redisTemplate;
- @Override
- public boolean set(final String key, final String value) {
- boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
- @Override
- public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
- RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
- connection.set(serializer.serialize(key), serializer.serialize(value));
- return true;
- }
- });
- return result;
- }
- @Override
- public String get(final String key) {
- String result = redisTemplate.execute(new RedisCallback<String>() {
- @Override
- public String doInRedis(RedisConnection connection) throws DataAccessException {
- RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
- byte[] value = connection.get(serializer.serialize(key));
- return serializer.deserialize(value);
- }
- });
- return result;
- }
- @Override
- public boolean expire(final String key, long expire) {
- return redisTemplate.expire(key, expire, TimeUnit.SECONDS);
- }
- @Override
- public boolean remove(final String key) {
- boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
- @Override
- public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
- RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
- connection.del(key.getBytes());
- return true;
- }
- });
- return result;
- }
- }
由于项目中引入了spring-boot-starter-test的依赖,也就是集成了spring boot的单元测试框架。给redis实现类,添加单元测试,将光标移动到RedisService接口位置处,然后按Alt+Enter,如下图所示:
全选所有方法
在model包中,添加一个实体类Person
- public class Person {
- private String name;
- private String sex;
- public Person() {
- }
- public Person(String name, String sex) {
- this.name = name;
- this.sex = sex;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- }
接下来,我们再修改一下单元测试
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class RedisServiceImplTest {
- private JSONObject json = new JSONObject();
- @Autowired
- private RedisService redisService;
- @Test
- public void contextLoads() throws Exception {
- }
- /**
- * 插入字符串
- */
- @Test
- public void setString() {
- redisService.set("redis_string_test", "springboot redis test");
- }
- /**
- * 获取字符串
- */
- @Test
- public void getString() {
- String result = redisService.get("redis_string_test");
- System.out.println(result);
- }
- /**
- * 插入对象
- */
- @Test
- public void setObject() {
- Person person = new Person("person", "male");
- redisService.set("redis_obj_test", json.toJSONString(person));
- }
- /**
- * 获取对象
- */
- @Test
- public void getObject() {
- String result = redisService.get("redis_obj_test");
- Person person = json.parseObject(result, Person.class);
- System.out.println(json.toJSONString(person));
- }
- /**
- * 插入对象List
- */
- @Test
- public void setList() {
- Person person1 = new Person("person1", "male");
- Person person2 = new Person("person2", "female");
- Person person3 = new Person("person3", "male");
- List<Person> list = new ArrayList<>();
- list.add(person1);
- list.add(person2);
- list.add(person3);
- redisService.set("redis_list_test", json.toJSONString(list));
- }
- /**
- * 获取list
- */
- @Test
- public void getList() {
- String result = redisService.get("redis_list_test");
- List<String> list = json.parseArray(result, String.class);
- System.out.println(list);
- }
- @Test
- public void remove() {
- redisService.remove("redis_test");
- }
- }
我们发现,在单元测试类上面自动添加了2个注解,@SpringBootTest和@RunWith(SpringRunner.class)
@SpringBootTest注解是SpringBoot自1.4.0版本开始引入的一个用于测试的注解。
@RunWith就是一个运行器
@RunWith(SpringRunner.class)就是指用SpringRunner来运行
运行单元测试:
查看redis中的结果,这里用到一个可视化的redis管理工具:RedisDesktopManager
从.Net到Java学习第四篇——spring boot+redis的更多相关文章
- 从.Net到Java学习第三篇——spring boot+mybatis+mysql
从.Net到Java学习第一篇——开篇 环境:mysql5.7 新建mysql数据库demo,然后执行如下sql脚本进行数据表创建和数据初始化: -- ------------------------ ...
- 从.Net到Java学习第十篇——Spring Boot文件上传和下载
从.Net到Java学习系列目录 图片上传 Spring Boot中的文件上传就是Spring MVC中的文件上传,将其集成进来了. 在模板目录创建一个新的页面 profile/uploadPage. ...
- 从.Net到Java学习第五篇——Spring Boot &&Profile &&Swagger2
从.Net到Java学习系列目录 刚学java不久,我有个疑问,为何用到的各种java开源jar包许多都是阿里巴巴的开源项目,为何几乎很少见百度和腾讯?不是说好的BAT吗? Spring Boot 的 ...
- Netty学习第四章 spring boot整合netty的使用
现在大多数项目都是基于spring boot进行开发,所以我们以spring boot作为开发框架来使用netty.使用spring boot的一个好处就是能给将netty的业务拆分出来,并通过spr ...
- spring Boot 学习(四、Spring Boot与任务)
一.异步任务 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在 处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用 多线程来完成此类任务,其实,在Spri ...
- Java学习第四篇:数组,排序,查找
一.数组 1.一维数组 (1).数组的定义 数据类型 数组名[]=new 数据类型[大小] public class Demo1 { public static void main(String[] ...
- Java 学习 第四篇;面向对象(1)
1:关于继承为了保证父类的良好封装性,不会被子类随意改变,设计父类时通常隐藏父类的内部数据,把父类属性改为private如果父类中可以被重写,但不希望被其他类自由访问可用protected修饰;2:什 ...
- 从.Net到Java学习第十一篇——SpringBoot登录实现
从.Net到Java学习系列目录 通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如何来验证我们的学习成果呢?当然是通过做项目来证明啦!所以从这一篇开始我将会对之前自己做 ...
- 从.Net到Java学习第八篇——SpringBoot实现session共享和国际化
从.Net到Java学习系列目录 SpringBoot Session共享 修改pom.xml添加依赖 <!--spring session--> <dependency> & ...
随机推荐
- 算法与数据结构(八) AOV网的关键路径(Swift版)
上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...
- CoreProfiler升级到.NetStandard 2.0
致所有感兴趣的朋友: CoreProfiler和相应的Sample项目cross-app-profiling-demo都已经升级到.NetStandrard 2.0和.NetCore 2.0. 有任何 ...
- Java提高篇(三):内部类和匿名内部类
一,内部类 其实内部类是十分简单的,我们根据其字里行间的意义就可以知道内部类应该是一个类当中的一个类,相当于一个类进行了嵌套,就如同循环的嵌套一般. 内部类有一个特征:内部类当中可以调用外部类当中的属 ...
- 使用vue+ivew做2048小游戏
首先先弄页面 废话不多说 上代码 静态页面代码 <template> <div class="main"> <div class="top& ...
- JVM基础系列第10讲:垃圾回收的几种类型
我们经常会听到许多垃圾回收的术语,例如:Minor GC.Major GC.Young GC.Old GC.Full GC.Stop-The-World 等.但这些 GC 术语到底指的是什么,它们之间 ...
- Hystrix针对不可用服务的保护机制以及引入缓存
之前我写过一篇博文,通过案例了解Hystrix的各种基本使用方式,在这篇文章里,我们是通过Hystrix调用正常工作的服务,也就是说,Hytrix的保护机制并没有起作用,这里我们将在HystrixPr ...
- Java核心技术及面试指南的视频讲解和代码下载位置
都是百度云盘,均无密码 代码下载位置: https://pan.baidu.com/s/1I44ob0vygMxvmj2BoNioAQ 视频讲解位置: https://pan.baidu.com/s/ ...
- 【Vue】IView之table组件化学习(二)
最基本的绑定table是这样的,需要columns和data两个属性. <template> <Card> <h4>表格栗子</h4> <Tabl ...
- java基础(十二 )-----Java泛型详解
本文对java的泛型的概念和使用做了详尽的介绍. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”.一提到 ...
- Spring中bean实例化的三种方式
之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例).那么今天我想来说说如何通过xml配 ...