spring-boot-route(十二)整合redis做为缓存
redis简介
redis作为一种非关系型数据库,读写非常快,应用十分广泛,它采用key-value的形式存储数据,value常用的五大数据类型有string(字符串),list(链表),set(集合),zset(有序集合)和hash(哈希表)。
redis的特性决定了它的功能,它可以用来做以下这些事情!
- 排行榜,利用zset可以方便的实现排序功能
- 计数器,利用redis中原子性的自增操作,可以统计到阅读量,点赞量等功能
- 简单消息队列,list存储结构,满足先进先出的原则,可以使用lpush/rpop或rpush/lpop实现简单消息队列
- session共享,分布式系统中,可以利用redis实现session共享。spring官方提供的分布式解决方案Spring Session就是利用redis 实现的。
Spring Boot对redis也实现自动化装配,使用非常方便。
Spring Boot整合redis
1. 引入redis依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
2. 配置redis相关信息
spring:
redis:
# redis库
database: 0
# redis 服务器地址
host: localhost
# redis 端口号
port: 6379
# redis 密码
password:
# 连接超时时间(毫秒)
timeout: 1000
lettuce:
pool:
# 连接池最大链接数(负数表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(负数表示没有限制)
max-wait: -1
# 连接池最大空闲连接数
max-idle: 8
# 连接池最小空闲连接数
min-idle: 0
3. 操作redis
SpringBoot提供了两个bean来操作redis,分别是RedisTemplate 和 StringRedisTemplate,这两者的主要区别如下。
RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组然后在存入Redis数据库。
StringRedisTemplate使用的是StringRedisSerializer。
下面一起来看看效果:
@RestController
public class RedisDemo {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("redisTmeplateData")
public void redisTemplateData(){
redisTemplate.opsForValue().set("name","Java旅途");
}
@GetMapping("stringRedisTemplateData")
public void stringRedisTemplateData(){
stringRedisTemplate.opsForValue().set("desc","坚持分享java技术栈");
}
}
第一个方法存入的数据如下图:

第二个方法存入的数据如下图:

由于RedisTemplate是序列化成字节数组存储的,因此在redis客户端的可读性并不好。
自动缓存
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。
如果添加了@Cacheable注解,那么方法被调用后,值会被存入redis,下次再调用的时候会直接从redis中取值返回。
@GetMapping("getStudent")
@Cacheable(value = "student:key")
public Student getStudent(){
log.info("我不是缓存,我是new的对象!");
Student student = new Student("Java旅途",26);
return student;
}
记得要开启缓存,在启动类加上@EnableCaching注解
访问上面的方法,如果不打印日志,则是从缓存中获取的值。
封装redisUtils
RedisTemplate提供了很多方法来操作redis,但是找起来比较费事,为了更好的操作redis,一般会封装redisUtils来满足业务开发。这里简单封装几个做个示例,如果开发中有需求可以自己封装。
public class RedisUtils {
@Autowired
private RedisTemplate redisTemplate;
/**
* 普通存入
* @param key
* @param value
* @return
*/
public boolean set(String key,Object value){
try {
redisTemplate.opsForValue().set(key,value);
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
/**
* 普通获取key
* @param key
* @return
*/
public Object get(String key){
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 存入key,设置过期时长
* @param key
* @param value
* @param time
* @return
*/
public boolean set(String key,Object value,long time){
try {
if(time > 0){
redisTemplate.opsForValue().set(key,value,time, TimeUnit.SECONDS);
}else{
redisTemplate.opsForValue().set(key,value);
}
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
/**
* 判断key是否存在
* @param key
* @return
*/
public boolean exists(String key){
try {
return redisTemplate.hasKey(key);
}catch (Exception e){
e.printStackTrace();
return false;
}
}
/**
* 删除key
* @param key
*/
public void del(String key){
try {
if(key != null && key.length() > 0){
redisTemplate.delete(key);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
此是spring-boot-route系列的第十二篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同学有一个系统的认识。本文已收录至我的github,欢迎各位小伙伴star!
github:https://github.com/binzh303/spring-boot-route
点关注、不迷路
如果觉得文章不错,欢迎关注、点赞、收藏,你们的支持是我创作的动力,感谢大家。
如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。
如果你还想更加深入的了解我,可以微信搜索「Java旅途」进行关注。回复「1024」即可获得学习视频及精美电子书。每天7:30准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!
spring-boot-route(十二)整合redis做为缓存的更多相关文章
- spring boot / cloud (十二) 异常统一处理进阶
spring boot / cloud (十二) 异常统一处理进阶 前言 在spring boot / cloud (二) 规范响应格式以及统一异常处理这篇博客中已经提到了使用@ExceptionHa ...
- spring boot(三)整合 redis
Spring boot 集成redis 为什么要用redis,它解决了什么问题? Redis 是一个高性能的key-value内存数据库.它支持常用的5种数据结构:String字符串.Hash哈希表. ...
- Spring Boot(十二)单元测试JUnit
一.介绍 JUnit是一款优秀的开源Java单元测试框架,也是目前使用率最高最流行的测试框架,开发工具Eclipse和IDEA对JUnit都有很好的支持,JUnit主要用于白盒测试和回归测试. 白盒测 ...
- spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战
SpringBoot + Redis +SpringSession 缓存之实战 前言 前几天,从师兄那儿了解到EhCache是进程内的缓存框架,虽然它已经提供了集群环境下的缓存同步策略,这种同步仍然需 ...
- Spring Boot (十二): Spring Boot 邮件服务
最早我们发邮件的时候是使用 JavaMail 来发送邮件,而在 Spring Boot 中, Spring Boot 帮我们将 JavaMail 封装好了,是可以直接拿来使用的. 1. 依赖文件 po ...
- Spring Boot(十二):LocalDateTime格式化处理
Java 8之后,日期类的处理建议使用java.time包中对应的LocalDateTime, LocalDate, LocalTime类.(参考Java8新特性) 在Spring Boot中(验证版 ...
- SSM+redis整合(mybatis整合redis做二级缓存)
SSM:是Spring+Struts+Mybatis ,另外还使用了PageHelper 前言: 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷 ...
- Spring Boot 知识笔记(整合Redis)
一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- spring boot 学习(十二)拦截器实现IP黑名单
拦截器实现IP黑名单 前言 最近一直在搞 Hexo+GithubPage 搭建个人博客,所以没怎么进行 SpringBoot 的学习.所以今天就将上次的”?秒防刷新”进行了一番修改.上次是采用注解加拦 ...
随机推荐
- 故障:fork failed:Resource Temporarily Unavailable解决方案
故障:fork failed:Resource Temporarily Unavailable解决方案 AIX在一次crontab bkapp.txt导入N多定时任务时候,该用户无法执行任何命令,再s ...
- 用 Spring Boot 和 MybatisPlus 快速构建项目
自动生成 public class MPGenerator { public static void main(String[] args) { AutoGenerator autoGenerator ...
- HTTPS建立过程
由于HTTPS建立过程经常忘记,固记录 HTTPS建立流程 客户端发起SSL连接 服务端发送证书(证书中包含了服务端公钥) 客户端根据已有证书判断是否是可信任的(客户端决定是否继续) 服务端要求客户端 ...
- SpringBean容器启动流程+Bean的生命周期【附源码】
如果对SpringIoc与Aop的源码感兴趣,可以访问参考:https://javadoop.com/,十分详细. 目录 Spring容器的启动全流程 Spring容器关闭流程 Bean 的生命周期 ...
- 使用jackson解析json串得到树模型,然后遍历树模型获得需要的数据
Problem:从网址 http://quotes.money.163.com/hs/service/marketradar_ajax.php?host=http%3A%2F%2Fquotes.mon ...
- 解决Maven下载速度缓慢问题
解决Maven下载速度缓慢问题 第一步:找到自己安装maven的路径,选择setting.xml D:\apache-maven-3.2.2\conf\settings.xml 第二步:打开setti ...
- 20190917-01VI/VIM编辑器 000 002
VI是Unix 操作系统和类Unix操作系统中最通用的文本编辑器. VIM编辑器是从VI发展出来的一个性能更强大的文本编辑器.可以主动的以字体颜色便被语法的正确性,方便程序设计.VIM与VI编辑器完全 ...
- Python 面试题 字符串 删除多少个字符使得出现做多的字符数量大于等于字符串长度的一半.
str1 = input() num = {} for i in set(str1): num[i]=str1.count(i) max_value = max(num.values()) n=abs ...
- canvas绘制图片drawImage学习
不得不说,html5中的canvas真的非常强大,从图片处理,到视频处理,再到游戏开发,都能见到canvas的身影,然而,就这一个<canvas>标签,功能居然如此强大,这主要归功于can ...
- 面向对象--有参数的__init__方法
有参数的__init__()方法 class Hero(object): """定义了一个英雄类,可以移动和攻击""" def __init ...