缓存相关

缓存相关

  1. redis和memcached的区别。

  2. redis支持哪些数据结构。

  3. redis是单线程的么,所有的工作都是单线程么。

  4. redis如何存储一个String的。

  5. redis的部署方式,主从,集群。

  6. redis的哨兵模式,一个key值如何在redis集群中找到存储在哪里。

  7. redis持久化策略。

缓存相关的三个常见问题及解决方法如下: ### 1. **缓存穿透** - **问题描述**:当查询一个不存在的数据时,缓存和数据库中都没有该数据,导致每次请求都直接访问数据库,给数据库带来巨大压力。 - **解决方法**: - **布隆过滤器**:在缓存前加一层布隆过滤器,用于判断数据是否存在。如果不存在,直接返回空,避免查询数据库。 - **缓存空值**:对于不存在的数据,也可以在缓存中存储一个空值或默认值,并设置较短的过期时间。 ### 2. **缓存击穿** - **问题描述**:某个热点数据在缓存中过期时,大量并发请求同时访问该数据,导致所有请求都直接访问数据库,造成数据库压力骤增。 - **解决方法**: - **互斥锁**:在更新缓存时,使用分布式锁(如Redis的SETNX命令)保证同一时间只有一个请求能访问数据库并更新缓存。 - **逻辑过期**:为缓存设置逻辑过期时间,而不是直接删除缓存。当缓存过期时,启动一个后台线程异步更新缓存,而不是阻塞当前请求。 ### 3. **缓存雪崩** - **问题描述**:大量缓存数据在同一时间过期,导致所有请求都直接访问数据库,造成数据库崩溃。 - **解决方法**: - **均匀过期**:为缓存设置不同的过期时间,避免大量缓存同时过期。 - **多级缓存**:使用多级缓存(如本地缓存+分布式缓存),降低对单一缓存的依赖。 - **熔断机制**:当数据库压力过大时,启用熔断机制,直接返回降级数据,避免进一步压垮数据库。 ### 示例代码(缓存空值): ```python import redis import time # 连接Redis r = redis.Redis(host='localhost', port=6379, db=0) def get_data(key): # 尝试从缓存获取数据 data = r.get(key) if data is None: # 模拟数据库查询 print("查询数据库...") time.sleep(1) # 模拟耗时操作 # 假设数据库中没有该数据 value = None # 缓存空值,设置较短过期时间(如5秒) r.setex(key, 5, str(value) if value is None else value) return value else: return data if data != b'None' else None # 测试 print(get_data("non_existent_key")) # 第一次查询会访问数据库,后续查询直接返回空 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值