redis数据类型指的啥
redis自身是一个map,其中所有的数据嗾使采用key:value的形式存储。
key永远都是字符串,数据类型(字符串,hash,set,list)永远指的是右边value

redis最终存储的都只是基本数据类型,字符串,整数,浮点数,布尔值,字符等,而无法直接存储对象,但是我们可以通过序列化手段把对象变成字符串,这样就可以存储在redis中了,但是jedis只支持字符串和字节数组,而字符串最终也会转换成字节数组写到redis中(字节流传输)。如果想要直接存储对象,可以使用spring的RedisTemplate,方便基础类型和 Java 对象之间的转换。
首先导入依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置RedisTemplate
而对象保存在redis中,只保存空对象肯定没啥意义,这就需要序列化对象,将对象持久化到redis中,RedisTemplate默认使用JDK的序列化方式,当然我们一般如下配置。
推荐key使用StringRedisSerializer,保持的key简明易读;value可以使用Jackson2JsonRedisSerializer,这也可以综合考虑效率和可读性,但牺牲部分空间,
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(final RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);// 配置连接工厂
Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final的,final修饰的类,比如String,Integer等会抛出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
template.setValueSerializer(jacksonSeial);
template.setKeySerializer(new StringRedisSerializer());
return template;
}
}
当然也可以采用其他的序列化方式,spring-data-redis提供如下几种选择:
GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: 序列化object对象为json字符串
JdkSerializationRedisSerializer: 序列化java对象
StringRedisSerializer: 简单的字符串序列化
具体的区别看这篇文章。
连接redis
配置好了RedisTemplate,我们还需要让RedisTemplate连接到redis服务器呀,RedisTemplate默认使用JedisConnectionFactory来连接redis服务器。具体可以搜一下
RedisAutoConfiguration
这个是核心配置类。
spring.redis.host=localhost
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
到此RedisTemplate就配置好了.
方法使用
下面就直接在程序中注入就可以使用了。
@Service
public class RedisService {
@Autowired
RedisTemplate<String, Object> redisTemplate;
public void setKeyValue(final String key, final Object value) {
redisTemplate.opsForValue().set(key, value);
}
public Object getKeyValue(final String key) {
return redisTemplate.opsForValue().get(key);
}
}
redisTemplate.opsForValue()相对于redis的string类型,当然其他数据类型都是相对应的,如下:
redisTemplate方法 | redis数据类型 |
---|---|
opsForValue() | string |
opsForHash() | hash |
opsForList() | list |
opsForSet() | set |
opsForZSet() | zset |
| list |
| opsForSet() | set |
| opsForZSet() | zset |