热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redis学习笔记:基础

1.nosql有哪些,各自的优点

  • Memcached:多核操作,单实例QPS极高,但只支持key-value结构存储,无法持久化,不能备份,不能同步,仅内存操作。
  • MongDb:文档型数据库,存放xml,json。可以同步,持久化。
  • redis:
  1. 支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)、Pub/Sub、BloomFilter(布隆过滤器)
  2. 支持AOF,RDB持久化到硬盘
  3. 支持主从同步

2.redis分布式锁
先拿setnx来争取锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记释放。
如果在setnx之后,expire执行之前程序crash了。set指令有复杂的操作可以同时把setnx、expire合并到一条命令执行。

3.如何查找某固定前缀开头的信息?
keys指令

4.如果redis正在给线上业务提供服务,这个时候keys会出现什么问题?

  1. redis是单线程的,keys指令会导致现场阻塞一段时间,线上的服务会停顿,直到指令结束。
  2. 使用scan(增量式迭代)指令,scan指令可以无阻塞提取制定模式的keys列表,有几率存在重复,花费时间比keys长。

5.redis异步队列

  1. 一般使用list结构作为队列,rpush生产信息,lpop消费信息。lpop没有消息时,适当sleep或者blpop阻塞一会再重试。
  2. 使用pub/sub主题订阅模式可以实现生产一次消费多次。

6.pub/sub缺点
在消费者下线时会丢失生产数据,可以使用rocketmq

7.redis如何实现延时队列
使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产信息,消费者用zrangebyscore指令获取N秒前的数据进行轮询。
redis学习笔记:基础

8.redis如何持久化?
RDB做镜像全持久化:会比较耗时,在服务器宕机时会丢失大量数据,就比如要保存一整个数据库的文件,它是一个一个的文件,在某一个段的数据上,它是完整的。
AOF做增量持久化:类似于每次的操作日志比如mysql的binlog。

redis本身机制是AOF持久化开启时会首先加载AOF文件;AOF关闭或不存在时才会加载RDB文件,加载完成后启动成功。

9.如果机器突然宕机了会怎么办?
取决于AOF日志的sync属性配置,如果不要求性能,可以每写一条指令就sync一下磁盘,不会丢数据。
如果在高性能下,一般使用定时sync,比如1s1次,最多只会丢失1s的数据。

10.RDB原理是怎么实现的
fork:redis通过创建子进程来进行RDB操作,
cow(copy on write):子进程创建完后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开

11.pipeline(管道模式)的好处
pipeline:因为redis是单线程的,请求只能按部就班一次一次来,这个可以提供多次请求无需等待,直接返回

可以将多次io往返时间缩短为一次,前提是pipeline执行的指令之间没有因果相关性。redis-benchmark压测时可以发现影响redis的QPS峰值的重要因素是pipeline批次指令的数目。
redis学习笔记:基础

12.redis 同步机制
redis可以做主从同步,从从同步。

  1. 第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer。
  2. 待完成后将RDB文件全量同步到复制节点中,复制节点接受完RDB文件后将RDB镜像加载到缓存中。
  3. 复制节点RDB加载完成后再通知主节点将近期修改的操作记录同步到复制节点进行重放。
  4. 后续的增量数据可以通过AOF日志同步。

13.redis集群高可用怎么保证?集群的原理是什么?

  1. redis Sentinal:高可用,在master宕机的时候回自动将slave升为master,继续提供服务。若之前的master恢复后不会变成master,而是充当slave。
  2. redis Cluster:扩展性,在单个redis内存不足时,使用cluster进行分片存储,即redis有16384个卡槽,redis会通过存储的key计算出需要存储在哪个段的槽中。

推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 深入理解Redis中的字典实现
    本文详细介绍了Redis中字典的实现机制,包括其底层数据结构、哈希表与哈希节点的关系、元素添加方法及rehash操作的具体流程。 ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • Spring 切面配置中的切点表达式详解
    本文介绍了如何在Spring框架中使用AspectJ风格的切面配置,详细解释了切点表达式的语法和常见示例,帮助开发者更好地理解和应用Spring AOP。 ... [详细]
  • 探讨Redis的最佳应用场景
    本文将深入探讨Redis在不同场景下的最佳应用,包括其优势和适用范围。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 从零开始编译Linux系统:第16章 全新起点
    本章将详细介绍如何从零开始编译一套完整的Linux系统,涵盖关键组件如glibc库的介绍及其重要性。通过本文,读者将了解从源代码构建Linux系统的全过程。 ... [详细]
  • 事件是程序各部分之间的一种通信方式,也是异步编程的一种实现形式。本文将详细介绍EventTarget接口及其相关方法,以及如何使用监听函数处理事件。 ... [详细]
  • 如何在 Python 列表中添加元素 [Python 基础]
    本文介绍了 Python 中常用的三种方法来向列表中添加元素:`append()`、`extend()` 和 `insert()`。这些方法分别适用于不同的场景,帮助开发者灵活地管理列表数据。 ... [详细]
  • iOS 不定参数 详解 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
author-avatar
fuchen201101
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有