windows环境下Redis+Spring缓存实例

windows环境下Redis+Spring缓存实例,第1张

分别设置过期时间的时候,应该要用单独的key

你可以设置String pre="vid_" 这个前缀,

用直接用key去存, 并且用expire 分别设置时间,这样多张之间就不会冲突,并且有这个前缀,也不会和别的业务冲突,

ps: 我们公司都用 前缀 + 业务自身名字 + 后缀 这种模式的

springboot 集成redis ,使用原生的jedis ,有点繁琐,本身springboot 已经集成了 redis并有 redisTemplate 可以使用,不过还是多少有点坑,需要提前说明的

首先要引入jar包依赖

然后在 application 配置文件中 配置redis 的连接项

接着最简单的使用就是

或者

如果你配置环境对的话,redis 就可以使用了

springboot 在启动会自己初始化 RedisConnectionFactory redisConnectionFactory

这个对象,然后注入 ,并初始化化一个 RedisTemplate 对象,这样感觉无缝连接到redis了,但是吧,平时没问题,一旦时间久了就会出问题,就是redis 的序列化和反序列化问题,之前没有在log 里捕捉 这个反序列化的异常,后来捕捉到这个异常,

springboot在反序列话 redis,有点bug

如何破解 ,就是在初始化 RedisTemplate 这个bean 的时候就配置一下序列化和反序列化的属性,

声明一个 RedisService 公共类,并加 @Component 注解, 在这个里面初始化化 RedisTemplate,需要注意的是 就是你的key 对应的value存的是什么类型,如果是String

,就用new StringRedisSerializer(),如果是对象类 json ,就使用

new Jackson2JsonRedisSerializer(Objectclass);或者

new GenericJackson2JsonRedisSerializer()),不然这个还会报错,

然后我们在这个里面 声明 get set exist remove redis key 的 *** 作

最后使用 redis 的时候 ,直接注入 RedisService 就可以了

RedisService

另外 springboot 请求外部>

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

「大佬可以绕过 ~」

本节给大家讲讲 「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 中的使用,我们平时开发不可能是去命令行里敲的,都是代码里执行,而目前市面上有很多封装好的库,我们可以直接调用它的方法,很方便的就可以 *** 作它了,不用记一些繁琐的命令,下面我们就实际 *** 作一下:

修改 pomxml

修改 applicationyml :

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

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

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

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

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

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

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

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

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

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

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

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

spring-data-redis 中的核心 *** 作类是 RedisTemplate 可以看出 key 和 value 都是泛型的,这就涉及到将类型进行序列化的问题了 所就在 RedisTemplate 中还有几个 RedisSerializer~ 1)redisConnectionFactory()配置了如何连接Redsi服务器

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>

<groupId>orgspringframeworkboot</groupId>

<artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<dependency>

<groupId>redisclients</groupId>

<artifactId>jedis</artifactId>

<version>300-m1</version>

</dependency>

02

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

03

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

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

springredisdatabase=0

# Redis服务器地址

springredishost=127001

# Redis服务器连接端口

springredisport=6379

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

springredispassword=xylx1t!@#

# 配置jedis连接池

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

springredisjedispoolmax-active=8

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

springredisjedispoolmax-wait=-1ms

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

springredisjedispoolmax-idle=8

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

springredisjedispoolmin-idle=0

# 连接超时时间(毫秒)

springredistimeout=5000ms

由配置我们可以看到spring-boot 2x版本时间设置需要加单位ms,因为参数的类型为Duration。另外springredistimeout尽量不要配置0,否则可能会出现iolettucecoreRedisCommandTimeoutException: 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){

ValueOperations<String, String> ops = redisTemplateopsForValue();

if (expireTime != 0) {

opsset(key, value, expireTime, TimeUnitSECONDS);

} else {

opsset(key,value);

}

}

/

取字符串

@param key 缓存键

@return 缓存值

/

public String getString(String key){

ValueOperations<String, String> ops = thisredisTemplateopsForValue();

return opsget(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();

configsetMaxIdle(propertiesgetJedis()getPool()getMaxIdle());

configsetMaxTotal(propertiesgetJedis()getPool()getMaxActive());

configsetMaxWaitMillis(propertiesgetJedis()getPool()getMaxWait()toMillis());

JedisPool pool = new JedisPool(config,propertiesgetHost(),

propertiesgetPort(),100,

propertiesgetPassword(), propertiesgetDatabase());

return pool;

}

}

08

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

@Component

public class JedisUtil {

@Autowired

JedisPool jedisPool;

//获取key的value值

public String get(String key) {

Jedis jedis = jedisPoolgetResource();

String str = "";

try {

str = jedisget(key);

} finally {

try {

jedisclose();

} catch (Exception e) {

eprintStackTrace();

}

}

return str;

}

public String set(String key, String value) {

Jedis jedis = jedisPoolgetResource();

String str = "";

try {

str = jedisset(key, value);

} finally {

try {

jedisclose();

} catch (Exception e) {

eprintStackTrace();

}

}

return str;

}

}

09

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

特别提示

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

以上就是关于windows环境下Redis+Spring缓存实例全部的内容,包括:windows环境下Redis+Spring缓存实例、jedispoolconfig和redistemplate的区别、计算机编程后台java代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9466529.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存