理解:Redis作用

自己的疑问,自己的理解。


Redis 是干啥的?
Redis是一个用于缓存数据库热点数据的nosql数据库,它在内存中做数据的存储。特点是比传统数据库的读写速度快。由于内存存储数据,状态是瞬时数据,数据安全性不高,需要通过持久化来保证数据的可恢复性。

Redis 缓存的是热点数据。如何保证缓存的数据是热点数据?
如果没有缓存预热,第一次查询时将缓存的数据设置过期时间,每次查询数据库都刷新/重置这个过期时间,那么热点数据的过期时间会经常的刷新和重置,最终 冷数据 不被经常查询到达过期时间就从缓存中淘汰掉。
设置过期时间 expire [键] [时间]

更新操作怎么办?
业务中的更新数据,更新数据库同时更新Redis,因为数据库和redis不能达成原子操作,而这两步操作在业务上要求一个原子操作,要么全部成功要么全部失败,不然下次查询 redis 返回的值与数据库中真实数据不一致。先将 redis中的数据删掉,再修改数据库中的数据,之后将数据缓存到redis中。这个过程中,如果redis没删掉,就更新数据库;如果redis删掉了,数据库没更新成功,也会重新将数据缓存到 redis 中;上面这种情况没考虑线程安全问题。


个人理解:

用户请求数据时,直接访问Redis,如果查不到数据可能是两种情况,数据过期,或者不存在此数据。这两种情况解决办法就是查询数据库。所以,redis是缓存,但却不能保证数据是否真实存在,如果redis中没有数据,必须要去数据库中查询来确保数据是否真实存在。在这个过程中会产生缓存穿透,缓存雪崩,缓存击穿的问题。

缓存穿透:
 就是大量请求查找一个在 redis 中不存在的数据,要正确执行业务就得继续查询数据库,发现数据库中也不存在的条数据。
 这种无意义的请求,会正常的返回null,但加重了数据库的压力。

解决办法:

  1. 将采用布隆过滤器的方式将redis查询的数据过滤,如果被过滤说明这个请求的数据一定是不存在的。不存在就不访问数据库。有一定概率未被过滤但数据不存在。

  2. 即使数据库返回了Null也将此键值对存入缓存,合理设置较短的过期时间,然后在业务中交给用户处理(比如提示个没找到)。

缓存击穿:
大量请求访问一个 Redis 中没有的数据(并发),然后大量请求并发查找数据库而且该数据是存在的,
也就是说这些请求都是应该是有效的。
那么大量请求进入数据库服务器,会导致服务器压力过大

解决办法:

  1. 使用分布式锁:
    使用分布式锁,当每个线程将要访问数据库时,尝试获取锁,访问完数据库时将数据库中的数据写到 redis 中;如果没有获取到锁,说明已经有线程去数据库取数据了,此时将方法返回,到上层重新查 Redis (或者递归上层方法)。
public Object 查找Key(){
	Object 结果 = 向Redis中查找一个key();
	if(结果==“nil”){//redis中不存在这样的key,就要向数据库中查询数据
		//先设置一个分布式锁,可以通过 redis 设置
		Object 结果1 = 设置分布式锁set("键名",,时间,nx);
		if("ok".equalsIgnoreCase(结果1)){
			
		}
	}else{//如果存在这样的key 就将结果返回
		return 结果;
	}
}
缓存雪崩

与缓存击穿不同的是,雪崩是大量的Key过期,或者redis服务器宕机,导致请求大量堆积到数据库,增加数据库压力。

解决方法:
配置 Redis 高可用集群,防止单点故障,设置Key错峰过期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值