前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot 整合 Redis 原

SpringBoot 整合 Redis 原

作者头像
北漂的我
发布2019-05-29 11:42:59
6960
发布2019-05-29 11:42:59
举报
文章被收录于专栏:北漂的我

为什么80%的码农都做不了架构师?>>>

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

代码语言:javascript
复制
<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 相关配置

代码语言:javascript
复制
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

代码语言:javascript
复制
@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;
	}
}
代码语言:javascript
复制
@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() 方法之前执行

代码语言:javascript
复制
@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 的事务时, 要不都执行, 要不都不执行, 数据库事务是要不都成功, 要不都失败.

代码语言:javascript
复制
// 貌似 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() 方法用来批量执行语句, 性能高

代码语言:javascript
复制
@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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档