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,…

ubuntu系统下解决无法观看在线视频的办法

如果你打开腾讯视频和爱奇异看视频&#xff0c;提示你要安装flash&#xff0c;解决办法&#xff1a; sudo apt-get install ubuntu-restricted-extras

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;。然后…

Modbus 通信协议详解

Modbus 通信协议详解&#xff1a; https://www.cnblogs.com/txwtech/p/11104428.html Modbus 通信协议详解

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;让系…

几种php 删除数组元素方法

看一完整删除重复数组实例 代码如下复制代码 //删除数组中的一个元素 function array_remove_value(&$arr, $var){ foreach ($arr as $key > $value) { if (is_array($value)) { array_remove_value($arr[$key], $var); } else { $value trim($value); if ($value $va…

Modbus通信协议之CRC16冗余循环校验函数

Modbus 通信协议详解&#xff1a;https://www.cnblogs.com/txwtech/p/11104428.html Modbus 通信协议详解 下面是在QT5 C控制台测试程序。 #include <QCoreApplication> #include <QTextStream> #include <stdio.h>//然后&#xff0c;在使用cin、cout、cer…

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;发送注册邮件等。 实现延迟队列的方式有…

bzoj 2121 DP

首先如果我们能处理出来i,j段能不能消掉&#xff0c;这样就可以直接dp转移了&#xff0c;设w[i]为前i为最少剩下多少&#xff0c;那么w[i]w[j-1] (flag[j][i])。 现在我们来求flag[i][j]&#xff0c;首先我们可以把字符串组建立trie然后处理在串L中从left位置开始的所有的flag&…

三、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文件的…

工作方法

刚入职场的年轻人&#xff0c;总不喜欢写工作汇报&#xff0c;想来有如下原因:觉得每天都在做同样的事情&#xff0c;没有多少有趣新鲜的素材好写觉得这是领导对自己的监控&#xff0c;写了会有不少工作疏漏落在领导手上不太知道如何将本日工作进行总结其实每日工作汇报是非常重…

Python弹窗提示警告框MessageBox

需要安装pywin32模块&#xff0c;pip install pywin32 # pip install pywin32 import win32api import win32con# 提醒OK消息框 win32api.MessageBox(0, "这是一个测试提醒OK消息框", "提醒",win32con.MB_OK)# 是否信息框 win32api.MessageBox(0, "这…

一次失败的蛋疼的设计

需求&#xff1a;当一个用户上传一条记录之后&#xff0c;通知某一个组或者某几个组的用户查看。用户可以属于多个组。 分析&#xff1a;当用户登录之后&#xff0c;判断自己所在的组是否属于通知组&#xff0c;是&#xff0c;则提醒。 SQL&#xff1a; select * from newsGro…

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

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

XCOPY不是内部或外部命令,也不是可运行程序 修复

系统常用命令无法识别 解决 1.进入系统安装目录的system32中&#xff0c;一般目录为C:\Windows\System32&#xff0c;找一下可执行文件是否存在&#xff0c;是否可以运行&#xff08;如ipconfig&#xff0c;直接点击会出现一个命令行窗口&#xff0c;一闪而逝&#xff09;&…