文档章节

SpringBoot 整合 Redis

北漂的我
 北漂的我
发布于 01/22 20:41
字数 707
阅读 14
收藏 6

1. pom.xml 文件中添加 Redis 依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
	<exclusions>
		<exclusion>
			<groupId>io.lettuce</groupId>
			<artifactId>lettuce-core</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
</dependency>

2. application.properties 文件中添加 Redis 相关配置

spring.redis.host=10.112.77.2
spring.redis.port=6379
spring.redis.database=0
spring.redis.password=
spring.redis.timeout=1s

spring.redis.jedis.pool.min-idle=5
spring.redis.jedis.pool.max-active=10
spring.redis.jedis.pool.max-idle=10
spring.redis.jedis.pool.max-wait=2s

3. 在代码相关位置使用 @Resource 注入 RedisTemplate 或者 @Autowired 注入 StringRedisTemplate

@Controller
@RequestMapping("/user")
public class UserController {
	@Resource
	private RedisTemplate<String, String> redisTemplate;
	@Autowired
	private StringRedisTemplate stringRedisTemplate;
	
	@RequestMapping("/testRedis")
	@ResponseBody
	public Integer testRedis() {
		stringRedisTemplate.opsForValue().set("str1", "str11");
		stringRedisTemplate.opsForList().leftPush("list1", "list11");
		stringRedisTemplate.opsForHash().put("map1", "key1", "value1");
		stringRedisTemplate.opsForSet().add("set1", "set11", "set22");
		stringRedisTemplate.opsForZSet().add("zset1", "zset11", 1.0);
		Set<String> set = stringRedisTemplate.opsForSet().members("set1");
		Object value = stringRedisTemplate.opsForHash().get("map1", "key1");
		return 1;
	}
}
@RequestMapping("/testRedis2")
@ResponseBody
public Integer testRedis2() {
    // 使用boundSetOps进行对应key的频繁操作
	BoundSetOperations<String, String> boundSetOperations = stringRedisTemplate.boundSetOps("set1");
	boundSetOperations.add("set33", "set44", "set55");
	return 1;
}

4. 在 SpringBoot 主类中设置 redis 序列化方式

@PostConstruct 注解修饰非静态的 void 方法, 在 servlet 的构造方法之后 init() 方法之前执行

@PreDestory 注解修饰的非静态的 void 方法, 会在 servlet 的 destory() 方法之前执行 

@PostConstruct
public void initRedisTemplate() {
	RedisSerializer<String> stringSerializer = redisTemplate.getStringSerializer();
	redisTemplate.setKeySerializer(stringSerializer);
	redisTemplate.setStringSerializer(stringSerializer);
	redisTemplate.setHashKeySerializer(stringSerializer);
}

5. 使用 SessionCallback 和 RedisCallback 接口

通过使用这两个接口让 RedisTemplate 回调, 可以在同一条连接下执行多条 Redis 命令, 避免 RedisTemplate 多次获取不同的连接

SessionCallback 是封装良好, 对开发者友好, 实际的开发中尽量选择使用它

RedisCallback 接口比较底层, 需要处理的比较多, 可读性差, 实际开发中尽量不使用它

6. Redis 的事务

watch......multi......exec 是 Redis 的事务流程

watch 监控 redis 的一些键值是否发生变化, multi 开始事务, 开启事务后, 不会马上执行命令, 而是存放在一个队列里, exec 命令是执行事务, 如果 watch 监控的键值发生变化(哪怕新值和原值一样, 也是发生变化), 就取消事务的执行, 如果键值没有发生变化, 就执行事务. 执行事务的时候, 如果执行某条命令报错, 也只能是报错, 后面的命令会正常执行, 这是和数据库事务不一样的地方, 所以 redis 的事务时, 要不都执行, 要不都不执行, 数据库事务是要不都成功, 要不都失败.

// 貌似 executePipelined() 流水线方法是不能用来执行事务的.
stringRedisTemplate.execute(new SessionCallback<Object>() {
	@SuppressWarnings({"unchecked", "rawtypes" })
	@Override
	public Object execute(RedisOperations operations) throws DataAccessException {
		operations.watch("str1");
		operations.multi();
		operations.opsForValue().set("str2", "str2");
		operations.opsForValue().set("str3", "str3");
		operations.exec();
		return null;
	}
});

7. Redis 的流水线

executePipelined() 方法用来批量执行语句, 性能高

@RequestMapping("/testRedis5")
@ResponseBody
public Integer testRedis5() {
	long start = System.currentTimeMillis();
	stringRedisTemplate.executePipelined(new SessionCallback<Object>() {
		@SuppressWarnings({ "rawtypes", "unchecked" })
		@Override
		public Object execute(RedisOperations operations) throws DataAccessException {
			for (int i = 0; i < 100000; i++) {
				operations.opsForValue().set("str_" + i, "value_"+i);
				String value = (String) operations.opsForValue().get("strr" + i);
				if (i == 900) {
					System.out.println("值为 " + value);
				}
			}
			return null;
		}
	});
	System.out.println("time: " + (System.currentTimeMillis() - start));
	return 1;
}

 

© 著作权归作者所有

共有 人打赏支持
北漂的我

北漂的我

粉丝 11
博文 81
码字总数 17632
作品 0
昌平
程序员
私信 提问
SpringBoot 学习二:操作数据库

本文将从以下几个方面介绍: 前言 配置数据源 SpringBoot 整合 Mybatis SpringBoot 整合 JdbcTemplate SpringBoot 整合 Redis 前言 在上篇文章 SpringBoot 学习一 中已经学习了 SpringBoot的...

tsmyk0715
2018/09/26
0
0
SpringBoot整合Redis、ApacheSolr和SpringSession

一、简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐。它提供了各种starter简化很多繁琐的配置。SpringBoot整合Druid、Mybatis已经司空见惯,在这里就不详细介绍了。今天...

小忽悠
2018/07/19
0
0
Spring Boot学习笔记

多模块开发 [SpringBoot学习]-IDEA创建Gradle多Module结构的SpringBoot项目 RabbitMQ RabbitMQ 安装 linux安装RabbitMQ详细教程 Ubuntu 16.04 RabbitMq 安装与运行(安装篇) ubantu安装...

OSC_fly
2018/07/26
0
0
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
springboot从入门到精通教程分享, 深度掌握Springboot实践技术教程

深度掌握Springboot实践技术教程,共22个课时,需要的可回复邮箱。 课程简介 day1 01springboot简介-曾经开发中的问题 02springboot解决的问题-优势以及弊端 03springboot环境准备 04spring...

小小倾听
2018/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

4.57 MariaDB慢查询日志 4.58 Tomcat_JDK部署 4.59 zrlog安装 4.60 Nginx代理Tomcat

4.57 MariaDB慢查询日志 为什么要配置慢查询日志? 目的是为了帮助我们分析MariaDB的瓶颈点。 如何配置? 1)进入MariaDB里面执行:show variables like 'slow%';show variables li...

Champin
今天
3
0
自动机器学习简述(AutoML)

为什么需要自动机器学习 对于机器学习的新用户而言,使用机器学习算法的一个主要的障碍就是算法的性能受许多的设计决策影响。随着深度学习的流行,工程师需要选择相应的神经网络架构,训练过...

naughty
今天
2
0
Android Studio Unable to resolve dependency for错误的排查

记录一次Android Studio Unable to resolve dependency for错误的排查 Android Studio 3.2.1 错误提示 Unable to resolve dependency for... 原因:在gradle中设置的代理并没有gradle 4.6的版......

Gemini-Lin
今天
0
0
java常用设计模式

设计模式; 一个程序员对设计模式的理解: “不懂”为什么要把很简单的东西搞得那么复杂。后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“...

呵呵哒灬
今天
5
0
Kafka入门

1、Kafka使用背景 在我们大量使用分布式数据库、分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我想对用户的搜索关键词...

watermelon11
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部