Redis数据类型有哪些?雪崩、击穿、穿透?

数据类型

​ 1. String:用于缓存、计数器、分布式锁等场景。

​ 2. Hash:用于存储对象,例如用户信息、商品信息等。

​ 3. List:可以进行队列和栈的操作常用于消息队列、任务队列等场景。

​ 4. Set:可以进行集合运算,例如并集、交集、差集等操作常用于标签、好友列表等场景

​ 5. ZSet:可以按照分数排序,也可以进行范围查询。常用于排行榜、计分系统等场景。

缓存问题

​ 1. 缓存穿透:当一个查询的数据在缓存中不存在,但在数据库中也不存在时,这个查询会穿透到数据库,导致数据库负载过高 解决方法使用布隆过滤器,将不存在于数据库的数据进行过滤;对于查询结果为空的 key,设置空值缓存,有效时间设置短一些

​ 2. 缓存击穿:当一个热点数据过期时,大量的请求会同时访问数据库,导致数据库负载过高。解决方法有:设置热点数据永不过期,定期更新缓存

​ 3. 缓存雪崩:当大量的缓存数据同时过期时,大量的请求会同时访问数据库,导致数据库负载过高 解决方法:给缓存的key设置随机过期时间,防止大量的缓存数据同时过期

### 解决Redis雪崩击穿穿透问题的最佳实践 #### 1. 缓存雪崩的解决方案 缓存雪崩是指大量缓存同时失效,导致请求直接打到数据库上,造成数据库压力过大。以下是几种常见的解决方案: - **设置随机过期时间**:为每个缓存键设置不同的过期时间,避免所有缓存同时失效[^2]。 - **使用布隆过滤器预判**:在缓存和数据库之间加入布隆过滤器,提前判断数据是否存在,减少无效查询[^3]。 - **引入互斥锁(Mutex)**:当某个缓存失效时,通过分布式锁确保只有一个线程去加载数据,其他线程等待加载完成后再使用新数据[^1]。 ```python import redis import threading def get_data_with_mutex(key): r = redis.Redis() if r.exists(key): return r.get(key) lock_key = f"lock:{key}" with threading.Lock(): if not r.exists(lock_key): r.set(lock_key, "1", ex=5) # 设置锁并设置超时时间 data = fetch_data_from_db(key) # 从数据库获取数据 r.set(key, data, ex=60) # 将数据写入缓存 r.delete(lock_key) # 删除锁 return r.get(key) ``` #### 2. 缓存击穿的解决方案 缓存击穿是指某个热点数据恰好在缓存中失效,大量并发请求直接访问数据库。以下是解决方法: - **加锁机制**:如前所述,使用分布式锁确保只有一个线程负责加载数据,其他线程等待[^2]。 - **永不过期策略**:对于极热的数据,可以考虑设置永不过期,并通过后台任务定期更新缓存[^1]。 ```python def update_hot_data_periodically(key, interval=60): while True: data = fetch_data_from_db(key) r = redis.Redis() r.set(key, data) # 不设置过期时间 time.sleep(interval) ``` #### 3. 缓存穿透的解决方案 缓存穿透是指请求的数据既不在缓存中,也不在数据库中,导致每次请求都直接访问数据库。以下是应对措施: - **返回空值缓存**:当发现数据库中不存在对应数据时,在缓存中存储一个特殊的标志(如 `None`),并设置较短的过期时间,防止后续相同请求再次查询数据库[^3]。 - **布隆过滤器**:在缓存层之前引入布隆过滤器,快速判断请求的数据是否可能存在,从而拦截无效请求[^3]。 ```python def handle_cache_miss(key): r = redis.Redis() if not r.exists(key): data = fetch_data_from_db(key) if data is None: r.set(key, "NULL", ex=60) # 缓存空值 else: r.set(key, data, ex=300) return r.get(key) ``` ### 总结 通过合理设置缓存过期时间、引入布隆过滤器、使用分布式锁以及缓存空值等方法,可以有效缓解 Redis 雪崩击穿穿透带来的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值