当前位置:   article > 正文

Redis作为数据库和缓存的区别_.redis的作缓存和redis 作数据库有什么样的不同

.redis的作缓存和redis 作数据库有什么样的不同

缓存:数据不重要,不是全量数据,应该随着访问变化,存放热数据

1. redis作为缓存,redis中的数据怎么能随着业务变化,只保留热数据,因为内存大小有限,这是缓存的瓶颈

  • 根据业务逻辑确定key的有效期
  • 业务运转,内存是有限的,随着访问的变化,应该淘汰掉冷数据(缓存回收)

2. 缓存回收

  • LFU:根据使用次数,回收使用次数少的
  • LRU:根据使用时间,回收最久没有访问的

3. 倒计时有效期

  • 设置倒计时有效期,不会随着访问延长
  • 发生写入,会剔除有效期,变成长期有效

4. 定时有效期:固定时间失效

5. 过期判定:稍微牺牲一下内存,保证性能

  • 被动:过期后如果没有被访问则不会回收,当有访问时返回已过期并回收
  • 主动:每10秒轮询测试随机的20个key是否过期,过期则回收,如果多余25%过期则重复检测

数据库:数据决定不能丢,数据+持久性,和mysql数据库要使用消息队列来解决数据一致性


存储层持久两种方式:RDB(快照/副本);AOF(日志)

1. 单机持久化

  • 时点性:通过管道:fork()+copyOnWrite实现

2. 管道

  • 衔接,前一个命令的输出作为后一个命令的输入
  • 管道会触发创建子进程
  • 父子进程会进行数据隔离
  • 父进程可以让子进程看见自己的数据
  • export的环境变量,子进程的修改不会影响父进程
  • export的环境变量,父进程的修改也不会影响子进程
  • 使用 fork() 给创建子进程,通过指针指向主进程的虚拟地址指向的物理地址,使用copyOnWrite(写时复制),只有发生更新时才会为进程复制新的物理地址并指向它

3. RDB

  • 时点性
  • 手动调用 save:阻塞式持久化,redis在持久化时不对外提供服务,持久化结束再开放对外服务
  • 手动调用 bgsave:异步非阻塞持久化,使用fork()+copyOnWrite
  • 配置文件中使用 save 创建 bgsave 规则
  • 弊端:不支持拉链,只有一个dump.rdb,需要定时策略,每天把文件拷出去加上时间;容易丢失数据,两个时点之间挂机的话窗口数据容易丢失;
  • 优点:类似Java中的序列化,恢复速度快

4. AOF

  • redis的写操作记录到文件中,丢失数据少;
  • redis可以RDB和AOF同时开启,但是只会用AOF做恢复,4.0以后AOF包含RDB全量,增加记录新的写操作,恢复时先RDB再读AOF
  • 弊端:体量无限大,恢复慢
  • 4.0前:重写,删除抵消命令,合并重复命令,最终变成一个纯指令的日志文件
  • 4.0后:重写,将老的数据RDB到aof文件中,将增量以AOF的方式加到日志中。是一个混合体,利用RDB的快和AOF的全量
  • redis是内存数据库,会触发IO拖慢速度,可以调整级别(NO;ALWAYS;everysec)
  • 如果执行了 bgrewriteaof 就会只保留当前的状态,历史rdb和历史操作记录就都融合了,没办法再恢复了
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/157404
推荐阅读
相关标签
  

闽ICP备14008679号