redis缓存

为什么使用缓存

为了提高查询的性能,我们通常采用Redis缓存解决。

这里以docker容器展示

1.1 Redis环境搭建

我们以docker的形式搭建Redis 服务

docker run -di --name=tensquare_redis -p 6379:6379 redis

1.2 SpringDataRedis

Spring-data-redis是spring大家族的一部分,提供了在spring应用中通过简单的配置访问
redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate
提供了redis各种操作。

1.3 查询文章操作缓存

(1)在tensquare_article 的pom.xml引入依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

(2)修改application.yml ,在spring节点下添加配置

redis:
    host: localhost

(3)修改ArticleService 引入RedisTemplate,并修改findById方法

@Autowired
	private RedisTemplate redisTemplate;
	/**
	 * 根据ID查询实体
	 * @param id
	 * @return
	 */
	public Article findById(String id) {
        
		//先从缓存中查询
		Article article = (Article) redisTemplate.opsForValue().get("name_"+id);//名字随便这里用id
		//如果没有取到
		if(article==null){
			//从数据库中查询
			article = articleDao.findById(id).get();
			//存入缓存中
			redisTemplate.opsForValue().set("name_"+id,article);
		}
		return article;
	}

这样在查询的时候,就会自动将文章放入缓存

注:如果想存列表 或者分页的话要把实体类序列化(什么?,你不知道序列化?,百度一下,你就知道),MyBatis-plus框架的话请忽略(因为封装的有序列化)

1.4 修改或删除后清除缓存(为了预防脏读)

当我们对数据进行删改的时候,需要更新缓存。其实更新缓存也就是清除缓存,因
为清除缓存后,用户再次调用查询方法无法提取缓存会重新查找数据库中的记录并放入
缓存。

/**
	 * 修改
	 * @param article
	 */
	public void update(Article article) {
		redisTemplate.delete("name_"+article.getId());//删除缓存
		articleDao.save(article);
	}

	/**
	 * 删除
	 * @param id
	 */
	public void deleteById(String id) {
		redisTemplate.delete("name_"+id);//删除缓存
		articleDao.deleteById(id);
	}
5.3.3 缓存过期处理

通过set(key, value, long timeout, TimeUnit unit)方法设置过期时间

新增一个字符串类型的值,key是键,value是值。

redisTemplate.opsForValue().set("key","value");

设置变量值的过期时间。

第一个值是key
第二个值是值
第三个值是设置的多长时间 ,时间用的是long类型
第四个值是什么单位, (天,时,分,秒)

例:

修改findById方法 ,设置1天的过期时间

redisTemplate.opsForValue().set("name_" + id, article,1,TimeUnit.DAYS);

为了方便测试,我们可以把过期时间改为10秒,然后观察控制台输出

redisTemplate.opsForValue().set("name_" + id, article,10,TimeUnit.SECONDS);