redis的常见问题:
1.redis是内存版数据库,如果内存满了怎么办?
方案一.. redis集群
1)一定程度可以解决内存不够用的情况
2)但是随着网站用户不断增多,用户所产生的数据将会愈来愈多,
3)服务器越多,并不代表性能越高
方案二。内存淘汰策略----最近不使用的数据从内存淘汰
redis.conf 配置内存淘汰策略
1)maxmemory 0 //表示淘汰所有内存
2)maxmenory-poliy allkeys-lru//有限移除最近不使用的key
2.redis是否是线程安全的数据库
redis 是 线程安全
Redis是一个开源,先进的 key-value 存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案,是 线程安全 的。
Redis三个主要特点:
Redis是一个单线程数据库(单通道)
Redis数据库完全在内存中,使用磁盘仅用于持久性。
相比许多键值 数据存储 ,Redis拥有一套较为丰富的数据类型。
Redis可以将数据复制到任意数量的从服务器。
3.redis的hash槽,你是怎么理解的?(redis如何存储的)
redis共有16384个hash槽,时固定的不能改变,无论集群节点多少。
hash槽将会动态的分配给每个服务器
hash槽存满了怎么办?
注意:hash槽不是用来存储数据的,时用来计算该把数据存储在哪个服务器里。相当于仓库的门,
4.redis缓存穿透,缓存击穿,缓存雪崩?
设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。
缓存穿透
缓存穿透是指查询一个在缓存和数据库中不存在的数据,
问题:这个数据库访问量瞬间增大,数据库可能发生io阻塞,雪崩。
解决:如果发现数据库没有数据,放一个空字符,并且设置过期时间
解决方案
有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存击穿
缓存中有个key过期了,恰好此时这个key面临一个高并发查询,此时缓存中没有数据,并发压力瞬间被转移到数据库,造成数据库雪崩。
解决方案
redis缓存之前加锁进行控制,当第一次访问没有值,查询数据库放入
缓存雪崩
缓存中很多key同时过期,恰好此时这些key面临高并发查询,发现缓存中数据消失,这些并发压力将会瞬间转移给数据库,数据库面临非常高的并发压力,发送雪崩。
解决方案
让缓存的key不同时过期,让redis过期时间5分钟时间+随机数时间 过期