通过Docker辅助开发------------Spring Data Redis

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会将其关闭
	}
}
发布了59 篇原创文章 · 获赞 6 · 访问量 976

猜你喜欢

转载自blog.csdn.net/weixin_43790623/article/details/103223559