从.Net到Java学习第四篇——spring boot+redis

从.Net到Java学习系列目录

“学习java已经十天,有时也怀念当初.net的经典,让这语言将你我相连,怀念你......”接上一篇,本篇使用到的框架redis、FastJSON。

环境准备

安装redis,下图是我本机的redis绿色版,你可以网上自行下载安装,如果不知道如何怎么操作,可以移步到我的另一篇文章:ASP.NET Redis 开发

以管理员身份打开CMD窗口:

C:\Users\zouqj>e:E:\>cd E:\Redis-x64-3.2.100E:\Redis-x64-3.2.100>redis-server --service-install redis.windows.conf --loglevel verbose --service-name redis --port 6379

运行之后,记得启动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: 0host: 127.0.0.1port: 6379pool:max-active: 100max-idle: 10max-wait: 100000timeout: 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;}@Beanpublic 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 {@Resourceprivate RedisTemplate<String, ?> redisTemplate;@Overridepublic boolean set(final String key, final String value) {boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {@Overridepublic Boolean doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer();connection.set(serializer.serialize(key), serializer.serialize(value));return true;}});return result;}@Overridepublic String get(final String key) {String result = redisTemplate.execute(new RedisCallback<String>() {@Overridepublic String doInRedis(RedisConnection connection) throws DataAccessException {RedisSerializer<String> serializer = redisTemplate.getStringSerializer();byte[] value = connection.get(serializer.serialize(key));return serializer.deserialize(value);}});return result;}@Overridepublic boolean expire(final String key, long expire) {return redisTemplate.expire(key, expire, TimeUnit.SECONDS);}@Overridepublic boolean remove(final String key) {boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {@Overridepublic 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();@Autowiredprivate RedisService redisService;@Testpublic void contextLoads() throws Exception {}/*** 插入字符串*/@Testpublic void setString() {redisService.set("redis_string_test", "springboot redis test");}/*** 获取字符串*/@Testpublic void getString() {String result = redisService.get("redis_string_test");System.out.println(result);}/*** 插入对象*/@Testpublic void setObject() {Person person = new Person("person", "male");redisService.set("redis_obj_test", json.toJSONString(person));}/*** 获取对象*/@Testpublic void getObject() {String result = redisService.get("redis_obj_test");Person person = json.parseObject(result, Person.class);System.out.println(json.toJSONString(person));}/*** 插入对象List*/@Testpublic 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*/@Testpublic void getList() {String result = redisService.get("redis_list_test");List<String> list = json.parseArray(result, String.class);System.out.println(list);}@Testpublic void remove() {redisService.remove("redis_test");}}
View Code

 我们发现,在单元测试类上面自动添加了2个注解,@SpringBootTest@RunWith(SpringRunner.class)

@SpringBootTest注解是SpringBoot自1.4.0版本开始引入的一个用于测试的注解。

@RunWith就是一个运行器

@RunWith(SpringRunner.class)就是指用SpringRunner来运行

运行单元测试:

查看redis中的结果,这里用到一个可视化的redis管理工具:RedisDesktopManager

转载于:https://www.cnblogs.com/jiekzou/p/9205117.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 4409 Family Name List LCA +stl

http://acm.hdu.edu.cn/showproblem.php?pid4409 赛后才过只能说悲剧了&#xff0c;知道思路&#xff0c;stl不熟悉&#xff0c;所以导致写的很慢....占据了很多时间&#xff0c;手速代码准确度。。哎。。。 题意&#xff1a; 给你一个家谱&#xff0c;n个人的姓名&#xff0c…

mysql杂记

1、 mysql安装完成后需要将mysql里面的bin目录加到环境变量里之后&#xff0c;才能在cmd窗口里使用mysql命令 2、 在CMD命令窗口敲入命令 mysql -hlocalhost -uroot -ppassword进入mysql数据库 这里我的用户名是root&#xff0c;密码是123456 转载于:https://www.cnblogs.com/y…

vue created 生命周期

在实例创建完成后被立即调用。在这一步&#xff0c;实例已完成以下的配置&#xff1a;数据观测 (data observer)&#xff0c;属性和方法的运算&#xff0c;watch/event 事件回调。然而&#xff0c;挂载阶段还没开始&#xff0c;$el属性目前不可见。 methods、data、watch等可以…

android cne服务,Android内存优化-了解内存篇

查看系统内存文件shellaries:/ $ cat /proc/meminfoMemTotal: 1970216 kBMemFree: 83756 kBBuffers: 156020 kBCached: 702516 kBSwapCached: 0 kBActive: 1160284 kBInactive: 397932 kBActive(anon): 778932 kBInactive(anon): 2228 kBActive(file): 381352 kBInactive(file)…

Shell中的特殊字符

通配符 当需要用命令处理一组文件&#xff0c;例如file1.txt、file2.txt、file3.txt……&#xff0c;用 户不必一一输入文件名&#xff0c;可以使用Shell通配符。Shell命令的通配符含义如下表 引号 在 Shell 中引号分为 2 种&#xff1a;单引号、双引号。 &#xff08; 1 &…

android的帧布局,七、Android帧布局FrameLayout和霓虹灯效果

帧布局容器为每个加入其中的组件创建一个空白的区域(称为一帧)&#xff0c;所有每个子组件占据一帧&#xff0c;这些帧都会根据gravity属性执行自动对齐。FrameLayout的常用XML属性和相关方法XML属性相关方法说  明android:foregroundsetForeground(Drawable)设置该帧布局容器…

flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...

时代在变化&#xff0c;科技在进步&#xff0c;曾几何时我们一度以为的高科技&#xff0c;在现在看来也不过是平常到不能再平常的东西。游戏开发也一样&#xff0c;以前需要代码才能开发制作而成&#xff0c;现如今都不需要了&#xff0c;直接编辑就OK&#xff0c;Steam商城这次…

快速构建Windows 8风格应用10-设备方向

本篇博文主要介绍常用支持Windows 8操作系统设备的方向、如何获取当前设备方向、DisplayProperties类 常用支持Windows 8操作系统设备的方向在我们常用的设备当中&#xff0c;Windows 8是通过什么来监控设备方向呢&#xff1f;答案是方向传感器&#xff0c;那么对于设备的不同方…

CSDN怎么转载别人的博客

参考&#xff1a;CSDN怎么转载别人的博客 作者&#xff1a;zhongjianblackberry 发布时间&#xff1a;2018-03-06 11:57:59 网址&#xff1a;https://blog.csdn.net/zhongjianblackberry/article/details/79456338 目录转载CSDN博客步骤&#xff1a;Markdown和HTML相关小知识Ma…

青岛西海岸惠普大数据_青岛西海岸新区用好卫星大数据 为城市治理全面赋能...

来源&#xff1a;环球网为推进城市治理数字化程度&#xff0c;提升城市治理的智能化和精细化水平&#xff0c;青岛西海岸新区搭建了人工智能搜索视觉分析平台&#xff0c;以月度更新的频率&#xff0c;汇聚了新区0.5米高分辨率卫星影像数据&#xff0c;通过数据资源共享系统为各…

总结jenkins Android自动打包遇到的坑

一、ndk-build报错 [roothejianlai-jenkins LearnGradle]# ndk-build /usr/local/android-ndk-r8/ndk-build: /usr/local/android-ndk-r8/prebuilt/linux-x86/bin/make: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 解决方法&#xff1a;安装glibc.i6…

android的热修复,Android热修复原理

热修复框架技术主要有三类&#xff0c;代码修复&#xff0c;资源修复&#xff0c;动态链接库修复。资源修复很多资源修复的框架参考了Instant Run资源修复的原理&#xff0c;所以先了解一下Instant RunInstant RunInstant Run是Android Studio 2.0以后新增的一个运行机制&#…

树莓派的四种登陆方式

参考&#xff1a;树莓派的4种登陆方式 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-02 09:15:30 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113524929?spm1001.2014.3001.5502 目录一、HDMI视频线二、串口1.修改sd卡中的系统文件2…

丰收互联蓝牙key怎么开机_ublox收购Rigado的蓝牙模块业务,扩大蓝牙低功耗产品组合...

全球领先的定位与无线通讯技术供应商u-blox 宣布&#xff0c;已与 Rigado签署资产购买协议&#xff0c;收购其蓝牙模块业务。Rigado是商业物联网Edge-as-a-Service(EaaS)边缘即服务网关解决方案的领先供应商&#xff0c;于2015年开始提供通过认证的无线模块。强化蓝牙产品系列此…

好的编程风格

1。关键字 if, while, for 后有一个空格 2。号之类的双目运算符两侧都有空格 3。后缀运算符和操作数之间不加空格 例如 s.a , foo(argu) , a[i] 4。, 号和 ; 号之后要加空格&#xff0c;例如 foo(argu1, argu2) for (i0; i<20; i) 5。关于双目运算符两侧加空格可以灵活规定&…

android 时间戳 时区,三句话理解时区与时间戳

从不浪费时间的人&#xff0c;没有工夫抱怨时间不够。 —— 杰弗逊第一句话&#xff1a;时间戳时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字&#xff0c;叫时间戳。时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、PO…

windows下的diskpart指令彻底格式化清除U盘

参考&#xff1a;windows下的diskpart指令修复U盘分区 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-02 09:38:55 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113537038?spm1001.2014.3001.5501 参考&#xff1a;原文链接 作者&…

简述控制反转ioc_讲一下你理解的 DI 、IoC、DIP ?

作者 | 木小楠链接 |cnblogs.com/liuhaorain/p/3747470.html摘要面向对象设计(OOD)有助于我们开发出高性能、易扩展以及易复用的程序。其中&#xff0c;OOD有一个重要的思想那就是依赖倒置原则(DIP)&#xff0c;并由此引申出IoC、DI以及Ioc容器等概念。本文我们将一起学习这些概…

html模糊遮罩层磨砂玻璃,常见的PPT背景:如何设计PPT背景?

第一种&#xff1a;纯色背景纯色背景分为两类&#xff0c;一种为黑白灰等“无色”背景&#xff0c;另一种就是彩色背景。黑白灰等无色背景&#xff0c;是安全的背景&#xff0c;容易配色&#xff0c;所以在使用上最多&#xff0c;如果没有色彩基础的朋友&#xff0c;建议还是用…

linux分文件编程、静态库与动态库

参考&#xff1a;linux静态库与动态库编程 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-02 16:51:49 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113539449?spm1001.2014.3001.5501 目录一、分文件编程的引入优点实现二、库的概念什…