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 |