持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
一、Redis简介
Redis 是一个开源(BSD许可)的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs 7种数据类型的存储。
二、安装Redis
本篇文章的讲述的重点不在Redis本身,所以这里就采用了一种比较方便的安装方式——使用Docker安装Redis。这里安装的是当前最新版本的Redis。
# 安装
$ docker pull redis
# 运行
$ docker run -p 6379:6379 --name redis -v /Users/wanggc/Data/redis/data:/data -v /Users/wanggc/Data/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf
命令说明:
--name redis:指定容器的名称;-p 6379:6379:端口映射,前一个是主机端口号,后一个是Docker容器端口号;-v /Users/wanggc/Data/redis/data:/data:表示将主机的/Users/wanggc/Data/redis/data映射为Docker容器上的/data,这样/data中产生的数据就可以持久化到本地的目录下了;-v /Users/wanggc/Data/redis/conf/redis.conf:/etc/redis/redis.conf表示将本地;/Users/wanggc/Data/redis/conf/redis.conf映射为Docker容器上的/etc/redis/redis.conf,这样再配合指令末尾的redis redis-server /etc/redis/redis.conf实现让Docker容器运行时使用本地配置的Redis配置文件的功能了;redis redis-server /etc/redis/redis.conf表示运行redis服务器程序,并且指定运行时的配置文件;-d:表示后台启动Redis。
三、集成步骤
2.1 添加Redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot.version}</version>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.9.0</version>
</dependency>
默认的情况下,spring-boot-starter-data-redis 会依赖 Lettuce 客户端驱动,笔者这里选择使用的是 Jedis 客户端驱动。所以在代码中需要使用了元素将其依赖排除了,同时引入了 Jedis 的依赖。
2.2 添加配置
在application.properties文件中加入如下代码:
#配置Redis服务器属性
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
#Redis连接超时时间,单位毫秒
spring.redis.timeout=1000
#配置连接池属性
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=2000
这里我们配置了连接池和服务器的属性,用以连接Redis服务器。
2.3 编写Redis配置类
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
RedisSerializer jackson2JsonRedisSerializer = getJacksonSerializer();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson的序列化方式
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
/**
* redis的json序列化
*/
private RedisSerializer getJacksonSerializer() {
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
return new GenericJackson2JsonRedisSerializer(om);
}
}
2.4 使用RedisTemplate操作Redis数据类型
// 1. 注入RedisTemplate
@Resource
private RedisTemplate<String, User> redisTemplate;
// 2. 添加缓存
redisTemplate.opsForValue().set(redisKey, user);
// 3. 获取缓存数据
User user = redisTemplate.opsForValue().get(redisKey);