redis

字符串:类似vector,有空闲的空间 capacity和len,当长度小于1M时,每次扩容加倍,大于1M,每次扩容1M,最大512M
hash: 相当于c++ unordered_map,当需要rehash时,不是一次性,而是循序渐进式将旧hash的内容一点点迁移到新的hash结构中(定时任务,以及hash的子指令)
set:unordered_set 值具有唯一性
zset: 里面的值根据score值排序,使用跳跃列表,(还需要一个hash结构来存储value和score的对应关系)
  跳跃列表
  L2 25%
  L1 50%
  L0 100%
    排好序,二分查找法,查找到合适的地方进行插入
list:quicklist ziplistziplistziplist(多个连续的空间)
    redis的列表结构常用作异步队列,将需要延后处理的任务结构体序列化成字符串进redis的列表,另一个列表从这个列表轮询数据处理,不能保证100%的可靠性
压缩列表ziplist:小对象压缩存储,zset和hash容器对象在元素个数较少的时候,采用ziplist进行存储,是一块连续的内存,元素之间紧挨着存储
    当元素增多,会升级成标准结构

位图:不是特殊的数据结构,内容就是普通的字符串,byte数组,可以使用get/set直接获取和设置整个位图的内容,也可以使用
    getbit/setbit将byte数组看成位数组来处理

redis分布式锁:setnx和expire组合在一起形成一个原子指令,是分布式锁的奥义,原子操作:不会被线程调度打断的操作,中间不会有context switch的线程切换
    不能处理较长时间的业务逻辑,set的时候设置一个随机数,然后删除的时候,判断是否跟这个随机数一致

延时队列:
    redis的zset实现,消息序列化到zset的value,到期时间作为score,消费者根据到期时间进行处理

HyperLogLog:提供不精确的去重计数方案,虽然不精确,但也不是非常不精确,误差率0.81%,元素少时,占用少,多时会占用12k的空间,相对于set四两拨千斤,但不能确定某个值是否已经存在
布隆过滤器:判断元素是否在里面,有误判。可以装入大量的数据,如果使用set空间太大了,可以理解为不怎么精确的set结构

限流{
简单限流
漏斗限流
令牌桶
}

GeoHash:将二维的经纬度数据映射到一维的整数,所有的元素都挂在一条线上,然后取该点附近的点。等于是将地球看成一个棋盘,二分法。放到zset(skiplist),比较简单得到附近的元素
    将其想象成zset结构,将所有的数据放到zset中,会很大,需要单独部署,按照国家等区分,减小单个key的数量

keys: 会阻塞线程  scan:不会阻塞线程

指令队列:redis将每个客户端套接字都关联一个指令队列,排队顺序处理。响应队列:将查询结果放到队列中,注册写事件。

持久化:
  快照:rdb,内存数据二进制序列化形式 aof:内存数据的修改的指令记录文本
  rdb:fork子进程,子进程持久化,父进程负责写,cow(写时复制页面修改),每个页面4k大小,从节点来持久化,主节点提供访问
  混合持久化:aof是持久化开始,到持久化结束这段时间的aof日志。在redis重启时,先加载rdb,然后重放aof日志

管道:
  客户端类似合并多条读或者多条写,能够大幅提升效率

pub/sub:
    redis消息队列不足:不支持消息多播
    但是有缺点,不能持久化
    生产者--->通道(channel){订阅者,订阅者。。。}

主从同步
CAP
  C:一致性
  A:可用性
  P:分区容忍性
    网络分区发生时,一致性和可用性两难全
    redis满足最终一致性,
1.增量同步
    主节点将修改性指令记录在本地内存buffer中,然后异步的将buffer中的指令同步到从节点,从节点一边同步指令,一边向主机点反馈同步的地点
    buffer是环形数组,如果满了,从头覆盖内容
2.快照同步
    如果主从长时间断开,则会快照同步,主库bgsave,然后将快照内容传递给从节点,从节点执行全量加载,需要设置正确的buffer大小,避免快照同步的死循环
    从节点刚刚假如集群时,会先执行一次快照同步,然后执行增量同步
3.主从复制是分布式的基础,如果只当缓存用无需,如果用到了持久化功能,就必须认真对待主从同步,是数据安全的保障

sentinel:
    当故障发生时,自动的进行主从切换
    redis-sentinel --- redis-sentinel --- redis-sentinel(3-5个)
        master master master
        slave slave slave
    c->redis-sentinel(返回master地址) 客户端来连接集群时,先连接sentinel,通过sentinel来查询主节点的地址,然后连接主节点进行数据交互
    连接池建立新连接时,会去查询主库地址,然后跟内存中的主库地址比对,如果变更了,就断开所有连接

codis
    集群方案之一
    1024个slot
    key->crc32->%1024 的值就是key对应的槽位
    每个槽位,对应唯一的redis实例

cluster
    官方的redis集群方案
    去中心化
    16384slot
    redisnode(slot) -- redisnode(slot) -- redisnode(slot)
    key->crc32->%16384 的值就是key对应的槽位

迁移工具:redis_trib
    从源节点获取内容->存到目标节点->从源节点删除

stream
    是可持久化的消息队列
    stream消息模型借鉴了kafka的消息分组的概念,弥补了pub/sub不能持久化的缺点,kafka可以分partition而redis不行,

info
    了解redis的运行状态,内部一系列运行参数
    info stats
    monitor:快速观察哪些key访问比较频繁
    info client:redis连接了多少客户端 client list
    info memory

    复制缓冲区
    info replication
    info stats|grep sync

分布式锁

过期策略
    redis将设置了过期的key放入一个独立的字典中,以后定时遍历这个字典来删除,还有惰性删除,惰性删除就是在访问key的时候,发现过期了就立马删除
    定时删除是集中处理,惰性删除是零散处理
    给过期时间加一个随机值,防止在同一个时间过期
    从库同步异步删除

LRU
    懒惰处理:当redis执行写操作时,发现内存超出maxmemory,执行一次LRU淘汰算法
    volatile-xxx:只会针对带过期时间的key进行淘汰
    allkeys-xxx:会对多有的key进行淘汰

懒惰删除 lazy free
    引入unlink 能对删除进行懒惰处理,对给后台线程异步回收内存

字典:
    1.hash结构
rax:
    zset按照score排序,rax按照key排序,类似与英语字典,这样可以快速检索单词,并且可以某个前缀开头的单词

Original: https://www.cnblogs.com/zzyoucan/p/13752581.html
Author: zzyoucan
Title: redis

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529258/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 剑指offer计划26(字符串中等)—java

    1.1、题目1 剑指 Offer 20. 表示数值的字符串 1.2、解法 这题表示直接上大佬的题解把。。。。代码太长了。有限状态自动机。对状态机一无所知的我一脸懵 1.3、代码 c…

    Linux 2023年6月11日
    091
  • shell 同时执行多任务下载视频

    本文为博主原创,转载请注明出处: shell 脚本不支持多线程,但我们需要用shell 脚本同时跑多个任务时怎么让这些任务并发同时进行,可以采用在每个任务 后面 添加一个 &amp…

    Linux 2023年6月14日
    0100
  • 1. 文件与I/O

    内核是如何处理系统调用 每个系统调用被赋予了一个系统调用号 在i386平台上,执行一个系统调用是通过int 0X80指令完成的 eax存放系统的调用号 ebx,ecx,edx,es…

    Linux 2023年6月6日
    082
  • 超算TOP500中的Linux占比——Operating System&Operating System Family

    2022-09-18-21:28:59 老师作业说明: TOP500中国超算占比,LINUX系统占比 说明:当时使用的是bing搜索,中国超算占比其实澎湃新闻什么的都有介绍,但是我…

    Linux 2023年6月6日
    093
  • Linux-系统启动与MBR扇区修复

    1.系统启动过程 1.1 MBR扇区 1.2 MBR扇区的备份与还原 1.3 修复MBR 1.3.1 dd备份MBR信息 1.3.2 光驱启动修复 1.4 grub故障修复 1.系…

    Linux 2023年5月27日
    0119
  • 驱动写用户态应用程序的标准输出卡死

    问题描述 驱动写用户态应用程序的标准输出,pipe卡住,导致驱动不能正常继续工作注:感谢木三的解决方法. 问题解决 lsof 查看pipe管道 #lsof python3 2581…

    Linux 2023年6月6日
    095
  • 30道关于linux的基础命令小题,先练练手

    1.修改主机名为yuanlai0224命令是: 2.切换⽬录到/yuchao01/data/,再创建脚本/my_website/scripts/start.sh。 绝对路径、相对路…

    Linux 2023年5月27日
    096
  • Docker容器网络

    Docker容器网络 1、Docker容器网络 Docker在安装后自动提供3种网络,可以使用`docker network ls命令查看 [root@localhost ~]# …

    Linux 2023年6月7日
    091
  • Nginx基础入门篇(2)—编译参数介绍

    查看命令 nginx -V nginx version: nginx/1.22.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (…

    Linux 2023年6月6日
    0126
  • WEB自动化-01-Cypress 介绍

    Cypress 介绍 1.1 Cypress 简介 Cypress是一款基于 JavaScript的下一代前端测试工具。可以对浏览器中运行的任何内容进行快速、简单和可靠的测试。Cy…

    Linux 2023年6月7日
    088
  • short, int, long, long long各个类型的范围

    类型名称 字节数 取值范围 signed char 1 -2^7 ~ 2^7-1 -128~+127 short int 2 -2^14 ~ 2^14-1 -32768~+3276…

    Linux 2023年6月8日
    079
  • Springboot Mybatis 集成 Redis

    添加 Redis 依赖 $xslt</p> <p>org.springframework.boot spring-boot-starter-data-red…

    Linux 2023年5月28日
    085
  • oracle 怎么查看用户对应的表空间

    oracle 怎么查看用户对应的表空间? 查询用户: 查看数据库里面所有用户,前提是你是有 dba 权限的帐号,如 sys,system: select * from dba_us…

    Linux 2023年6月6日
    0104
  • FusionCompute制作Linux虚拟机模板

    创建虚拟机 创建虚拟机下一步这里实验就创建红帽7.4选择存储磁盘精简创建先在存储上传红帽镜像挂载镜像VNC登录安装安装完成配置yum源安装bzip*(因为最小化安装没有bzip程序…

    Linux 2023年6月8日
    0129
  • Lvs

    Lvs Lvs Lvs简介 体系结构 LVS管理工具 配置 lvs-nat 模式的 httpd 负载集群—http 配置lvs-nat模式的httpd负载集群&#821…

    Linux 2023年6月6日
    0116
  • Vue3 封装 Element Plus Menu 无限级菜单组件

    本文分别使用 SFC(模板方式)和 tsx 方式对 Element Plus el-menu 组件进行二次封装,实现配置化的菜单,有了配置化的菜单,后续便可以根据路由动态渲染菜单。…

    Linux 2023年6月7日
    0137
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球