springboot:学习redis
1.基本配置
此处是springboot 2.1.3.RELEASE版本,mysql数据库,redis内存数据库,xml方式的mybatis,cache方式。
2.学习心得
1.首先要保证在没有用redis的情况下能够正常使用。
2.其次选择好是用jedis方式还是redis template方式,在这个过程中我选择了好几个案例但是方式都不太相同,导致我学习一直没什么进展,最后我看到jedis是redis官方的推荐方式,也同时根据丁雪丰老师也用的此种方式,就开始了这个的研究。在开始之前,了解好框架,完成方式,选择一个好的案例或者教程很重要,再沿着前人的路走下去。
3.对于jedis,大致思路,先在配置文件中配置好相关参数,再把这些参数移植到JedisPoolConfig,此处这个config可以自己新建一个类,也可以用redis.clients.jedis下面的,这就涉及到方式的不同。
4.接下来是JedisPool,用刚才的config的参数,构造JedisPool。
5.最后Jedis就是JedisPool的getResource方式。
我是分别写了config和pool的两个类,最后在controller中调用pool。
6.利用cache来尝试缓存,感谢这位大神[cache教程](https://blog.csdn.net/wangb_java/article/details/80212594)
但是其中Cacheable和CachePut有些说可以一起用,这个点以后再进行尝试。
大神就是直接,部分代码如下,就完成了。
@Autowired
private JedisPool jedisPool;
@Autowired
private JedisPoolConfig jedisPoolConfig;*/
@Bean
@ConfigurationProperties("redis")
public JedisPoolConfig jedisPoolConfig() {
return new JedisPoolConfig();
}
@Bean(destroyMethod = "close")
public JedisPool jedisPool(@Value("${redis.host}") String host) {
return new JedisPool(jedisPoolConfig(), "localhost");
}
@Override
public void run(ApplicationArguments args) throws Exception {
log.info(jedisPoolConfig.toString());
try (Jedis jedis = jedisPool.getResource()) {
coffeeService.findAllCoffee().forEach(c -> {
jedis.hset("springbucks-menu",
c.getName(),
Long.toString(c.getPrice().getAmountMinorLong()));
});
Map<String, String> menu = jedis.hgetAll("springbucks-menu");
log.info("Menu: - {}", menu);
String price = jedis.hget("springbucks-menu", "espresso");
log.info("espresso - {}",
Money.ofMinor(CurrencyUnit.of("CNY"), Long.parseLong(price)));
}
最后拉上我的代码:
https://github.com/yui123456/demo
3.记录出现的问题
1.出现Unexpected end of stream报错
与jedisPoolConfig中配置有关系,我这里没有将配置文件的redis配置搬进连接池中。
2.参考的例子是application.properties,用的直接是@ConfigurationProperties(“redis”)
我这里用的是yml格式,注意value中用的是spring.redis,点号。
@Data
@Component
@PropertySource("classpath:application.yml")
public class RedisConfig extends redis.clients.jedis.JedisPoolConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private int timeout;//秒
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.jedis.pool.max-active}")
private int poolMaxTotal;
@Value("${spring.redis.jedis.pool.max-idle}")
private int poolMaxIdle;
@Value("${spring.redis.jedis.pool.min-idle}")
private int poolMinIdle;
@Value("${spring.redis.jedis.pool.max-wait}")
private int poolMaxWait;//秒
}
3.ERR Client sent AUTH, but no password is set这个错误
构造函数中只能选择没有password参数的方式,但是没有password就没办法选择哪个db。还暂时不知道怎么解决。
4.利用cache方式缓存之后,数据是16进制。
无论是对象还是long数字都是显示16进制,仍未解决。
4.总结
感谢网络各种大神,算是自己尝试一下,希望日后再来完善此篇文章。