Spring 对 Redis 的支持
Redis是一款开源的内存kv存储,支持多种数据结构(list、set、hash)。
kv存储:kv数据库是指Key-value数据库,是一种以键值对存储数据的一种数据库,类似java中的map。可以将整个数据库理解为一个大的map,每个键都会对应一个唯一的值。key-value分布式存储系统查询速度快、存放数据量大、支持高并发,非常适合通过主键进行查询,但不能进行复杂的条件查询。
支持的客户端主要有: Jedis / Lettuce,和MongoDB相似,也有一个 RedisTemplate 类,对数据进行增删查,也提供了一个对 Repository 支持。
与关系型数据库和MongoDB不同的是,我们经常把Redis当做一个非持久化的缓存来使用的,而不是作为一个持久化的存储,所以我们经常要求Redis存的东西是可以丢失的,因为丢失之后,我们可以从后端的存储当中再把数据加载上来,如何将数据缓存到Redis并取出,我们就要用到Jedis 客户端。
Jedis 客户端的简单使用
首先,Jedis的实例不是线程安全的,所以我们不能在多个线程之间共享一个Jedis的实例,在一般的使用当中,我们使用JedisPool ,通过 JedisPool 来做一个类似于数据库连接池的效果,让它来替我们维护一个 Jedis 实例,在使用的时候,通过 JedisPool 获得 Jedis 实例,然后使用Redis的方法。
Jedis 客户端的简单使用
@Bean
@ConfigurationProperties("redis")//加上该注解后,就会注入在application.properties中server开头的属性
public JedisPoolConfig jedisPoolConfig() {
return new JedisPoolConfig();
}
@Bean(destroyMethod = "close") //关闭这个bean的时候 调用close方法
public JedisPool jedisPool(@Value("${redis.host}") String host) { //通过value注解,来传入一个Jedis的host,将它作为我要连接的目标的jdedis的host
return new JedisPool(jedisPoolConfig(), host);
}
通过 Docker 启动 Redis
获取镜像
docker pull redis
启动 Redis
docker run --name redis -d -p 6379:6379 redis
停止容器
docker stop 容器名($CONTAINER_ID)
如何开启已经停止的容器
docker ps -a 查看全部容器
docker start 容器名 开启容器
例子
主要代码和之前的一样,除了主方法。
@Slf4j
@EnableTransactionManagement//添加开启事务的注解
@SpringBootApplication
@EnableJpaRepositories //用来扫描和发现指定包及其子包中的Repository定义 就是Repository包
public class SpringBucksApplication implements ApplicationRunner {
@Autowired
private CoffeeService coffeeService;
@Autowired
private JedisPool jedisPool;
@Autowired
private JedisPoolConfig jedisPoolConfig;
public static void main(String[] args) {
SpringApplication.run(SpringBucksApplication.class, args);
}
@Bean
@ConfigurationProperties("redis")//加上该注解后,就会注入在application.properties中server开头的属性
public JedisPoolConfig jedisPoolConfig() {
return new JedisPoolConfig();
}
@Bean(destroyMethod = "close") //关闭这个bean的时候 调用close方法
public JedisPool jedisPool(@Value("${redis.host}") String host) { //通过value注解,来传入一个Jedis的host,将它作为我要连接的目标的jdedis的host
return new JedisPool(jedisPoolConfig(), host);
}
@Override
public void run(ApplicationArguments args) throws Exception {
log.info(jedisPoolConfig.toString()); //输出jedisPool的配置
try (Jedis jedis = jedisPool.getResource()) { //从jedisPool取出一个jedis实例
coffeeService.findAllCoffee().forEach(c -> {
jedis.hset("springbucks-menu", //hap的名字为springbucks-menu
c.getName(), //取出Coffee的名字 hap的key
Long.toString(c.getPrice().getAmountMinorLong()));//取出MinorAmount hap的value
});
Map<String, String> menu = jedis.hgetAll("springbucks-menu");//取出名字为springbucks-menu的Map
log.info("Menu: {}", menu);
String price = jedis.hget("springbucks-menu", "espresso"); //从hash中找这个key(espresso)的value
log.info("espresso - {}",
Money.ofMinor(CurrencyUnit.of("CNY"), Long.parseLong(price)));
} //在整个try结束之后 Java会将其关闭
}
}