Redis及缓存击穿、穿透、雪崩

目录

优缺点

使用方法

 使用场景

Redis缓存击穿、穿透、雪崩


Redis是一款开源的内存数据结构存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。Redis的使用场景非常广泛,以下是一些常见的使用场景:

优缺点

1. 缓存:Redis最常见的使用场景就是作为缓存,将热点数据存储在内存中,以提高读写性能。

2. 计数器:Redis支持原子操作,可以用来实现计数器功能,如网站的PV/UV统计。

3. 分布式锁:Redis的原子操作还可以用来实现分布式锁,保证多个进程或线程之间的互斥访问。

4. 消息队列:Redis支持发布/订阅模式,可以用来实现消息队列功能。

5. 数据存储:Redis支持持久化存储,可以将数据存储到磁盘上,以保证数据的可靠性。

Redis的优点:

1. 高性能:Redis将数据存储在内存中,读写速度非常快。

2. 多种数据结构:Redis支持多种数据结构,可以满足不同的需求。

3. 原子操作:Redis支持原子操作,可以保证多个操作的原子性。

4. 高可用性:Redis支持主从复制和哨兵模式,可以保证高可用性。

Redis的缺点:

1. 内存限制:Redis将数据存储在内存中,受到内存大小的限制。

2. 持久化存储:Redis的持久化存储需要将数据写入磁盘,会影响性能。

3. 单线程:Redis是单线程的,不能充分利用多核CPU的性能。

4. 数据一致性:Redis的主从复制和哨兵模式不能保证数据的强一致性。

使用方法

1. 字符串操作

- SET:设置一个键值对,常用于缓存、计数器等场景。
- GET:获取一个键对应的值。
- INCR/DECR:对一个键对应的值进行加/减操作,常用于计数器场景。
- APPEND:将指定字符串追加到一个键对应的值的末尾,常用于日志记录等场景。

2. 哈希表操作

- HSET:设置一个哈希表中的字段和值。
- HGET:获取一个哈希表中指定字段的值。
- HGETALL:获取一个哈希表中所有字段和值。
- HINCRBY:对一个哈希表中指定字段的值进行加操作,常用于计数器场景。

3. 列表操作

- LPUSH/RPUSH:将一个元素插入到列表的左/右侧。
- LPOP/RPOP:从列表的左/右侧弹出一个元素。
- LINDEX:获取列表中指定下标的元素。
- LLEN:获取列表的长度。

4. 集合操作

- SADD:向集合中添加一个元素。
- SMEMBERS:获取集合中所有元素。
- SISMEMBER:判断一个元素是否在集合中。
- SINTER:获取多个集合的交集。

5. 有序集合操作

- ZADD:向有序集合中添加一个元素。
- ZRANGE:获取有序集合中指定范围的元素。
- ZSCORE:获取有序集合中指定元素的分值。
- ZINCRBY:对有序集合中指定元素的分值进行加操作,常用于排行榜场景。

总的来说,Redis的各个方法都有各自的应用场景,可以根据具体的业务需求选择合适的方法来实现。例如,字符串操作常用于缓存、计数器等场景,哈希表操作常用于存储对象,列表操作常用于队列、栈等场景,集合操作常用于去重、交集等场景,有序集合操作常用于排行榜等场景。

 使用场景

1. SET:设置一个键值对,常用于缓存数据、存储用户会话等场景。

2. GET:获取一个键对应的值,常用于读取缓存数据、获取用户会话等场景。

3. INCR/DECR:对一个键对应的值进行加/减操作,常用于计数器、排名等场景。

4. HSET/HGET:设置/获取一个哈希表中的字段值,常用于存储用户信息、商品信息等场景。

5. LPUSH/RPUSH/LRANGE:向列表中左/右侧添加元素,或者获取列表中的一段元素,常用于消息队列、任务队列等场景。

6. SADD/SMEMBERS:向集合中添加元素,或者获取集合中的所有元素,常用于去重、标签等场景。

7. ZADD/ZRANGE:向有序集合中添加元素,或者获取有序集合中的一段元素,常用于排名、排行榜等场景。

8. EXPIRE:设置一个键的过期时间,常用于缓存数据、限流等场景。 以上是一些常用的Redis方法及其使用场景,实际应用中还有很多其他的方法和场景。需要根据具体的业务需求选择合适的方法和数据结构

Redis缓存击穿、穿透、雪崩

Redis是一种常用的缓存技术,但是在使用过程中,可能会遇到以下三种缓存问题:

1. 缓存穿透:指查询一个不存在的key,由于缓存中没有对应的数据,每次查询都会穿透到数据库,导致数据库压力过大。攻击者可以通过构造恶意的key来攻击系统,造成系统瘫痪。

解决方案:
- 布隆过滤器:在缓存层和数据库层之间增加一个布隆过滤器,用于过滤掉不存在的key,减少对数据库的访问。
- 缓存空对象:在缓存中存储一个空对象,表示该key对应的数据不存在,下次查询时直接返回空对象,不再访问数据库。
- 设置短期过期时间:对于查询不存在的key,设置一个短期的过期时间,避免大量的请求同时穿透到数据库。

2. 缓存雪崩:指缓存中大量的key同时过期失效,导致大量的请求直接访问数据库,造成数据库压力过大,甚至导致系统崩溃。

解决方案:
- 设置不同的过期时间:对于相同类型的数据,设置不同的过期时间,避免大量的key同时失效。
- 加入随机时间:在缓存中设置随机的过期时间,避免大量的key同时失效。
- 使用分布式锁:在缓存中设置分布式锁,避免多个请求同时访问数据库。

3. 缓存击穿:指某个热点key失效,导致大量的请求直接访问数据库,造成数据库压力过大,甚至导致系统崩溃。

解决方案:
- 设置永不过期:对于热点数据,可以设置永不过期,避免缓存失效。
- 加入互斥锁:在缓存中设置互斥锁,避免多个请求同时访问数据库。
- 使用异步更新:在缓存中设置异步更新,避免大量的请求同时访问数据库。

猜你喜欢

转载自blog.csdn.net/weixin_46894136/article/details/131034245