springboot中redis正确的使用详解(redis在springboot中的应用)

网友投稿 332 2022-08-02


redis实现了对数据的缓存,在项目里一些字典数据,会话数据,临时性数据都会向redis来存储,而在springboot里对redis也有支持,一般来说多个线程共同使用一个redis实现是有线程安全的风险的,而每个实现一个线程又太浪费资源,无法控制线程数量是非常危险的,所以就出现了一些redis线程池组件,下面说一下两个主要的组件。

jedis 线程池主要是每个实例有自己的线程,线程可以从它建立的池子里获取lettuce lettuce是 apache推出的线程池工具,它的redPYGiuaAhDpis实例是可以被多个线程共享访问的,提高了资源使用率

redis序列化配置

一般来说, redis-key采用字符串序列化; redis-value采用json序列化, json的体积小,可读性高,不需要实现serializer接口。

/**

* 对redis的配置.

*/

@Configuration

public class RedisConfig {

@Autowired

private RedisConnectionFactory redisConnectionFactory;

/**

* redis重写RedisTemplate.

*/

@Bean

public RedisTemplate redisTemplate() {

RedisTemplate redisTemplate = new RedisTemplate();

RedisSerializer stringSerializer = new StringRedisSerializer();

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

//序列化时允许非常量字段均输出类型,即redis序列化后带有类型

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2Jshttp://onRedisSerializer.setObjectMapper(om);

// redis key的序列化

redisTemplate.setKeySerializer(stringSerializer);

redisTemplate.setHashKeySerializer(stringSerializer);

// redis value的序列化

redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

redisTemplate.setConnectionFactory(redisConnectionFactory);

return redisTemplate;

}

}

上面代码中,om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL)产生的json串是带有类型的,这样再反序列化时可以直接通过类型去推断。

[

"com.lind.basic.entity.Token",

{

"credentials": "ok",

"region": "hello",

"bucket": null

}

]

看一下添加和读取的代码

@GetMapping("set")

public String set() throws JsonProcessingException {

Token token = Token.builder()

.credentials("ok")

.region("hello")

.build();

redisTemplate.opsForValue().set("test:user", token);//redisTemplate帮我们序列化

redisTemplate.opsForHash().put("author", "zzl", token);

return "OK";

}

@GetMapping("get")

public Token get() throws IOException {

return (Token) redisTemplate.opsForValue().get("test:user");

}

注意:对于实体类Token它应该有一个无参构造方法,这是反序列化时需要的。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java详细分析sleep和wait方法有哪些区别(java sleep和wait)
下一篇:java图形界面之加法计算器(java图形用户界面计算器)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~