springbootredis(springbootredis哨兵配置)

本篇文章给大家谈谈springbootredis,以及springbootredis哨兵配置对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

springboot整合redis异常汇总

项目中要用到redis,于是尝试通过springboot整合redis,redis集群采用3主3从,搭建方法参考:

springboot从2.x版本开始默认使用lettuce访问redis,所以部分配置由jedis改为lettuce

异常1: Cannot retrieve initial cluster partitions from initial URIs [RedisURI [host='192.168.1.1', port=6379]]

这个问题绕了很多弯路,根据网上的很多方案,以为是redis集群配置成了主从模隐世式,但是springboot连接使用的是cluster模式,最后发现问题出在spring.redis.timeout=0这条配置上。

spring.redis.timeout,在1.0中,时间相关的配置参数类型为int,默认单位为毫秒, 而且设置为0意味着不超时 ,2.x版本中参数类型为渣携帆Duration,需要添加单位,如:500ms

异常2: java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig

添加依赖即可

dependency

groupIdorg.apache.commons/groupId

artifactIdcommons-pool2/artifactId

version2.8.0/version

/dependency

异常3:Caused by: io.lettuce.core.RedisCommandExecutionException: CLUSTERDOWN The cluster is down

1.如果在配置文件中给redis设置了密码,还需要在redis-cli终端设置一下

config set requirepass xxxx(密码)

2.redis-cli 检查cluster的状态如雹

cluster info

3.配置文件中cluster-require-full-coverage设置为no,重启redis服务,可参考:

SpringBoot进阶之缓存中间件Redis

大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫

「大佬可以绕过 ~」

本节给大家讲讲 「Java的SpringBoot框架」 , 之前我们学习的都是java的基础知识和底层提供的一些能力,我们日常工作都是在写接口。在我们在产品开发中,一般我们都会选择比较稳定的框架来帮我们加速开发,不会自己去造轮子,而在java众多框架中,spring框架表现的非常好,大部分公司都会首选它作为开发框架,而至今,大部分企业都是以 springboot 来构建项目了,一个稳健的系统需要引入稳定的技术~

如果你是一路看过来的,很高兴你能够耐心看完。前几期都是带大家学习了 SpringBoot 的基础使用以及集成 mybatis 开发,这也是我们写业务的基础,如果你还不熟悉这些,请先看完它们。接下来的几期内容将会带大家进阶使用,会先讲解基础 中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有 收获 ,本期将会给大家讲解最热门的缓存中间件技术 Redis ,同样的,我们集成到 Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码

Redis 是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。全称叫 Remote Dictionary Server(远程数据服务) 是由 C语言 编写的,Redis是答顷一个 key-value 存储系统,它支持丰富的数据类型,如: string、list、set、zset(sorted set)、hash 。

它本质上是一种键值对数据库,我们之前学习的 mysql 它是持久层的关系型数据库,而 redis 它的存储主要存在 内存 中。我们都知道在 内存 中的数据读取是非常快的,就好比你把一个变量存到磁盘读取和直接放到代码中运行,肯定是在代码中拿到的速度快,因为运行时期,都是直接存到内存的。

给大家总结一下:

有了基本的概念之后,我们下面进行环境搭建,在学习阶段,安装 redis 很简单,生产环境一般我们也会选择云产品,一切为了服务保障,虽说它只是做缓存用,但也是系统的一把 保护伞

如果你是 mac 用户,你可以运行如下命令:

安装完成后会提示你运行命令,运行即可。

win 用户也很简单,直接下载 redis 软件,双击运行即可,运行之后它会有一个小方块的图案,和 locahost:6379 的log,说明运行成功了。初始阶段没有配置的 redis 默认 host 就是本地, port 就是 6379 , 而且是清源陆 没有密码 就可以访问的。

推荐一个客户端软件 Redis Desktop Manager ,它是 redis 的客户端界面软件,方便面我们学习的时候 清理缓存 使用,生产慎连。

我们不给大家讲它的基本命令使用,它也有语法,可以通过类似命令执行,如果想学习的小伙伴,可以自行搜索。本期重点内容是在 sprinboot 中的使用,我们平时开发不可能是去命令裂旅行里敲的,都是代码里执行,而目前市面上有很多封装好的库,我们可以直接调用它的方法,很方便的就可以操作它了,不用记一些繁琐的命令,下面我们就实际操作一下:

修改 pom.xml

修改 application.yml :

redis 默认是有 16 个库,不是 15 个啊,从 0 开始算的,我们随便连一个

通过代码很好理解, 首先需要引入 StringRedisTemplate ,然后需要设置一个 key ,那么思考一下,这个 key 允许重复吗

我们进客户端看一下,发现 key 还是只有一个,但是值变成了新的值了,所以可以得知 key 是唯一的,我们重新设置的时候相当于刷新了它。

在 redis 中删除缓存有两种方式,一种是自我消亡,也就是 过期 销毁,还有有一种是 主动 销毁,我们先看一下,过期时间如何设置

我们设置了 10s 后过期,过完10s后发现,这个```key data``消失了。我们在看看如何主动删除

我们可以利用 Redis 做一个计数器,实现自增功能,你可以用它做网站访问统计

通常做法,我们会把它封装一下,后续使用直接引入封装好的即可,把它直接交给 Springboot容器 管理

其实这个类,你还可以继续进一步封装,比如约束 key 的规范,约束过期时间,约束数据类型等等,这一切也都是为了规范和后期维护,防止滥用缓存

缓存的主要场景是用于解决热点数据问题,因为这些数据是访问频率比较高的,当大量的请求进来, mysql 可能压力很大,这样一来,数据查询效率就很慢,用户肯不高兴等了,这样用户体验很不好。所以我们一般做法,都是把这些热点数据放到缓存里,因为缓存读取速度很快。当有新数据的时候,我们再及时更新它,一般流程是先查询缓存,查到了直接返回缓存数据,查不到再走数据库,然后再刷回缓存。

但是并发足够大的时候,还是会暴露出很多问题,比如面试常问的一些高频问题 缓存雪崩、缓存穿透、缓存雪崩 ,这些问题后边会给大家专门讲,和如何去防范。所以总的来说,引入任何一门技术并不是万事大吉,还需我们不断的在实践中积累经验

本期到这里就结束了,总结一下,我们了解了什么是 redis ,以及在 springboot 中如何去使用它们,很简单,没什么复杂的东西。但这里想多说一点的是,缓存的设计却是很复杂的,因为工具是死的,人是活的,我们如何正确设计,需要我们在项目中不断的积累。

我们之前教大家查询列表数据,都是所有数据返回,还没有教大家如何去做分页,下期将带大家学习一下 mybatis 分页插件的使用 ,下期不见不散, 关注我,不迷路~

[img]

spring boot + redis 实现session共享分析

HttpSession是由servelet容器进行管理的。而我们常用的应用容器有 Tomcat/Jetty等, 这些容器的HttpSession都是存放在对应的应用容器的岩弯内存中,在分布式集群的环境下,通常我们使用Nginx或者LVS、Zuul等进行反向代理和负载均衡,因此用户请求是由一组提供相同服务的应用来进行处理,而用户最终请求到的服务由Nginx和LVS、Zuul进行确定。

那么问题就来了,我们怎样保证多个相同的应用共享同一份session数据?对于这种问题Spring为我们提供了Spring Session进行管理我们的HttpSession。项目地址:

1.添加Spring session的包,而Spring session 是将HttpSession存放在Redis中,因此启唯需要添加Redis的包。我们这里是用了悄枣培Spring boot进行配置Rdies。

2.使用@EnableRedisHttpSession注解进行配置启用使用Spring session。

3.配置我们的Redis链接,我们这里使用的是Spring Boot作为基础进行配置,因此我们只需要在YML或者Properties配置文件添加Redis的配置即可。

4.创建请求的控制器来进行确定我们是否启用Session 共享。

5.将当前的工程拷贝一份.

通过上面请求显示的结果我们可以看出使用的是同一个Seesion,我们也可以查看下存在Redis中的Session。我这里使用RDM进行查看,我们还可以查看Session的属性。从图可以看出我们存进入的url属性。

我们从启动Spring Session的配置注解@EnableRedisHttpSession开始。

1.我们可以通过@EnableRedisHttpSession可以知道,Spring Session是通过RedisHttpSessionConfiguration类进行配置的。

2.我们在RedisHttpSessionConfiguration类种的注释可以知道,该类是用于创建一个过滤SessionRepositoryFilter。

3.探究下SessionRepositoryFilter类是在哪里创建\创建过程\作用。

(1)哪里创建:

通过搜索RedisHttpSessionConfiguration发现SessionRepositoryFilter的创建不是在RedisHttpSessionConfiguration,而是在父类SpringHttpSessionConfiguration中创建。

(2)SessionRepositoryFilter创建过程:

这里我们可以总结下:

Redis确保链接的情况下。

1.创建sessionRedisTemplate

2.创建RedisOperationsSessionRepository

3.创建SessionRepositoryFilter

(3)SessionRepositoryFilter的作用:

SessionRepositoryFilter的主要作用接管Seession的管理。我们可以从下面几个点知道为什么?

4.我们研究下SessionRepositoryRequestWrapper是怎样接管Session?

(1)存储Session的过程

当调用SessionRepositoryFilter.this.sessionRepository.save(session)完毕后,会判断当前的SessionId是否与请求的中的Cookie中SessionId一致,若不一致的情况下会调用onNewSession()方法,我们可以通过SpringHttpSessionConfiguration配置类的可以看到使用的是

CookieHttpSessionStrategy();

从CookieHttpSessionStrategy.onNewSession()方法可以看到是将SessionId写到Cookie中。

(2)获取Session的过程

我们根据源码的分析可以知道:

1.Spring Session 是通过SessionRepositoryFilter过滤器进行拦截,然后通过SessionRepositoryRequestWrapper继承HttpServletRequestWrapper进行管理Session。

2.Spring Session 为我们提供了3中存放的策略而每种策略提供对应的注解启动。分别为:

(1)NoSql形式的MongoDb:@EnableMongoHttpSession

(2)持久化形式的JDBC:@EnableJdbcHttpSession

(3)缓存形式的Redis:@EnableRedisHttpSession

3.Spring Session 共享Session过程:

(1)先过程过滤器存储将SessionID存放到本地的Cookie 和Redis中。

如果本地没有启用Cookie的情况下,Spring Session也就不能使用。

(2)获取Session的时候,先从请求中获取Session,Session不为空的情况下直接返回Session,若当前的Session为空的情况下,从Cookie中获取SessionId,判断SessionId不为空,再从Redis中获取Session,若从Redis中获取到的Session不为空将Session存放到请求中,再返回Session,如果从Redis中获取的Session为空,再创建新的Session并且添加到请求中,后返回Session。

Spring Boot如何整合Redis

Spring Boot是目前非常流行的Java Web开发框架,Redis是非关系型数据库的一种,以键值对的形式存储。Spring对Redis的支持是通过Spring Data Redis来实现的,给我燃桐宴们提供了RedisTemplate和StringRedisTemplate两种模板来操作数据。Spring Boot框架也提供了对Redis的支持轮陵,下面我们来讲一下Spring Boot框架整合Redis的步骤。

工具/材料

IntelliJ IDEA

01

Spring Boot整合Redis我们需要添加依赖的jar包,spring-boot-starter-data-redis中包含spring和redis相关的jar包,jedis作为redis的客户端也需要添加到工程中,Spring Boot的版本信息在父pom中已指定,子模块中的spring相关的jar包无需另外指皮银定。

dependency

groupIdorg.springframework.boot/groupId

artifactIdspring-boot-starter-data-redis/artifactId

/dependency

dependency

groupIdredis.clients/groupId

artifactIdjedis/artifactId

version3.0.0-m1/version

/dependency

02

Spring Boot会根据application.properties中的配置对Redis的属性进行自动配置,并注入到RedisProperties类中。在application.properties配置文件中这些属性都是以spring.redis为前缀的,值得注意的是在Spring Boot 1.5.x版本中默认的Redis客户端是jedis,因此在配置文件中无需指定,如下图所示。

03

Spring Boot 1.5.x版本的整合配置网上可以搜索大量的文章,然而Spring Boot 2.x版本的整合资料却非常少,甚至提供的配置不能正常使用,因此本文主要讲解Spring Boot 2.x整合Redis以及Redis的使用情况。spring-boot 2.x版本有jedis和lettuce两种客户端,因此我们必须要去指定使用哪一种客户端,两个客户端的配置如下图所示,本文使用的是Jedis客户端连接池,具体的配置如下。

# Redis数据库索引(默认为0)

spring.redis.database=0

# Redis服务器地址

spring.redis.host=127.0.0.1

# Redis服务器连接端口

spring.redis.port=6379

# Redis服务器连接密码(默认为空)

spring.redis.password=xylx1.t!@#

# 配置jedis连接池

# 连接池最大连接数(使用负值表示没有限制)

spring.redis.jedis.pool.max-active=8

# 连接池最大阻塞等待时间(使用负值表示没有限制)

spring.redis.jedis.pool.max-wait=-1ms

# 连接池中的最大空闲连接

spring.redis.jedis.pool.max-idle=8

# 连接池中的最小空闲连接

spring.redis.jedis.pool.min-idle=0

# 连接超时时间(毫秒)

spring.redis.timeout=5000ms

由配置我们可以看到spring-boot 2.x版本时间设置需要加单位ms,因为参数的类型为Duration。另外spring.redis.timeout尽量不要配置0,否则可能会出现io.lettuce.core.RedisCommandTimeoutException: Command timed out超时错误。

04

配置文件编辑完成后,我们开始编写代码实现Redis数据的存储和读取。我们创建一个RedisUtil工具类,该类使用@Component注解表示交由Spring管理,StringRedisTemplate是Spring提供的,可以使用@Autowired注解直接注入,接下来便可以书写存和取的代码了。

@Component

public class RedisUtil {

@Autowired

private StringRedisTemplate redisTemplate;

/**

* 存字符串

* @param key 缓存键

* @param value 缓存值

* @param expireTime 过期时间(s)

*/

public void setString(String key, String value, int expireTime){

ValueOperationsString, String ops = redisTemplate.opsForValue();

if (expireTime != 0) {

ops.set(key, value, expireTime, TimeUnit.SECONDS);

} else {

ops.set(key,value);

}

}

/**

* 取字符串

* @param key 缓存键

* @return 缓存值

*/

public String getString(String key){

ValueOperationsString, String ops = this.redisTemplate.opsForValue();

return ops.get(key);

}

05

接下来我们编写Controller层代码去调用RedisUtil工具类,实现数据的存储和读取,代码比较简单可以参考下图。若想验证Redis是否可用,还需要编写启动类,如下图所示。

06

由上图可看到我们编写了一个post请求用于存储字符串,get请求用于取出字符串。启动类通过main方法启动应用,接下来我们使用postman去模拟浏览器调用post和get请求,由下图可以看到Redis存储的数据成功被取出。

07

接下来我们介绍Jedis,这是一个封装了Redis的客户端,在Spring Boot整合Redis的基础上,可以提供更简单的API操作。因此我们需要配置JedisPool的Bean,代码如下,其中@Configuration注解表明这是一个配置类,我们在该类中注入RedisProperties,并且使用@Bean注解指定JedisPool。

@Configuration

public class RedisConfiguration {

@Autowired

private RedisProperties properties;

@Bean

public JedisPool getJedisPool(){

JedisPoolConfig config = new JedisPoolConfig();

config.setMaxIdle(properties.getJedis().getPool().getMaxIdle());

config.setMaxTotal(properties.getJedis().getPool().getMaxActive());

config.setMaxWaitMillis(properties.getJedis().getPool().getMaxWait().toMillis());

JedisPool pool = new JedisPool(config,properties.getHost(),

properties.getPort(),100,

properties.getPassword(), properties.getDatabase());

return pool;

}

}

08

接下来我们编辑JedisUtil工具类,通过SpringBoot容器的@Component注解来自动创建,并且注入JedisPool,使用jedisPool.getResource()方法来获取Jedis,并最终实现操作redis数据库,其代码如下。

@Component

public class JedisUtil {

@Autowired

JedisPool jedisPool;

//获取key的value值

public String get(String key) {

Jedis jedis = jedisPool.getResource();

String str = "";

try {

str = jedis.get(key);

} finally {

try {

jedis.close();

} catch (Exception e) {

e.printStackTrace();

}

}

return str;

}

public String set(String key, String value) {

Jedis jedis = jedisPool.getResource();

String str = "";

try {

str = jedis.set(key, value);

} finally {

try {

jedis.close();

} catch (Exception e) {

e.printStackTrace();

}

}

return str;

}

}

09

JedisUtil工具类编写完成后,我们修改之前的RedisController,并注入JedisUtil,代码如下图所示。然后再用postman分别调用post和get接口,我们可以看到成功取到了新的key的value值。

特别提示

在Spring Boot整合Redis前本机需安装Redis,另外可以使用RedisDesktopManager这个Redis这个桌面管理工具查看Redis中的数据。

关于springbootredis和springbootredis哨兵配置的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表