首页 > 数据库 >redis问题

redis问题

时间:2022-11-23 17:55:38浏览次数:44  
标签:缓存 slave redis 问题 访问 数据 节点

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)

image-20221015162358599

```
	惰性删除:客户端访问一个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

相关文章

  • 3. Redis配置
    Redis的配置信息在/etc/redis/redis.conf下。查看:sudovi/etc/redis/redis.confbind:改为0.0.0.0表示任意IP可以访问daemonize:改为yes,表示后台运行requirepa......
  • 【MSSQL】SQL SERVER导入中文乱码问题解决
    公司最近承接了一个项目,甲方现使用旧版SiteServer框架(以下简称“SiteCMS”)作为门户网站,使用的数据源是SQLServer。现在需要对SiteCMS进行升级,在升级时数据库和数据库结构也......
  • Mybaties模糊查询包含括号(), #{} 单引号失效问题
    比如我想模糊查询一个字符,是"platformConfig":"Amazon(Auto)"再过去我的的Myabties文件是这样写的<iftest="platformConfig!=nullandplatformConfig!=''">......
  • pygame中文乱码问题
    一开始在做FlappyBird小游戏时面临中文乱码显示问题,如下所示:一开始我还以为是Python编码问题,然而Python3中自动解决了中文显示问题,最简单的例子就是用print()语句进行打印,......
  • Mysql数据库,Redis 缓存一致性
    1.先更新数据库,再更新缓存2.先删除缓存,再更新数据库3.延迟双扇4cannal---异步  参考:Mysql和Redis如何保证数据一致性 redis和mysql缓存一致性如何保持MySQL和......
  • scrapy爬取后中文乱码,解决word转为html 时cp1252编码问题
    解决思路1、循环暴力寻找编码,但是不如思路3defparse(self,response):print(response.text[:100])body=response.body#直接是bytes,response.tex......
  • Spring Cache + Redis;用Spring Cache的注解自动管理Redis缓存
    https://blog.csdn.net/qq_45839663/article/details/127209491?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHu......
  • 容器时区与宿主机时区不一致问题
    容器启动的时候没有指定指定时区,所以默认是慢了八个小时一般情况下,我们的宿主机服务器的时区都是在东八区,而容器里却是在零时区。这样就导致了时间差了8个小时,所以需要把......
  • Edge 浏览器出现兼容性问题
    Edge浏览器出现兼容性问题1.打开电脑任务管理器,关闭所有msedge.exe。2.关闭后,重启Edge浏览器,若重启后没有再弹窗兼容性问题,这时就可以进入下一步。3.打开浏览器——......
  • vue 使用i18n 实现中英文切换 表单校验提示不更新问题
    在用i18n实现中英文切换的时候,出现了在表单中校验不更新的问题,尝试多种方式无果,下面这个方法值得一试。可轻松解决此问题。data(){ruleInline:{userName:......