关于redis常用的数据类型

String: 字符串。 set key value ; get key

Hash:键值对集合,存储多个字段。 hset key field value ; hget key field ; hmset key field1 value1 field2 value2 ; hmget key field1 field2 (存储/获取一个或多个哈希是键值对的集合)

List:列表,按插入顺序排序。 lpush key value ; rpush key value ;(插入元素到列表的头部/尾部) lpop key ; rpop key (从头/尾删除一个元素) lrange key start end (获取列表指定范围的元素)

Set:集合,无序不重复。 sadd key value ; srem key value ; smembers key (添加/删除元素到集合/获取集合所有元素)

Zset:有序集合 每个元素都会关联double类型的分数,元素唯一但是分数可以重复。 zadd key score value ; zrem key value ; zrange key start end (添加/删除元素到有序集合/获取有序集合指定范围的元素) zscore key value (获取元素的分数)

关于击穿,穿透,雪崩

缓存穿透

用户在查找不存在的数据时,因为缓存中没有,所以每一次只要有查找操作时缓存都会向数据库发送查找请求,极大的增加了数据库的压力。
解决方案:
1.缓存空对象:当缓存和数据库都查不到某个数据时,我们可以将其查找的数据在redis中缓存为一个空对象,这样下次再访问时,就可以直接返回空对象,避免了多次请求。
2.布隆过滤器:布隆过滤器是一种数据结构,它可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率。

缓存击穿

我们在做缓存时为某一个key设置了过期时间,当该key过期时恰好有大量该key的并发请求,会给数据库造成很大压力。
解决方案:
1.设置热点数据永不过期:对于热点数据,我们可以设置永不过期,这样即使缓存过期,也能保证热点数据能够及时更新。
2.使用互斥锁:当缓存失效时,使用互斥锁,只有一个线程去更新缓存,其他线程等待。

缓存雪崩

缓存服务器重启或者大量缓存同时失效时,会给数据库造成很大压力。
解决方案:
1.给不同的key添加随机的失效时间。
2.使用Redis集群:Redis集群可以将数据分布到不同的服务器上,避免单点故障。
3.给缓存业务添加降级限流策略。
4.给业务添加多级缓存。

双写一致性(mysql和redis数据同步)

修改数据库的数据的同时也要更新缓存的数据,缓存和数据库的数据要保持一致。
一致性要求高
允许延迟一致