redis的数据类型:
redis有5中常用的数据类型:
String:结构底层是一个简单地动态字符串(simple dynamic string SDS),支持扩容,存储字符串。
List:存储线性有序且可重复的元素,底层数据结构可以是双向链表/ziplist。
Hash:存储的是键值对,底层数据结构是ziplist和hash。
Set:存储不可重复的元素,一般用于求交集,差集等,底层数据结构可以使hash和inset
Zset:存储有序不可重复的元素,zset为每个元素添加了一个score属性作为排序的数据,底层数据结构可以是 ziplist和跳表。
redis单线程有什么好处;
redis采用的是单线程+IO多路复用技术。这里的单线程指的是redis中的KV读写操作和网络IO使用的是单线程的,而其他功能如持久化、异步删除等是依赖其他线程来执行的。单线程既可以简化数据结构和算法的实现,同时也消除了线程切换和锁竞争带来的消耗。但是如果某个命令执行过久就会导致其他命令的阻塞时间过长。redis中采用io多路复用机制来并发处理客户端的大量请求,实现高吞吐量。
redis为什么那么快
1.单线程进行读写操作,避免了线程切换和锁竞争带来的消耗。
2.redis操作实在内存中进行的;
3.采用IO多路复用技术,实现了网络IO中能够处理大量并发请求,实现高吞吐率。
redis的持久化策略
redis的持久化策略有三种(4.0之后):
RDB(redis database):是将当前进程数据以生成快照的方式保存到磁盘的过程,也是redis默认的持久化策略。RDB会创建一个.经过压缩的.rdb的二进制文件,内部存储了各个数据库的KV对信息。RDB持久化过程有自动触发和手动触发两种方式,手动触发是指通过BGSAVE或SAVE命令触发持久化操作,创建.rdb文件。自动触发是指通过配置选项让服务器满足指定条件时自动触发BGSAVE命令(save 900 1 (15分钟内修改了一个数据) save 300 10 (5分钟内修改了10处数据) save 60 10000(1分钟内修改了10000处数据))。他的优点是其生产的紧凑压缩的二进制文件体积小,使用该文件恢复数据库的速度非常快;缺点是数据安全性低,RDB是隔一段时间进行一次备份,在此期间,如果发生了异常,可能导致数据的不完整性。
AOF(append only file):以独立日止的方式记录了每次写入的命令,重启时再重新执行AOF文件中的命令来恢复数据库。AOF持久化的优点是与RDB持久化可能会丢失大量数据相比,AOF持久化的安全性要高很多。通过使用everysec选项,用户可以将数据丢失的时间窗口限制在1秒之内。缺点是AOF文件存储的是协议文本,他的体积要比.rdb文件大很多。AOF需要指定AOF文件中的命令来恢复数据库,其恢复速度比RDB慢很多。AOF在进行重写时也需要创建子进程,在数据库体积较大时将占用大量资源,会导致服务器的短暂阻塞。AOF解决了数据持久化的实时性,是目前redis主流的持久化策略。
redis缓存穿透、击穿、雪崩
缓存穿透:是指客户端访问不存在的数据,缓存层中没有而直接去访问数据库导入负载过大直至宕机。原因可能是业务层误删除了缓存中的数据或者是有人恶意访问不存在的数据;解决办法:1.存储层为命中后,返回空值存入缓存中,客户端再次访问时,缓存层直接返回空。2.将数据存入布隆过滤器,访问缓存之前进行过滤器拦截,若请求的数据不存在直接返回空值。
缓存击穿:热点数据的访问量非常大,在缓存失效的瞬间,大量请求直接访问存储层,导致服务器崩溃。解决方案:1.设置热点数据永不过期;2.加互斥锁,当一个线程访问该数据时,其他线程只能等待,这个线程访问返回后,缓存层中的数据将会重新建立,届时其他线程将会从缓存层中得到结果。
缓存雪崩:大量数据同时过期、或是redis节点故障导致服务不可用,缓存层无法提供服务,所有的请求直接到达存储层,造成数据库宕机。解决方案:1.设置随机过期时间,避免数据大量同时过期。2.启用服务熔断和服务降级措施。3.设置热点数据永不过期。4.采用redis集群,一个节点宕机另外的节点还可以使用。
redis和数据库如何保持双写一致性
先更新数据库再删除缓存,如果失败采用重试机制。
说说redis的主从同步机制(得分点:PSYNC,全量复制,部分复制)
redis主从同步是指任意数量的从节点都可以从主节点上同步数据。而除了多个slave可以连接到同一个master之外,slave还可以接受其他slave的连接,这就形成了一个树形结构,使得redis可以执行单层树复制。从2.8版本开始,当启动一个slave node的时候,他会发送一个`PSYNC`命令给master node。如果slave node是第一次连接到master node,那么还会触发一次全量复制。此时master会启动一个后台线程,开始生成一份'RDB'快照文件,同时还会讲从客户端client接受到的所有写命令缓存在内存中。RDB文件生成完毕后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中,接着master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。slave node 如果更master node有网络故障断开了连接,会自动重连,重连之后master node仅会复制给slave部分缺少的数据。
如何实现redis高可用(得分点:哨兵模式、集群模式)
redis高可用主要有两种:哨兵模式和集群模式;
哨兵模式:哨兵模式是一种分布式架构,他包含若干个哨兵节点和数据节点,每一个哨兵节点都会监控着其他的数据节点和哨兵节点,当发现节点不可达是,会对节点做下线标识。如果被标识的是主节点,他会与其他的哨兵节点进行协商,可以避免误判,当大多数哨兵节点都认为主节点不可达是,他们便会选择出一个哨兵节点来做自动故障转移工作,可以将从节点晋升为主节点,同时还会实时的通知到应用方,整个过程自动的,实现高可用。
集群模式:Redis集群采用虚拟槽分区来实现数据分片,他把所有的键根据哈希函数映射到0-16383整数槽内,计算公式为slot=CRC16(KEY)&16383,每一个节点负责维护一部分槽以及槽所映射的键值数据。
redis的缓存淘汰机制(得分点:惰性删除、定期删除、maxmemory-policy)
```
惰性删除:客户端访问一个key时,redis首先会检查他的过期时间,如果发现过期立即删除这个key。
定期删除:redis会将设置了过期时间的key放到一个独立的字典中,并且对该字典进行每秒10次的过期扫描,过期扫描不会遍历字典中的所有key,而是采用了一种简单地贪心策略。该策略的逻辑如下:1.从过期字典中随机选择20个key;2.删除这20个key中已过期的key;3.如果已过期的key的比例超过了25%,则重复步骤1。
当写入数据将导致超出maxmemory限制时,Redis会采用maxmemory-policy所指定的策略进行数据淘汰,该策略一共包含8种选项,其中除了noeviction直接返回错误之外,筛选键的方式分为volatile和allkeys两种,volatile前缀代表从设置了过期时间的键中淘汰数据,allkeys前缀代表从所有的键中淘汰数据。关于后缀,ttl代表选择过期时间最小的键,random代表随机选择键,需要我们额外关注的是lru和lfu后缀,它们分别代表采用lru算法和lfu算法来淘汰数据。因为allkeys是筛选所有的键,所以不存在ttl,余下三个后缀二者都有,lfu算法是再Redis4版本才提出来的。LRU算法的不足之处在于,若一个key很少被访问,只是刚刚偶尔被访问了一次,则它就被认为是热点数据,短时间内不会被淘汰。 LFU算法正式用于解决上述问题,LFU(Least Frequently Used)是Redis4新增的淘汰策略,它根据key的最近访问频率进行淘汰。LFU在LRU的基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。当使用LFU策略淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出内存。如果两个数据的访问次数相同,LFU再比较这两个数据的访问时间,把访问时间更早的数据淘汰出内存。
```
标签:缓存,slave,redis,问题,访问,数据,节点
From: https://www.cnblogs.com/yufou/p/16919236.html