目录

Memcached VS Redis

Redis 数据淘汰策略

为什么 Redis 把所有数据都放到内存中?

Redis 的并发竞争问题如何解决?

Redis 过期键的删除策略

Redis 与一般 db 的同步过程

简述 Redis 哨兵模式

Redis 哨兵监控机制

如何保证缓存与数据库的双写一致性?

Reids 报错:WRONGTYPE Operation against a key holding the wrong kind of value


Memcached VS Redis

1、存储方式不同:memcached 把数据全部存在内存之中,断电之后会挂掉,而 redis 虽然也用到了内存,但是可以将内存数据保存到磁盘中,保证数据持久性。

2、数据支持类型不同:memcached 对数据支持比较简单(基于内存的key-value存储),而 redis 支持数据类型较丰富,如 string、list、set、sorted set、hash。

3、底层实现不同:一般调用系统函数,会消耗比较多的时间去请求,redis 自己构建了 vm,速度会更快。

Redis 数据淘汰策略

1.volatile-lru:从已经设置过期时间的数据集中,挑选最近最少使用的数据淘汰。

2.volatile-ttl:从已经设置过期时间的数据集中,挑选即将要过期的数据淘汰。

3.volatile-random:从已经设置过期时间的数据集中,随机挑选数据淘汰。

4.allkeys-lru:从所有的数据集中,挑选最近最少使用的数据淘汰。

5.allkeys-random:从所有的数据集中,随机挑选数据淘汰。

6.no-enviction:禁止淘汰数据。

可以通过 maxmemory-policy 配置。

为什么 Redis 把所有数据都放到内存中?

1、redis 为了达到最快的读写速度,将数据都读到内存中,并通过异步的方式将数据写入磁盘。如果不将数据放在内存中,磁盘IO 速度会严重影响 redis 的性能。

Redis 的并发竞争问题如何解决?

1、首先 redis 为单进程单线程模式,采用队列模式将并发访问变为串行访问。

2、redis 本身没有锁的概念,redis 对多个客户端连接并不存在竞争,但是在 Jedis 客户端对 redis 进行并发访问时会产生一系列问题,这些问题时由于客户端连接混乱造成的。有两种方案解决。

1、在客户端,对连接进行池化,同时对客户端读写 redis 操作采用内部锁 synchronized。

2、在服务器角度,利用 setnx 实现锁。

Java 使用 Redis(菜鸟教程):http://www.runoob.com/redis/redis-java.html

Redis 过期键的删除策略

定时删除

1)在设置键的过期时间的同时,创建一个 timer,让定时器在键的过期时间到达时,立即执行对键的删除操作(主动删除)。

2)对内存友好,但是对 cpu 时间不友好,有较多过期键的情况下,删除过期键会占用相当一部分 cpu 时间。

惰性删除

1)放任过期键不管,但是每次从键空间中获取键时,都检查取到的键是否过期,如果过期就删除,如果没过期就返回该键(被动删除)。

2)对 cpu 时间友好,程序只会在取出键的时候才会对键进行过期检查,这不会在删除其他无关过期键上花费任何 cpu 时间,但是如果一个键已经过期,而这个键又保留在数据库中,那么只要这个过期键不被删除,他所占用的内存就不会释放,对内存不友好。

定期删除

1)每隔一段时间就对数据库进行一次检查,删除里面的过期键(主动删除)。

2)采用对内存和 cpu 时间折中的方法,每过一段时间执行一次删除过期键操作,并通过限制操作执行的时长和频率来减少对 cpu 时间的影响。难点在于选择一个好的策略来设置删除操作的时长和执行频率。

Redis 过期键删除策略是惰性删除 + 定期删除 组合使用:

1)Redis的惰性删除策略由 db.c/expireIfNeeded 函数实现,所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。

2)由redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。定期删除函数的运行频率,可以通过 redis.conf 配置文件的 hz 选项修改,可取值为 [1,500],值越大,定时器运行的频率越高,但是也越小消耗 CPU,默认值为 10。

Redis 与一般 db 的同步过程

1、对于数据查询:先去 redis 中判断数据是否存在,如果存在,则直接返回缓存好的数据,如果不存在,去 db 中读取数据,并把数据缓存一份到 redis 中。适用于数据比较大,但是不经常更新的情况,如用户排行。

2、对于数据更新:先去 redis 中判断数据是否存在,如果存在,则直接更新对应数据(这一步会记录下更新的 key),并把更新后的数据返回给页面,如果不存在,先去数据库中更新内容,然后把数据保存一份到redis中。再往后,后台会进行一系列操作,把redis中更新的key读取出来,找到数据库中对应的数据,并更新数据库。这种方式是把redis当作数据库使用,适合大数据的频繁变动。但是对 redis 的依赖很大,要做好挂掉之后的数据备份。

简述 Redis 哨兵模式

哨兵是对 redis 进行实时的监控,主要有两个功能:

1)监测主数据库和从数据库是否正常运行。

2)当主数据库出现故障的时候,可以自动将一个从数据库转换为主数据库,实现自动切换。

Redis 哨兵监控机制

1、哨兵监控也是有集群的,会有多个哨兵进行监控,当判断发生故障的哨兵达到一定数量的时候才进行修复。一个健壮的部署至少需要三个哨兵实例。

2、每个Sentinel(哨兵)以每秒钟一次的频率向它所知的 Master(主人),Slave(奴隶)以及其他 Sentinel 实例发送一个 PING 命令

3、如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel (哨兵)标记为主观下线。

4、如果一个 Master (主人)被标记为主观下线,则正在监视这个 Master 的所有 Sentinel(哨兵) 要以每秒一次的频率确认Master 的确进入了主观下线状态。

5、当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认 Master 的确进入了主观下线状态, 则Master 会被标记为客观下线 。

6、在一般情况下, 每个 Sentinel (哨兵)会以每 10 秒一次的频率向它已知的所有Master,Slave 发送 INFO 命令。

7、当 Master 被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次

8、若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

同类参考:https://mp.weixin.qq.com/s/z2_whw-zlK8wNyNkRM5klg

如何保证缓存与数据库的双写一致性?

1、只要用缓存,就会涉及到缓存与数据库双写,就会有数据一致性的问题。

2、最简单的方式是:读的时候,先读缓存,缓存没有时,再读数据库,然后取出数据后放入缓存,同时返回响应;更新的时候,先删除缓存,再更新数据库。

为什么是删除缓存,而不是更新缓存?

1、很多时候,缓存不单单是数据库中直接取出来的值,也可能是需要查询多个表的数据并进行运算得出的值,
比如在 1 分钟内修改了 20 次、100 次,那么缓存更新 20 次、100 次,但是这个缓存在 1 分钟内只被读取了 1 次,有大量的冷数据。而如果是删除缓存的话,那么在 1 分钟内,这个缓存不过就是重新计算一次而已,开销大幅度降低,用到缓存才去算缓存。

为什么是先删除缓存,再更新数据库?

1、先修改数据库,再删除缓存:如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,就出现了数据不一致。
2、先删除缓存,再修改数据库:如果数据库修改失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致,因为读的时候缓存没有,则读数据库中旧数据,然后更新到缓存中。

Reids 报错:WRONGTYPE Operation against a key holding the wrong kind of value

1、redis 取值时报错:WRONGTYPE Operation against a key holding the wrong kind of value。
这是因为取值的方法类型不对,比如值是 hash 类型,却使用 get key 的字符串取值就会报错。

127.0.0.1:6379> type userSession
hash
127.0.0.1:6379> get userSession
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>

Redis 常见问题 与 常见错误相关推荐

  1. 计算机单机游戏c0005错误,常见错误有哪些_PC单机游戏安装运行常见问题之常见错误解决_玩游戏网...

    小A还是要说,好习惯很重要.建议先按照前面讲的,把常用的必须组件都安装上,如果遇到特殊问题再寻求方法.否则总是缺啥补啥,病急乱投医,终将自误. 其实小A见过不少朋友,折腾半天都进不去游戏,结果搞得玩游 ...

  2. redis消息发布和订阅的运用与常见错误解决方法

    本文Redis所在系统:Linux,详细安装步骤可参考:https://www.cnblogs.com/zhaoyan001/p/6143170.html 本文运用程序所在系统:windows7 一  ...

  3. Linux系统日检常见问题,linux系统维护常见错误记录

    linux系统维护常见错误记录 发布时间:2008-09-17 21:32:34   作者:佚名   我要评论 一:卸载的时候出现的错误: umount /dev/nb1 device is busy ...

  4. linux安装ssh命令失败,Linux常见错误_SSH:Ubuntu16.4配置SSH常见问题及解决办法-Go语言中文社区...

    win10+ubuntu16.4 常见错误1:使用SSH连接Ubuntu出现"Algorithm negotiation failes" 解决办法如下: 1.在ubuntu命令行打 ...

  5. 构建微服务时的三大常见错误

      来自:分布式实验室 公众号,作者:解博 想在网上挨骂,最简单的方法就是写点关于微服务架构的东西.每个人对微服务都有自己的一套见解:无论我们是赞扬还是批评,总会有人跳出来强调"你错了&qu ...

  6. web报告工具FineReport在使用方法和解决方案常见错误遇到(一)

    FineReport在使用方法和解决方案常见错误遇到(一) 这里写的开胃菜.我希望我们能理清自己的问题和解决办法干出来的,Mark一点点.有利于所有. 失败搜索出,如果有一个文件,看看你的度娘那里.看 ...

  7. 小程序开发常见错误及排除方法

    小程序开发过程可能会遇到各种问题,不少人踩坑无数,小程序开发过程中有哪些常见错误,这里有一些比较难以排查的可能性列举,帮助开发者更好的排除错误. 1:官方文档示例代码有误,有时官方文档示例代码也会出现 ...

  8. 【并发编程】map 基本用法和常见错误以及如何实现线程安全的map类型

    博主介绍: – 我是了 凡 微信公众号[了凡银河系]期待你的关注.未来大家一起加油啊~ 前言 哈希表介绍 哈希表(Hash Table)这个数据结构,在Go语言基础的时候就已经涉及过了.实现的就是ke ...

  9. 微信支付常见错误和统一下单错误码详情

    微信支付常见错误和统一下单错误码详情 微信支付常见问题描述及解决方法 微信调用统一下单接口,当result_code=FAIL时,错误代码及错误描述 参考链接: 微信支付常见问题描述及解决方法 序号 ...

  10. 发布自己的开源库到Cocoapods及部分常见错误

    前言 iOS开发中,我们会经常用到cocoapods来添加依赖库,有时候可能也会自己封装一些好用的库,可以发布到cocoapods分享给各位码友使用.本文将详细讲解如何发布自己的开源库到cocoapo ...

最新文章

  1. 基于感知损失的实时风格迁移与超分辨率重建
  2. c语言内涵教程,C语言内涵教程练习3参考答案
  3. ios 多线程 -- NSOperation 常用方法
  4. 同底数幂比较大小方法_知识体系构建:初中数学4大知识点及10大解题方法总结(干货)...
  5. python:数据库连接操作入门
  6. 学习opencv3中文版_给视觉组新生的一点学习建议
  7. 错误记录(一)Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister报错解决办法
  8. 『计算机视觉』Mask-RCNN_推断网络终篇:使用detect方法进行推断
  9. CSS绝对定位元素居中的几种方法
  10. 数据结构常见算法机试题
  11. matlab中std2的公式,STD函数的内部计算公式
  12. 自适应滤波器(Adaptive Filter)(1)--简介
  13. openwrt路由器-timeout while waiting for PADS.
  14. LabVIEW设计程序框图
  15. python 三色球问题
  16. Eclipse生成jar包和导入jar包
  17. 寻找苹果帝国的二当家
  18. 【agc004e】Salvage Robots
  19. 学习《第一行代码》之实战项目-搜杰天气
  20. opencv与PIL互转

热门文章

  1. 建立类成员函数与字符串的对应关系
  2. java连接DB2数据库
  3. SharePoint读取和设置列表栏的内容
  4. oracle rman optimization,关于RMAN中的优化(Optimization)
  5. tomcat依赖导入步骤_将tomcat源码导入eclipse
  6. 光盘显示0字节可用_AT89C2051单片机开发点钞机外接显示屏
  7. 7-7 字符转换 (15 point(s))
  8. 奔腾4 2.4CPU计算机硬件能升级吗,CPU怎么升级啊
  9. mysql var目录很快_mysql数据库实现亿级数据快速清理的方法
  10. 神经网络入门学习-一些基本的概念+不含隐层