这篇文章是小编学习spring boot整合redis的笔记。文章详细介绍了springboot如何整合redis,若没有安装redis的读者,可以参考这篇博客。
安装windows版redis教程
1. 重要概念 1. redis简介REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
2. Spring操作redis的原理 1. 两个操作对象spring提供了两个操作redis的对象,redisTemplate 和 stringRedisTemplate。它们类似JdbcTemplate,前者封装了操作redis的基本操作,后者封装了数据库的基本操作。
虽然它们二者都是操作redis的对象,但是它们有所区别。stringRedisTemplate是redisTemplate的子类,它的序列化类是StringRedisSerializer,而redisTemplate的序列化类是JdkSerializationRedisSerializer ,存入数据会将数据先序列化成字节数组然后在存入Redis数据库。
简单来说,主要区别是:
-
redisTemplate是spring操作redis的最高级对象,它可以操作任意类型的数据 (
-
stringRedisTemplate,专门操作字符串类型的数据 (String, String)。
补充:序列化能够使java的对象在传输和存储的过程中,能够成功的传输和读取。
2. 如何操作五种类型的数据上面redis的简介,提及redis可以储存五种数据类,redisTemplate针对五种类型的数据,封装五种不同类,来进行对应的操作。
redisTemplate.opsForValue() // 操作K-V类型数据 redisTemplate.opsForSet() // 操作set类型数据 redisTemplate.opsForHash() // 操作hash map类型数据 redisTemplate.opsForZSet() // 操作zset类型数据 redisTemplate.opsForList() // 操作list类型数据
在这里举一个操作list的例子。
关于五种类型相应的操作,我们可以通过菜鸟教程或redis中文网查询,这里就不做详细的说明。
2. 整合 1. 导入依赖2. 配置redisorg.springframework.boot spring-boot-starter-data-redis
spring:
redis:
database: 1
host: localhost
password: redis123456
port: 6379
jedis:
pool:
max-active: 8 #连接池最大连接数(使用负值表示没有限制)
max-wait: 1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 1 # 连接池中的最小空闲连接
3. 自定义redisTemplate
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
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;
}
}
4. redisUtil
封装redisTemplate常用的操作
@Component
public class RedisUtil {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
// ============================String=============================
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
// ================================Map=================================
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
public Map
【深入浅出SpringBoot】RedisTemplate使用方法归纳 - 简书
SpringBoot整合Redis及Redis工具类撰写 - zeng1994 - 博客园



