Spring Boot(十一)Redis集成从Docker安装到分布式Session共享

一、简介

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,Redis也是技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」首字母缩写,也就是「远程字典服务」。

Redis相比Memcached提供更多的数据类型支持和数据持久化操作。

二、在Docker中安装Redis

2.1 下载镜像

访问官网:https://hub.docker.com/r/library/redis/ 选择下载版本,本文选择最新Stable 4.0.11

使用命令拉取镜像:

docker pull redis:4.0.11

2.2 启动容器

启动Redis命令如下:

docker run --name myredis -p 6379:6379 -d redis:4.0.11 redis-server --appendonly yes

命令说明:

  • –name 设置别名
  • -p 映射宿主端口到容器端口
  • -d 后台运行
  • redis-server --appendonly yes 在容器启动执行redis-server启动命令,打开redis持久化

启动成功之后使用命令:

docker ps

查看redis运行请求,如下图为运行成功:

2.3 使用客户端连接

连接Redis不错的GUI工具应该是Redis Desktop Manager了,不过现在只有Linux版可以免费下载,我上传了一个Windows版本在百度云,版本号为:0.9.5(发布于2018.08.24)也是比较新的,链接: https://pan.baidu.com/s/16npZtnGa3-p2PAafiPEAkA 密码: 9uqg,还是免安装的,很好用。

Redis Desktop Manager客户端预览:

三、Redis集成

开发环境

  • Spring Boot 2.0.4 RELEASE
  • Manven

3.1 添加依赖

在pom.xml添加如下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

注意不要依赖“spring-boot-starter-redis”它是旧版本,新版已经迁移到“spring-boot-starter-data-redis”了。

3.2 配置Redis

在application.properties进行如下设置:

# Redis 配置
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接密码(默认为空)
spring.redis.password=
# Redis服务器连接端口
spring.redis.port=6379  
# Redis分片(默认为0)Redis默认有16个分片
spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制)
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=10000
# 指定spring的缓存为redis
spring.cache.type=redis

注意:spring.redis.timeout不要设置为0,设置为0查询Redis时会报错,因为查询连接时间太短了。

3.3 Redis使用

完成以上配置之后就可以写代码操作Redis了,示例代码如下:

@Autowired
private StringRedisTemplate stringRedisTemplate;@RequestMapping("/")
public String doTest() {String _key = "time"; //缓存keystringRedisTemplate.opsForValue().set(_key, String.valueOf(new Date().getTime())); //redis存值return stringRedisTemplate.opsForValue().get(_key); //redis取值
}

更多操作:

  • stringRedisTemplate.opsForValue().set(“test”, “100”,60*10,TimeUnit.SECONDS); 向redis里存入数据和设置缓存时间;
  • stringRedisTemplate.hasKey(“keyName”); 检查key是否存在,返回boolean;

四、声明式缓存

为了简化缓存可以直接使用声名式缓存,可以省去设置缓存和读取缓存的代码,使用起来会方便很多。

声明式缓存使用步骤如下:

4.1 设置Redis缓存

在pom.xml文件设置缓存为Redis,代码如下:

spring.cache.type=redis

4.2 开启全局缓存

在启动文件Application.java设置开启缓存,代码如下:

@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

4.3 使用注解

注解如下:

  • @Cacheable 设置并读取缓存(第一次设置以后直接读取);
  • @CachePut 更新缓存(每次删除并更新缓存结果);
  • @CacheEvict 删除缓存(只删除缓存);

通用属性:

  • value 缓存名称;
  • key 使用SpEL表达式自定义的缓存Key,比如:#name是以参数name为key的缓存,#resule.name是以返回结果的name作为key的缓存;

4.3.1 @Cacheable 使用

示例代码如下:

// 缓存key
private final String _CacheKey = "userCacheKeyTime";@RequestMapping("/")
@Cacheable(value = _CacheKey)
public String index() {System.out.println("set cache");return "cache:" + new Date().getTime();
}

只有首次访问的时候会在控制台打印“set cache”信息,之后直接返回Redis结果了,不会在有添加的打印信息出现。

4.3.2 @CachePut 使用

示例代码如下:

// 缓存key
private final String _CacheKey = "userCacheKeyTime";@RequestMapping("/put")
@CachePut(value = _CacheKey)
public String putCache() {System.out.println("update cache");return "update cache:" + new Date().getTime();
}

访问http://xxx/put 每次会把最新的数据存储缓存起来。

4.3.3 @CacheEvict 使用

示例代码如下:

// 缓存key
private final String _CacheKey = "userCacheKeyTime";@RequestMapping("/del")
@CacheEvict(value = _CacheKey)
public String delCache() {System.out.println("缓存删除");return "delete cache:" + new Date().getTime();
}

访问http://xxx/del 只会删除缓存,除此之后不会进行任何操作。

五、分布式Session共享

在分布式系统中Session共享有很多种方案,而把Session托管在缓存中是最常用的方案之一,下面来看Session在Redis中的托管步骤。

5.1 添加依赖

在pom.xml中添加如下引用:

<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>

5.2 开启Session功能

在启动类Application.java的类注解添加开启Session,代码如下:

@SpringBootApplication
@EnableCaching
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class RedisApplication {public static void main(String[] args) {SpringApplication.run(RedisApplication.class, args);}
}

其中maxInactiveIntervalInSeconds为Session过期时间,默认30分钟,设置单位为秒。

5.3 Session使用

接下来编写一段代码来测试一下Session,示例代码如下:

@RequestMapping("/uid")
public String testSession(HttpSession session) {UUID uid = (UUID) session.getAttribute("uid");if (uid == null) {uid = UUID.randomUUID();}session.setAttribute("uid", uid);return session.getId();
}

连续访问两次请求之后,查看控制台信息如下图:

可以看出,两次访问的SessionId是一样的,这个时候在查看Redis 客户端,如下图:

发现Redis里存储的Session过期时间也是对的,符合我们的设置。

5.4 分布式系统共享Session

因为把Session托管给同一台Redis服务器了,所以Session在Spring Boot中按照如上方式在配置多台服务器,得到的Session是一样的。

示例源码下载:https://github.com/vipstone/springboot-example/tree/master/springboot-redis

参考资料

Spring boot中Redis的使用:http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html

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

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

相关文章

统计在从1到n的正整数中1出现的次数

问题&#xff1a; 给定一个十进制正整数N&#xff0c;写下从1开始&#xff0c;到N的所有整数&#xff0c;然后数一下其中出现的所有“1”的个数。 例如&#xff1a;N 2&#xff0c;写下1&#xff0c;2。这样只出现了1个“1”。 N 12&#xff0c;我们会写下1, 2, 3, 4, 5, 6, 7,…

Spark Streaming源码分析 – DStream

A Discretized Stream (DStream), the basic abstraction in Spark Streaming, is a continuous sequence of RDDs (of the same type) representing a continuous stream of data.Dstream本质就是离散化的stream&#xff0c;将stream离散化成一组RDD的list&#xff0c;所以基本…

PowerShell遍历文件夹下的子文件夹和文件

PowerShell遍历文件夹下的子文件夹和文件是一件很容易的事儿。Get-ChildItem这个cmdlet就有一个recurse参数是用于遍历文件夹的。 PowerShell中&#xff0c;使用Get-ChildItem来获取文件夹下面的子文件夹和文件&#xff08;当然&#xff0c;它的功能不仅于此&#xff09;。然后…

Spring Boot(十三)RabbitMQ安装与集成

一、前言 RabbitMQ是一个开源的消息代理软件&#xff08;面向消息的中间件&#xff09;&#xff0c;它的核心作用就是创建消息队列&#xff0c;异步接收和发送消息&#xff0c;MQ的全程是&#xff1a;Message Queue中文的意思是消息队列。 1.1 使用场景 削峰填谷&#xff1a;用…

C++ DNN Opencv3.4 实现人脸计数和人脸检测

前言 OpenCV 3.3正式发布后&#xff0c;对深度学习&#xff08;dnn模块&#xff09;提供了更好的支持&#xff0c;dnn模块目前支持Caffe、TensorFlow、Torch、PyTorch等深度学习框架。 另外&#xff0c;新版本中使用预训练深度学习模型的API同时兼容C和Python&#xff0c;让系…

C++ SVM Opencv3.4实现人脸检测

很通俗的来说&#xff0c;haar算法计算特征就是用一块区域内黑色的值减去白色的值。但是一张图片像素点是非常多的&#xff0c;如果用普通的方法去计算一块区域的值&#xff0c;效率相当低下。这里有一种加速计算的方法--积分图&#xff1a;定义如下&#xff1a;&#xff08;维…

Spring Boot(十四)RabbitMQ延迟队列

一、前言 延迟队列的使用场景&#xff1a;1.未按时支付的订单&#xff0c;30分钟过期之后取消订单&#xff1b;2.给活跃度比较低的用户间隔N天之后推送消息&#xff0c;提高活跃度&#xff1b;3.过1分钟给新注册会员的用户&#xff0c;发送注册邮件等。 实现延迟队列的方式有…

三、Win10 64位PyCharm下打包.py程序为可执行exe文件且兼容32位和64位

WIN10 64位下Pycharm打包.py程序为可执行文件exe 上面衔接WIN10 64位下Pycharm打包.py程序为可执行文件exe,存在不兼容32位和64位的情况。 下面Win10 64位PyCharm下打包.py程序为可执行exe文件且兼容32位和64位说明: 前提条件 python3.8.2 32 位;注意:原来有 64 位 Pyth…

Java核心(一)线程Thread详解

一、概述 在开始学习Thread之前&#xff0c;我们先来了解一下 线程和进程之间的关系&#xff1a; 线程(Thread)是进程的一个实体&#xff0c;是CPU调度和分派的基本单位。 线程不能够独立执行&#xff0c;必须依存在应用程序中&#xff0c;由应用程序提供多个线程执行控制。 线…

Jetson Nano配置与使用(5)cuda测试及tensorflow gpu安装

Jetson Nano利用官方镜像进行安装后&#xff0c;系统已经安装好了JetPack&#xff0c;cuda&#xff0c;cudaa&#xff0c;OpenCV等组件&#xff0c;不过需要修改下环境变量才可以使用。 1.修改环境变量 利用vim打开 ~ 路径下.bashrc文件&#xff1a; sudo vi ~./bashrc文件的…

Java核心(二)深入理解线程池ThreadPool

本文你将获得以下信息&#xff1a; 线程池源码解读线程池执行流程分析带返回值的线程池实现延迟线程池实现 为了方便读者理解&#xff0c;本文会由浅入深&#xff0c;先从线程池的使用开始再延伸到源码解读和源码分析等高级内容&#xff0c;读者可根据自己的情况自主选择阅读…

Jetson Nano安装pytorch 基于torch1.6和torchvision0.7

需要注意的是&#xff0c;博主使用的是win10主机&#xff0c;通过局域网连接的jetson nano&#xff0c; 其中jetson nano的预制CUDA版本为10.2 Jetpack 4.1.1 分别执行以下命令&#xff0c;即可查看自己的jetson nano 预搭载的CUDA版本 sudo pip3 install jetson-stats sudo …

【Jetson-Nano】2.Tensorflow和Pytorch的安装

文章目录 1、Tensorflow多版本安装 1.1 Protobuf 安装1.2 安装依赖包及tensorflow1.151.3 安装其它常用库1.4 测试python包是否安装成功1.5 TensorRT和Opencv的安装1.6 pycuda和onnx安装1.7 Tensorflow2.3安装2、Pytorch安装 2.1 安装pytroch和torchvision2.2 安装环境验证参考…

Spring Boot 终极清单

一、Spring Boot 终极清单诞生原因我上学那会主要学的是 Java 和 .Net 两种语言&#xff0c;当时对于语言分类这事儿没什么概念&#xff0c;恰好在2009年毕业那会阴差阳错的先找到了 .Net 的工作&#xff0c;此后就开始了漫长的 .Net 编程之旅&#xff0c;说实话最初的“编程思…

简单的喷淋实验--嵌入式实训

目录 喷淋实验--嵌入式实训 1.MQTT通信原理 2.MQTT库的移植 3.代码流程 运行视频如下: 喷淋实验--嵌入式实训 1.MQTT通信原理 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的发布/订阅消息传输协议&#xff0c;旨在提供可靠、高效的通信…

Yolov5系列AI常见数据集(1)车辆,行人,自动驾驶,人脸,烟雾

下述所有数据可在下方二维码公众号回复&#xff1a; 数据大礼包 获得&#xff01;&#xff01;&#xff01; Fashion-MNIST图像数据集&#xff08;200.4MB&#xff09; 每个训练和测试样本都按照以下类别进行了标注&#xff1a; 标注编号描述0T-shirt/top&#xff08;T恤&…

Java核心(四)你不知道的数据集合

导读&#xff1a;Map竟然不属于Java集合框架的子集&#xff1f;队列也和List一样属于集合的三大子集之一&#xff1f;更有队列的正确使用姿势&#xff0c;一起来看吧&#xff01; Java中的集合通常指的是Collection下的三个集合框架List、Set、Queue和Map集合&#xff0c;Map并…

【Jetson-Nano】2.Tensorflow object API和Pytorch的安装

文章目录 1、Tensorflow多版本安装 1.1 Protobuf 安装1.2 安装依赖包及tensorflow1.151.3 安装其它常用库1.4 测试python包是否安装成功1.5 TensorRT和Opencv的安装1.6 pycuda和onnx安装1.7 Tensorflow2.3安装2、Pytorch安装 2.1 安装pytroch和torchvision2.2 安装环境验证参考…

Java核心(五)深入理解BIO、NIO、AIO

导读&#xff1a;本文你将获取到&#xff1a;同/异步 阻/非阻塞的性能区别&#xff1b;BIO、NIO、AIO 的区别&#xff1b;理解和实现 NIO 操作 Socket 时的多路复用&#xff1b;同时掌握 IO 最底层最核心的操作技巧。 BIO、NIO、AIO 的区别是什么&#xff1f; 同/异步、阻/非阻…

pyqt5让主窗口居中显示(显示在显示器的中间位置)

原文&#xff1a;https://blog.csdn.net/zzx188891020/article/details/105940024 课程重点&#xff1a; 就是让窗口居中显示 # QDesktopWidget import sys from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication from PyQt5.QtGui import QIconclass Cente…