redis 基础概念深入学习+图例阐述

整理的Redis思维导图 菜鸟上整理的Redis思维导图,整理了关于Redis的一些服务配置还有数据类型的细节,很详细! 立即下载

1 redis 基础概念学习

1.1 redis数据一致性问题

概念:由于使用redis作为缓存, 一定会引入数据一致性问题。如何保证redis和数据库的一致性问题,是重中之重。
在这里插入图片描述

1.1.1 主动更新策略:

  • Cache Aside Pattern(**胜出**)
    由缓存调用者在更新数据库时主动更新缓存
  • Read/Write Through Pattern
    缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性问题。
  • Write Behind Caching Pattern
    调用者只操作缓存,由其它线程异步的将缓存数据持久化到数据库,保证最终一致。

1.1.2 主动更新策略会引入以下问题,操作缓存和数据库时有三个问题需要考虑

  • 删除缓存还是更新缓存

    • 删除缓存
      • 更新数据库时,将原有缓存删除。下次查询时缓存未命中,会从数据库重新获取,再更新缓存(更新缓存在查询数据阶段)——胜出
      • 因为在上百次写操作时,若没有读操作,每次更新数据库同时更新缓存会造成上百次无效的更新缓存操作;而删除缓存只会删除一次,若存在读操作时,再去更新缓存
    • 更新缓存
      • 更新数据库时,同步更新缓存。(更新缓存在更新数据阶段)
  • 如何保证缓存与数据库的操作的同时成功或失败

    • 若是单机模式或单线程模式,在二者操作放入同一事务即可
    • 若是分布式模式,需要利用TCC等分布式事务方案
  • 先操作缓存还是先操作数据库
    - 在上述条件下: 缓存未同步情况,只能是缓存未命中,在数据库更新前查询,写入缓存;最终都会更新数据库,再此只讨论数据库更新了,缓存却未更新的情况

    以下图例:左图是正常流程,右图是发生线程安全问题流程

    • 先删除缓存,在操作数据库
      在这里插入图片描述
      在此情况下,只能是在删除存后,另一线程发生读操作,且查询数据库写入缓存,由于数据库操作耗时较长,查询缓存并写入缓存耗时短,该情况**发生概率较大**

    • 先操作数据库,再删除缓存
      在这里插入图片描述在此情况,只有当线程1发生读操作时,刚好该key TTL到期,然后线程2更新数据库和更新缓存飞速执行,最后线程1写入缓存,方可导致。这情况发生概率较小,需同时满足以下三种情况:

      (1)刚好遇到key TTL,否则,缓存命中直接return

      (2)更新数据库+删除缓存的耗时 < 写入缓存耗时 (一般数据库操作耗时较长,远大于写缓存)

      (3)写缓存要在删除缓存之后,否则,后续线程2会再次将缓存删除,会重新触发更新缓存操作

    总结: 优先考虑先更新数据库再删除缓存的逻辑。

1.2 缓存穿透问题

概念:redis和数据库中都不存在,导致请求都会直接打到数据库

解决方案:

  • 缓存null值——当数据库不存在时,向redis缓存null值
    • 优点:实现简单、方便维护
    • 缺点:
      • 当用户随意输入大量无效请求,数据库未存在,都会缓存null值(额外内存消耗)
      • 短期内数据不一致问题(可设置较短的TTL)
  • 布隆过滤器
    • TODO

1.3 缓存雪崩问题

概念:当redis中大量key同时出现TTL或服务器宕机现象,导致该部分请求直接打到数据库,造成资源拥挤。

解决方案:

  • 为key设置随机的TTL(因为是key同时失效导致,为key设置一段区间的随机值)
  • 搭建集群模式(redis哨兵监控,主从选举)
  • 给业务添加降级限流策略(如服务器宕机,将该部分请求直接拒绝,防止大量请求打到数据库)
  • 给业务添加多级缓存(浏览器缓存(一般静态资源)-> nginx缓存 -> redis缓存 -> jvm缓存 (应用层缓存?例如使用HashMap?)-> 数据库)

1.4 缓存击穿问题

概念:也称为热点key问题,当访问redis高并发key时并且热点key重建业务耗时较长,该部分请求打到数据,导致资源拥挤。

有时重建缓存需要在查询数据库数据基础上,增加数据处理逻辑,若耗时较长,每当一个读请求过来->发现缓存未命中->尝试重建缓存。此时所有的请求都直接打到数据库,都会尝试重建缓存。
在这里插入图片描述

解决方案:

  • 互斥锁

    以下用时序图来阐述
    在这里插入图片描述
    在上述图中,线程1查询数据,缓存未命中后尝试获取锁,获取锁成功,进入查找数据库及重建缓存阶段,最终释放锁。

    而其他线程来了读操作,比如线程2查询数据,尝试获取锁,获取锁失败,就会让该线程sleep(time),休眠后再重试查询数据,直到线程1释放锁(代表缓存重建成功),此时线程2查询数据时,缓存命中,直接return。

  • 逻辑过期

    keyvalue
    cache:order:1{id:1,expire:152142133}

    此时的expire是逻辑过期时间:比如是服务器启动时间 + 30min 的时间戳

    在这里插入图片描述
    在此情况下,缓存是不会被删除,也没有设置TTL,所以缓存一定命中。但是要检测逻辑是否过期,
    left = currentTimeStamp - expire > 30 * 60 * 1000

    线程1查询数据,若是逻辑缓存过期,则获取锁并开启新的线程(线程2)。此时线程1 直接return old data。

    线程2查找数据库,重建缓存并更新逻辑过期时间,写入缓存,最后释放锁。

    线程3倘若在线程2释放锁之前,进入读操作,查找数据缓存命中,判断逻辑是否过期,若过期,则尝试获取锁,获取成功的话,则代表线程2已经更新缓存,此时获取的就是新缓存。

    线程4进入读操作,判断缓存是否过期,未过期则直接return。

Xilinx系ZYNQ学习笔记(一)Vivado使用说明 vivado使用学习 阅读详情

相关推荐

Verilog仿真必备:FSDB dump命令全解析与实战配置指南

本文深入解析了Verilog仿真中FSDB波形记录的核心命令与实战配置技巧。针对大规模SoC验证场景,详细介绍了如何通过$fsdbDumpvars、$fsdbDumpfile等命令实现信号精准捕获、文件体积控制和动态启停,并提供了智能化的分层dump策略,帮助工程师在保证调试信息完整性的同时,大幅提升验证效率并有效管理波形数据。

cnn8visionary的博客 349

图解Redis

—1—什么是 Redis?Redis(REmote DIctionary Service)是一个开源的键值对数据库服务器。Redis 更准确的描述是一个数据结构服务器。Redis 的这种特殊性质让它在开发人员中很受欢迎。Redis不是通过迭代或者排序方式处理数据,而是一开始就按照数据结构方式组织。早期,它的使用很像 Memcached,但随着 Redis 的改进,它在许多其他用例中变得可行,包...

极客重生 586

展会客流统计的客流统计系统,WiFi客流每时每客

一般展会的举行时间都在3-7天之间,展会作为市场部门一项重要工作,一直以来没有一项有效的工具能够提供数据支持。 展会最重要的是通过活动和产品来吸引参展者的参观,如何统计展会期间的客流量呢?如何通过将数据转化成为活动数据的支撑呢? 目前成熟的解决方案有,视频客流统计、WiFi客流统计、红外线客流统计等方式。由于展会通常的时间都比较短,视频、红外线客流统计采购及安装价格都比较高,需

isentech的博客 3995

个人《Redis》学习思维导图

zege2000的博客 601

实战篇【2】-H3C防火墙开局基础配置

本篇文章为“H3C防火墙开局基础配置”,主要涵盖配置管理地址、聚合端口、安全区域、安全策略、静态路由、ACL,WEB和SSH远程管理、Console、SNMP、NTP时钟、日志主机等内容,对比交换机配置开局,增加两处配置,安全区域和安全策略。方便调试人员远程管理、调试。

weixin_47402139的博客 1万+

LM Studio Bionic:本地AI智能体从部署到实战完整指南

AI智能体作为能够自主规划、执行多步任务的人工智能系统,其核心原理在于结合大语言模型的推理能力与工具调用机制。通过状态保持和任务分解算法,智能体实现了从单次问答到持续协作的技术跃迁。在工程实践中,这种架构显著降低了复杂任务自动化的门槛,特别适用于数据敏感场景和定制化需求。以Tesla V100等专业硬件为例,本地部署能充分发挥其大显存优势,支持更高精度的模型量化格式。在实际应用层面,智能体可无缝集成到代码审查、文档生成等开发工作流中,而LM Studio Bionic通过统一界面整合了模型服务、任务规划器等

weixin_29053695的博客 657

【分布式利器:Redis】Redis基本原理详解:数据模型、核心特性与实战要点

Redis的成功源于“极致性能+灵活数据结构+完善的分布式支持性能上,内存操作+单线程+IO多路复用,支撑万级QPS,满足高并发场景;功能上,8种数据结构覆盖缓存、计数、队列等多样化需求,开箱即用;可靠性上,持久化+主从复制+哨兵+集群,从单机到分布式场景都能稳定运行。无论是中小团队的简单缓存需求,还是大型企业的高可用分布式系统,Redis都能通过灵活的配置和特性,成为架构中的“关键一环”。互动话题:你在项目中用Redis解决过哪些棘手问题?遇到过哪些印象深刻的坑?欢迎在评论区分享你的实战经验~

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1988

【笔记软件obsidian】从入门到精通

目录 一、前言 二、下载及安装 三、【选修】ios用户如何通过iCloud进行三平台同步 四、基本Markdown语法 五、【选修】插件的下载及安装方式 六、

patrick的博客 9万+

redis学习记录(5)redis缓存

缓存的使用与设计 加入缓存的流程 一、缓存的收益与成本 1、收益 加速读写 因为缓存通常都是全内存的(例如Redis、 Memcache) , 而存储层通常读写性能不够强悍(例如MySQL) , 通过缓存的使用可以有效地加速读写, 优化用户体验。 降低后端负载 帮助后端减少访问量和复杂计算(例如很复杂的SQL语句) , 在很大程度降低了后端的负载。...

__tian__的博客 485

跨 Agent 语义沟通机制构建:共享知识图谱与语义对齐方法

在具身智能与多智能体系统协同日益复杂化的背景下,跨 Agent 的语义沟通能力成为任务完成效率和系统鲁棒性提升的关键技术路径。本文系统分析了当前业界在共享知识图谱、语义嵌入对齐、语义意图建模与跨模态语义通信协议设计方面的实践经验,深入讲解如何在 Habitat-MARL 与 Isaac-MARL 等平台中,基于实体-关系结构、语义分布表示与任务上下文,构建具备理解、共享、协作能力的多 Agent 语义系统。文章以工程实战为主,覆盖图谱构建、语义嵌入同步、对齐模型部署、通信接口集成等多个核心模块,结合真实应用

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1293

ACS运动控制器编程 怎么学习

本文介绍了ACS运动控制器编程的完整学习路线,从零基础到实战应用。ACS是以色列高端多轴运动控制平台,适用于自动化设备、精密平台等项目。学习路径包括:1)安装官方软件SPiiPlusControlSuite;2)掌握轴、运动模式和指令三个核心概念;3)学习10个基础指令;4)编写首个运动程序;5)结合C#进行联合编程。进阶内容包括多轴同步、电子凸轮等工业应用,并推荐官方手册作为主要学习资源。通过7天的系统学习,即可掌握单轴运动控制,结合C#实现工业级设备开发。

StevenChen的博客 1327

python 画图 图例位置 图正上方_图例在散景图中的位置 - python

有谁知道如何在图的之外的bokeh 中携带图例?我唯一能做的就是在以下位置选择一个位置:top_right, top_left, bottom_left or bottom_right使用:legend()[0].orientation = "bottom_left"当我尝试其他选项时,出现错误消息:ValueError: invalid value for orientation: 'outsi...

weixin_39656435的博客 993

华为MetaERP月结加速方案:并行关账技术深度解析

【摘要】华为MetaERP并行关账技术通过创新架构设计,将传统串行月结流程(8-12小时)优化为并行执行(2-4小时)。关键技术包括:1)基于DAG引擎的任务依赖分析,实现模块/子任务三级并行;2)Saga模式分布式事务保障数据一致性;3)动态资源分配算法提升CPU利用率至60-80%。实施效果显示月结时间缩短70%,成功率提升至99.8%,错误恢复时间减少75%。该方案为大型企业ERP系统提供了高效的月结加速方案,未来还将结合AI调度与混合云扩展持续优化。

金牌架构师 1441

Redis基础数据结构详解

String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

weixin_46781683的博客 1408

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Redis 学习总结

1 Redis 介绍 什么是redis Redis是用C语言开发的一个开源的高性能键值对(key-value)内存数据库。 它提供五种数据类型来存储值:字符串类型(String)、散列类型(hash)、列表类型(list)、集合类型(set)、有序集合类型(zset) 它是一种NoSQL数据库 什么是NoSQL NoSQL,即Not-Only SQL(不仅仅是SQL),泛指非关...

qq_38676077的博客 265

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[redis学习笔记]redis在linux中下载安装使用及介绍

什么是Redis? Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下: 字符串类型 散列类型 列表类型 集合类型 有序集合类型。 redis的应用场景 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用与缓存功能) 分布式集群架构中的sess...

qq_40790042的博客 210

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

redis学习--安装

介绍了如何在云服务器安装redis,一是手动安装;二是采用docker安装

Vibugs的博客 1281

Redis事件驱动框架(中):Redis实现了Reactor模型吗?

首先,我们要明确一点,就是在Redis事件驱动框架的实现当中,事件的数据结构是关联事件类型和事件处理函数的关键要素。IO事件和时间事件,分别对应了客户端发送的网络请求和Redis自身的周期性操作。这也就是说,不同类型事件的数据结构定义是不一样的。不过,由于这节课我们主要关注的是事件框架的整体设计与实现,所以对于不同类型事件的差异和具体处理,我会在下节课给你详细介绍。那么在今天的课程中,为了让你能够理解事件数据结构对框架的作用,我就以IO事件aeFileEvent为例,给你介绍下它的数据结构定义。

qq_33240556的博客 1181

Redis深入学习(一)Redis简介及安装

1. Redis简介   Redis(Remote Dictionary Server)远程字典服务器,是用C语言开发的一个开源的高性能的键值对(key-value)内存数据库。   Redis提供了8种数据类型来存储值(5种常用,3种不常用): 常用的数据类型有: 字符串类型(String) 散列类型(List) 列表类型(hash) 集合类型(list) 有序集合类型(sortedset 也叫做 zset) 不常用的数据类型有: 位图类型(bitmap) 地理位置类型(geo) 数据流类型(ste

qq_37551917的博客 936

Redis数据类型大全:“5种基础”数据类型+“3种特殊”数据类型

关于深入学习“Redis”,有整理相关全套的Redis面试高频问题(附解析)、引导学习的知识路线大纲(手绘xmind版)、手写笔记pdf等,如需一起学习→戳此即可,或者直接扫描下方 一、“5种基础”数据类型 Redis 有望所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash 1.1 Redis数据结构简介 Redis基础文章非常多,关于基础数据结构类型,我推荐你先看下官方.

mifffy_java的博客 584

Redis学习(4)——跳跃表(skiplist)

一,何为跳跃表 跳跃表(skiplist)是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。它的效率可以媲美平衡树,跳跃表的平均复杂度O(logN)最坏情况复杂度O(N),并且其原理和代码都要比平衡树更加简单,因此很多地方多用跳跃表代替平衡树。 二,在Redis中的应用 1,Redis使用跳跃表作为有序集合键的底层实现的数据结构之一。 1)当有...

H1517043456的博客 850

Redis哨兵机制原理浅析

一、前言 上一篇文章Redis主从复制原理中简要地说明了主从复制的一个基本原理,包含全量复制、复制积压缓冲区与增量复制等内容,有兴趣的同学可以先看下。 利用主从复制,可以实现读写分离、数据备份等功能。但如果主库宕机后,需要运维人员手动地将一个从库提升为新主库,并将其他从库slaveof新主库,以此来实现故障恢复。 因此,主从模式的一个缺点,就在于无法实现自动化地故障恢复。Redis后来引入了哨兵机制,哨兵机制大大提升了系统的高可用性。 二、什么是哨兵 哨兵,就是站岗放哨的,时刻监控周围的一举一动

阳阳的博客 2962

网络协议学习资源

【书籍】《网络是怎样连接的》豆瓣 以探索的形式,从在浏览器中输入网址开始,追踪到显示出网页内容的整个过程。图文并茂地讲解了网络的全貌,并重点介绍了实际的网络设备和软件是如何工作的。非常适合入门。 【书籍】《HTTP权威指南》豆瓣 想了解 HTTP 协议,就看它吧。 这三本是经典中经典,包含大量图例,书有点旧了,但不影响理解,相对难一些: 【书籍】《TCP/IP详解 卷1:协议》(第一版经典、第二版翻译不行)豆瓣 一本完整而详细的 TCP/IP 协议指南。 【书籍】《TC...

ConstXiong 450

Redis:性能风险之定位及解决Redis变慢

实际的生产环境中不建议开启大页机制,因为redis在fork子进程生成快照以及重写AOF日志时,主线程仍然可以接收写请求,因为采取了写时复制的机制,如果开启了大页机制,则可能对100k的数据进行写操作,此时需要复制一页也就是2MB的内存,且此时会阻塞主进程。**对redis的影响:**当Redis和其他对内存需求大的应用一起运行时,redis是访问内存才能完成,一旦发生swap,redis的请求操作需要等待磁盘的读写操作执行完成才能继续,并且与fsync不同的是,swap影响的是redis的主线程。

张豫湘的博客 1781

Redis 快速入门(后端学习笔记)

基数就是不重复的元素。

2301_79909038的博客 753

Redis中的Reactor 模型的工作机制

Redis中的Reactor 模型的工作机制 好,首先,我们来看看什么是 Reactor 模型。实际上,Reactor 模型就是网络服务器端用来处理高并发网络 IO 请求的一种编程模型。我把这个模型的特征用两个“三”来总结,也就是: 三类处理事件,即连接事件、写事件、读事件; 三个关键角色,即 reactor、acceptor、handler。 那么,Reactor 模型是如何基于这三类事件和三个角色来处理高并发请求的呢?下面我们就来具体了解下。 事件类型与关键角色 我们先来看看这三类事件和 React

Lee notes 1809
上一篇: windows+Reids可视化工具RESP下载
下一篇: Redisson 源码解析系列一:分布式锁RedissonLock可重入机制+锁续约解析
Musclewl
博客等级 码龄9年 215粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值