SpringBoot中redis的使用介绍
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis是目前行业使用最广泛的内存数据存储。比memcached更受欢迎,Redis支持更丰富的数据结构,同时支持数据持久化。
除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。
redis在SpringBoot2.0版本后如何使用
第一步:引入spring-boot-starter-data-redis依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
第二步:编写配置文件application.yml(当然,也可以通过profile机制指向不同的环境配置文件)
spring:
# profiles:
# active: dev
redis:
database: 0
host: www.weiyi.com
password: null
max-active: 8
max-idle: 500
max-wait: 1
min-idle: 0
port: 6379
timeout: 5000ms
第三步:添加redis的Java配置类
package ooh.chaos.configuration; import ooh.chaos.configuration.FastJsonRedisSerializer;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.session.SessionRepository;
import org.springframework.session.data.redis.RedisOperationsSessionRepository; /**
* redis 配置
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport { @Bean
@Override
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
} /**
* 设置 redisTemplate 序列化方式
*
* @param factory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(factory);
// 设置值(value)的序列化采用FastJsonRedisSerializer。
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
redisTemplate.setValueSerializer(fastJsonRedisSerializer);
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setDefaultSerializer(fastJsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
} /**
* 设置spring session redis 序列化方式
*
* @param factory
* @return
*/
@Bean
public SessionRepository sessionRepository(RedisConnectionFactory factory) {
RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository(
redisTemplate(factory));
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
sessionRepository.setDefaultSerializer(fastJsonRedisSerializer);
sessionRepository.setDefaultMaxInactiveInterval(36000);
return sessionRepository;
} }
最后一步:在SpringBoot项目中使用redis
1.引入redis操作bean
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
2.使用redisTemplate操作redis,手动使用方式
// 增加token逻辑,Created by xiaoshiyilang on 2018/10/19
String md5Key = DigestUtils.md5Hex(Constants.TOKEN_KEY_PRE + user.getUid());
if (redisTemplate.opsForValue().get(md5Key) != null) {
redisTemplate.delete(md5Key);
}
String md5Token = DigestUtils.md5Hex(generalToken() + user.getUid());
if (redisTemplate.opsForValue().get(md5Token) != null) {
redisTemplate.delete(md5Token);
}
// 返回给前端的Token
redisTemplate.opsForValue().set(md5Key, md5Token);
// 设置Token过期时间
redisTemplate.expire(md5Key, 86400 * 30, TimeUnit.SECONDS);
// 记录成功的用户id
redisTemplate.opsForValue().set(md5Token, user.getUid());
// 设置登录用户过期时间
redisTemplate.expire(md5Token, 86400 * 30, TimeUnit.SECONDS);
另一种使用方式:自动根据方法生成缓存
@Cacheable(value = "user-key")
public User getUser(Long id) {
User user = userService.selectByPrimaryKey(id);
System.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功");
return user;
}
其中value的值就是缓存到redis中的key。
SpringBoot下使用Redis实现session共享
分布式系统中,session会面临需要在多个项目中共享的问题,包括集群,负载均衡也是需要session共享的,有很多的解决方案,其中托管到redis这样的缓存中是最常用的方案之一,小Alan在这里也和大家聊一聊
第一步:引入spring-session-data-redis依赖包
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
第二步:添加session的Java配置类
package com.only.tech.user.configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; /**
* session配置,30分钟过期
*/
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60 * 30)
public class SessionConfig { }
maxInactiveIntervalInSeconds: 设置Session失效时间,使用Redis Session之后,原Boot的server.session.timeout属性不再生效。
最后一步:测试session是否生效
添加测试方法获取sessionid
@RequestMapping("/uid")
String uid(HttpSession session) {
UUID uid = (UUID) session.getAttribute("uid");
if (uid == null) {
uid = UUID.randomUUID();
}
session.setAttribute("uid", uid);
return session.getId();
}
登录redis客户端查看是否保存sessionid相关的值

访问浏览器执行多个请求如果是同一个sessionid就说明session已经在redis中进行有效的管理了。
如何在两个项目或者多个项目中共享session(或者多台机器)
按照上面的步骤在另一个项目中再次配置一次session,启动项目后自动就进行了session的共享机制。
注意:我在redis的Java配置类中设置了spring session redis 的序列化方式,因为我这里没有使用SpringBoot默认的json序列化方式,而是使用了阿里的fastjson。
结束语:这城市总是风很大,孤独的人晚回家,外面不像你想的那么好,风雨都要直接挡。愿每个独自走夜路的你,都足够坚强。
佛系博主:AlanLee
博客地址:http://www.cnblogs.com/AlanLee
GitHub地址:https://github.com/AlanLee-Java
本文出自博客园,欢迎大家加入博客园。
SpringBoot中redis的使用介绍的更多相关文章
- SpringBoot中Redis的set、map、list、value、实体类等基本操作介绍
今天给大家介绍一下SpringBoot中Redis的set.map.list.value等基本操作的具体使用方法 上一节中给大家介绍了如何在SpringBoot中搭建Redis缓存数据库,这一节就针对 ...
- springboot中redis取缓存类型转换异常
异常如下: [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested ...
- ③SpringBoot中Redis的使用
本文基于前面的springBoot系列文章进行学习,主要介绍redis的使用. SpringBoot对常用的数据库支持外,对NoSQL 数据库也进行了封装自动化. redis介绍 Redis是目前业界 ...
- SpringBoot中Redis的使用
转载:http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html Spring Boot 对常用的数据库支持外,对 No ...
- 1.2_springboot2.x中redis缓存&原理介绍
1.整合redis作为缓存 说明这里springboot版本2.19 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构 ...
- springboot中redis的缓存穿透问题
什么是缓存穿透问题?? 我们使用redis是为了减少数据库的压力,让尽量多的请求去承压能力比较大的redis,而不是数据库.但是高并发条件下,可能会在redis还没有缓存的时候,大量的请求同时进入,导 ...
- springBoot 中redis 注解缓存的使用
1,首先在启动类上加上 @EnableCaching 这个注解 在查询类的controller,或service ,dao 中方法上加 @Cacheable 更新或修改方法上加 @CachePut 注 ...
- springboot中redis做缓存时的配置
import com.google.common.collect.ImmutableMap;import org.slf4j.Logger;import org.slf4j.LoggerFactory ...
- springboot中Redis的Lettuce客户端和jedis客户端
1.引入客户端依赖 <!--jedis客户端依赖--> <dependency> <groupId>redis.clients</groupId> &l ...
随机推荐
- centos 7 安装 mysql 5.7
1.环境 Centos 7 2.下载 官方网站https://dev.mysql.com/downloads/mysql/5.7.html#downloads ,选择要下载的版本,centos 7 同 ...
- win10 关闭屏幕自动亮度
每次切换到vsCode,再切换回桌面,屏幕总是忽暗忽亮,这谁设计的,脑残至极! 百度了好久,终于找到解决办法: 控制面板→英特尔®核芯显卡→电源→使用电池→显示器节能技术→禁用→应用 如果你按上述步骤 ...
- 只用一招,让你Maven依赖下载速度快如闪电
一.背景 众所周知,Maven对于依赖的管理让我们程序员感觉爽的不要不要的,但是由于这货是国外出的,所以在我们从中央仓库下载依赖的时候,速度如蜗牛一般,让人不能忍,并且这也是大多数程序员都会遇到的问题 ...
- asp.net调用js方法
C#前台js调用后台代码 前台js <script type="text/javascript" language="javascript"> fu ...
- [Python 从入门到放弃] 1. 列表的基本操作
''' 列表 Create By 阅后即焚 On 2018.1.29 ''' 1. 列表的定义 列表看起来好像其它编程语言中的数组,但列表具备更加强大的功能,它是Python完备的集合对象,现在,你可 ...
- 浅尝Vue.js组件(一)
本篇目录: 组件名 组件注册 全局注册 基础组件的自动化全局注册 局部注册 在模块系统中局部注册 Prop 单向数据流 Prop验证 类型检查 非Prop特性 替换/合并已有的特性 禁用特性继承 自定 ...
- 软件架构设计学习总结(1):标准Web系统的架构分层
1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层的技术都需要使用.例如:一 ...
- 线程池ThreadPoolExecutor的一种扩展办法
概述 在JAVA的世界里,如果想并行的执行一些任务,可以使用ThreadPoolExecutor. 大部分情况下直接使用ThreadPoolExecutor就可以满足要求了,但是在某些场景下,比如瞬时 ...
- .4-浅析webpack源码之convert-argv模块
上一节看了一眼预编译的总体代码,这一节分析convert-argv模块. 这个模块主要是对命令参数的解析,也是yargs框架的核心用处. 生成默认配置文件名数组 module.exports = fu ...
- 反射实现Model修改前后的内容对比
在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 public class User { priv ...