1、redis常用的五种数据类型
1、1 String(字符串)
底层是c语言的字符串,但是有一些小区别,比如内存分配的时候,是预先分配的,回收内存的时候是惰性回收。
1、2 list(底层是双向链表)
所以你会看到list有lpush,rpush,lpop,rpop等操作。
1、3 Hash
底层跟hashmap差不多,但是他扩容的时候也是两倍扩容的,有区别的是,他不是扩容是用另一条链来进行的,然后再进行修改一下。
1、4 Set
底层跟hash类似,基本一样的,就是他的key跟value都一样
1、5 Zset
底层跟set差不多,但是这里他运用了一个跳表进行排序的。
2、redis的缓存击穿,缓存穿透,缓存雪崩
2、1 缓存雪崩
Redis中大批量key在同一时间同时失效导致所有请求都打到了MySQL。而MySQL扛不住导致大面积崩塌。
雪崩解决方案:
1、缓存数据的过期时间加上个随机值,防止同一时间大量数据过期现象发生。
2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3、设置热点数据永远不过期。
2.2、缓存穿透
穿透定义:
缓存穿透 是 指缓存和数据库中都没有的数据,比如ID默认>0,黑客一直 请求ID= -12的数据那么就会导致数据库压力过大,严重会击垮数据库。
穿透解决方案:
1、后端接口层增加 用户鉴权校验,参数做校验等。
2、单个IP每秒访问次数超过阈值直接拉黑IP,关进小黑屋1天,在获取IP代理池的时候我就被拉黑过。
3、从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null 失效时间可以为15秒防止恶意攻击。
4、用Redis提供的Bloom Filter 特性也OK。
Redis中大批量key在同一时间同时失效导致所有请求都打到了MySQL。而MySQL扛不住导致大面积崩塌。
雪崩解决方案:
1、缓存数据的过期时间加上个随机值,防止同一时间大量数据过期现象发生。
2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3、设置热点数据永远不过期。
2、3 、缓存穿透
穿透定义:
缓存穿透 是 指缓存和数据库中都没有的数据,比如ID默认>0,黑客一直 请求ID= -12的数据那么就会导致数据库压力过大,严重会击垮数据库。
穿透解决方案:
1、后端接口层增加 用户鉴权校验,参数做校验等。
2、单个IP每秒访问次数超过阈值直接拉黑IP,关进小黑屋1天,在获取IP代理池的时候我就被拉黑过。
3、从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null 失效时间可以为15秒防止恶意攻击。
4、用Redis提供的Bloom Filter 特性也OK。
3、内存淘汰策略
1、volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
2、volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
3、volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4、allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
5、allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6、no-enviction(驱逐):禁止驱逐数据,不删除的意思。
这里有一个常用的算法LRU算法,我们可以使用hashmap跟数据结构的链表来进行LRU。