Spring Boot 中集成Redis

本文介绍了Redis的NoSQL特性,安装步骤,以及如何在SpringBoot中集成Redis,涉及常用API如String、Hash和List类型操作。重点展示了如何使用StringRedisTemplate进行数据存储和读取,以及如何处理不同类型的数据结构。

一、Redis 介绍

Redis 是一种非关系型数据库(NoSQL),NoSQL 是以 key-value 的形式存储的,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说 SQL 标准,ACID 属性,表结构等等,这类数据库主要有以下特点:非关系型的、分布式的、开源的、水平可扩展的。NoSQL 使用场景有:对数据高并发读写、对海量数据的高效率存储和访问、对数据的高可扩展性和高可用性等等。

Redis 的 key 可以是字符串、哈希、链表、集合和有序集合。
Redis 的value 类型很多,包括 String、list、set、zset。
这些数据类型都支持 push/pop、add/remove、取交集和并集以及更多更丰富的操作,Redis 也支持各种不同方式的排序。为了保证效率,数据都是在缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件中。 有了 redis 有哪些好处呢?举个比较简单的例子,看下图:
在这里插入图片描述
Redis 集群和 Mysql 是同步的,首先会从 redis 中获取数据,如果 redis 挂了,再从 mysql 中获取数
据,这样网站就不会挂掉。更多关于 redis 的介绍以及使用场景,可以谷歌和百度,在这就不赘述了。

二、Redis 安装

只要能 ping 的通云主机或者虚拟机的 ip,然后在虚拟机或者云主机中放行对应的端口(或者关掉防火墙)即可访问 redis。下面来介绍一下 redis 的安装过程:

安装 gcc 编译
下载 redis
解压安装
修改配置文件

三、Spring Boot 集成 Redis

3.1 依赖导入

Spring Boot 集成 redis 很方便,只需要导入一个 redis 的 starter 依赖即可。如下:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--阿里巴巴fastjson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.35</version>
</dependency>

这里也导入阿里巴巴的 fastjson 是为了在后面我们要存一个实体,为了方便把实体转换成 json 字符串存进去。

3.2 Redis 配置

导入了依赖之后,我们在 application.yml 文件里配置 redis:

server:
	port: 8080
spring:
	#redis相关配置
	redis:
	database: 5
	# 配置redis的主机地址,需要修改成自己的
	host: 192.168.48.190
	port: 6379
	password: 123456
	timeout: 5000
	jedis:
		pool:
		# 连接池中的最大空闲连接,默认值也是8。
		max-idle: 500
		# 连接池中的最小空闲连接,默认值也是0。
		min-idle: 50
		# 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
		max-active: 1000
		# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
		max-wait: 2000

3.3 常用 api 介绍

Spring Boot 对 redis 的支持已经非常完善了,丰富的 api 已经足够我们日常的开发,这里我介绍几个
最常用的供大家学习,其他 api 希望大家自己多学习,多研究。用到会去查即可。

有两个 redis 模板:RedisTemplate 和 StringRedisTemplate。
我们不使用 RedisTemplate,RedisTemplate 提供给我们操作对象,操作对象的时候,我们通常是以 json 格式存储,但在存储的时候,会使用 Redis 默认的内部序列化器;导致我们存进里面的是乱码之类的东西。当然了,我们可以自己定义序列化,但是比较麻烦,所以使用 StringRedisTemplate 模板。StringRedisTemplate 主要给我们提供字符串操作,我们可以将实体类等转成 json 字符串即可,在取出来后,也可以转成相应的对象,这就是上面我导入了阿里 fastjson 的原因。

3.3.1 redis:string 类型

新建一个 RedisService,注入 StringRedisTemplate,使用 stringRedisTemplate.opsForValue()
可以获取 ValueOperations<String, String> 对象,通过该对象即可读写 redis 数据库了。如下:

public class RedisService {
	@Resource
	private StringRedisTemplate stringRedisTemplate;
	/**
	* set redis: string类型
	* @param key key
	* @param value value
	*/
	public void setString(String key, String value){
		ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
		valueOperations.set(key, value);
	}
	/**
	* get redis: string类型
	* @param key key
	* @return
	*/
	public String getString(String key){
		return stringRedisTemplate.opsForValue().get(key);
	}
}

该对象操作的是 string,我们也可以存实体类,只需要将实体类转换成 json 字符串即可。下面来测试一下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class Course14ApplicationTests {
	private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);
	@Resource
	private RedisService redisService;
	@Test
	public void contextLoads() {
		//测试redis的string类型
		redisService.setString("weichat","GSCY");
		logger.info("我的昵称为:{}", redisService.getString("weichat"));
		// 如果是个实体,我们可以使用json工具转成json字符串,
		User user = new User("优快云", "123456");
		redisService.setString("userInfo", JSON.toJSONString(user));
		logger.info("用户信息:{}", redisService.getString("userInfo"));
	}
}

先启动 redis,然后运行这个测试用例,观察控制台打印的日志如下:

我的昵称为:GSCY
用户信息:{"password":"123456","username":"优快云"}

3.3.2 redis:hash 类型

hash 类型其实原理和 string 一样的,但是有两个 key,使用 stringRedisTemplate.opsForHash()可以获取 HashOperations<String, Object, Object> 对象。比如我们要存储订单信息,所有订单信息都放在 order 下,针对不同用户的订单实体,可以通过用户的 id 来区分,这就相当于两个 key了。

@Service
public class RedisService {
	@Resource
	private StringRedisTemplate stringRedisTemplate;
	/**
	* set redis: hash类型
	* @param key key
	* @param filedKey filedkey
	* @param value value
	*/
	public void setHash(String key, String filedKey, String value){
		HashOperations<String, Object, Object> hashOperations =stringRedisTemplate.opsForHash();
		hashOperations.put(key,filedKey, value);
	}
	/**
	* get redis: hash类型
	* @param key key
	* @param filedkey filedkey
	* @return
	*/
	public String getHash(String key, String filedkey){
		return (String) stringRedisTemplate.opsForHash().get(key, filedkey);
	}
}

可以看出,hash 和 string 没啥两样,只不过多了个参数,Spring Boot 中操作 redis 非常简单方便。来测试一下:

@SpringBootTest
public class Course14ApplicationTests {
	private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);
	@Resource
	private RedisService redisService;
	@Test
	public void contextLoads() {
		//测试redis的hash类型
		redisService.setHash("user", "name", JSON.toJSONString(user));
		logger.info("用户姓名:{}", redisService.getHash("user","name"));
	}
}

3.3.3 redis:list 类型

使用 stringRedisTemplate.opsForList() 可以获取 ListOperations<String, String> listOperations redis 列表对象,该列表是个简单的字符串列表,可以支持从左侧添加,也可以支持从右侧添加,一个列表最多包含 2 ^ 32 -1 个元素。

@Service
public class RedisService {
	@Resource
	private StringRedisTemplate stringRedisTemplate;
	/**
	* set redis:list类型
	* @param key key
	* @param value value
	* @return
	*/
	public long setList(String key, String value){
		ListOperations<String, String> listOperations = stringRedisTemplate.opsForList();
		return listOperations.leftPush(key, value);
	}
	/**
	* get redis:list类型
	* @param key key
	* @param start start
	* @param end end
	* @return
	*/
	public List<String> getList(String key, long start, long end){
		return stringRedisTemplate.opsForList().range(key, start, end);
	}
}

可以看出,这些 api 都是一样的形式,方便记忆也方便使用。具体的 api 细节我就不展开了,大家可以自己看 api 文档。其实,这些 api 根据参数和返回值也能知道它们是做什么用的。来测试一下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class Course14ApplicationTests {
	private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);
	@Resource
	private RedisService redisService;
	@Test
	public void contextLoads() {
		//测试redis的list类型
		redisService.setList("list", "football");
		redisService.setList("list", "basketball");
		List<String> valList = redisService.getList("list",0,-1);
		for(String value :valList){
			logger.info("list中有:{}", value);
		}
	}
}

总结

本节主要介绍了 redis 的使用场景、安装过程,以及 Spring Boot 中集成 redis 的详细步骤。在实际项目中,通常都用 redis 作为缓存,在查询数据库的时候,会先从 redis 中查找,如果有信息,则从 redis中取;如果没有,则从数据库中查,并且同步到 redis 中,下次 redis 中就有了。更新和删除也是如此,都需要同步到 redis。redis 在高并发场景下运用的很多。

### 回答1: Spring Boot集成Redis可以通过以下步骤实现: 1. 添加Redis依赖:在Spring Boot项目的pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis连接信息:在application.properties文件中添加以下配置信息: ``` spring.redis.host=redis服务器IP spring.redis.port=redis服务器端口号 spring.redis.password=redis密码 ``` 3. 创建RedisTemplate:在Java代码中创建RedisTemplate对象,并注入到需要使用Redis的类中。 ``` @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); redisTemplate.afterPropertiesSet(); return redisTemplate; } } ``` 4. 使用RedisTemplate操作Redis:通过RedisTemplate对象的方法,可以进行各种Redis操作,如set、get、delete等。 以上是Spring Boot集成Redis的基本步骤,具体实现还需根据具体需求进行配置和调整。 ### 回答2: Spring Boot是一个基于Spring框架的快速开发框架,它提供了简化的配置和开箱即用的功能,使得我们可以快速构建和部署应用程序。而Redis是一个高性能的键值对存储数据库,它常被用于缓存和数据存储。 在Spring Boot集成Redis,首先需要引入相关的依赖。可以通过Maven或Gradle来引入spring-boot-starter-data-redis依赖,该依赖会自动引入Redis相关的配置和依赖库。 然后,在配置文件中添加Redis的连接信息。在application.properties或application.yml中,可以配置Redis的主机地址、端口号、密码等信息。 接下来,在需要使用Redis的地方,可以使用@Autowired注解来注入RedisTemplate对象。RedisTemplate是Spring提供的操作Redis的模板类,它封装了常用的操作方法。 使用RedisTemplate,可以通过调用其对应的方法来操作Redis数据库,比如设置键值对、获取键值对、设置过期时间等。 除了RedisTemplate,Spring Boot还提供了RedisCacheManager类用于缓存管理,它可以通过注解@Configuration和@EnableCaching来启用缓存功能。在需要缓存的方法上使用@Cacheable注解,就可以将方法的返回值缓存到Redis中,下次调用时可以直接从缓存中获取,提高了性能。 总的来说,集成RedisSpring Boot中,只需要引入依赖、配置连接信息,然后通过RedisTemplate操作Redis数据库,或使用RedisCacheManager进行数据缓存管理就可以了。这样可以简化我们与Redis的交互,提高开发效率和应用性能。 ### 回答3: 在Spring Boot中,集成Redis可以通过以下步骤实现: 1. 在pom.xml文件中添加Redis的依赖库: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 在application.properties或application.yaml文件中配置Redis连接信息: ```properties spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= ``` 3. 创建一个Redis配置类,用于配置Redis连接工厂: ```java @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean @Override public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { // 生成缓存的key,可以根据实际需求定制 return ""; } }; } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); // 设置value的序列化方式 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // 设置key的序列化方式 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } } ``` 4. 在需要使用Redis的类中,通过注入RedisTemplate来操作Redis: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void cacheData(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object getData(String key) { return redisTemplate.opsForValue().get(key); } ``` 通过以上步骤,我们就成功在Spring Boot集成Redis,可以方便地使用Redis进行缓存、存储和读取数据。在配置Redis时,我们需要根据实际情况修改host、port和password等配置项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值