热门标签 | 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计算出需要存储在哪个段的槽中。

推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
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社区 版权所有