redis深入了解(一)

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分钟时间+随机数时间 过期

你可能感兴趣的:(#,redis)