redis
大神,快来碗里
专注于Java相关技术
展开
-
Redis protocol (redis通信协议)
1.Redis网络通信协议Redis底层网络通信协议其实是通过TCP来完成的。2.Redis通信协议Redis的通信协议首先是以行来划分,每行以\r\n行结束。每一行都有一个消息头,消息头共分为5种分别如下:(+) 表示一个正确的状态信息,具体信息是当前行+后面的字符。(-) 表示一个错误信息,具体信息是当前行-后面的字符。(*) 表示消息体总共有多少行,不包括当前行,*后面是具体的行...原创 2019-08-22 14:37:41 · 11573 阅读 · 1 评论 -
Redis知识梳理(20) [ Stream ]
Redis5.0 被作者 Antirez 突然放了出来,增加了很多新的特色功能。而 Redis5.0 最大的新特性就是多出了一个数据结构 Stream,它是一个新的强大的 支持多播的可持久化的消息队列,作者坦言 Redis Stream 狠狠地借鉴了 Kafka 的设计Redis Stream 的结构如上图所示,它有一个消息链表,将所有加入的消息都串 起来,每个消息都有一个唯一的 ID 和对...原创 2019-05-09 16:26:23 · 10983 阅读 · 1 评论 -
Redis知识梳理(19) [ Codis ]
在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘。首先体现在内存 上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同 步时全量同步时间过长,在实例重启恢复时也会消耗很长的数据加载时间,特别是 在云环境下,单个实例内存大小往往都是受限的。其次体现在 CPU 的利用率上,单 个 Redis 实例只能利用单个核心,这单个核心要完成海量数据的存取和管理工...原创 2019-05-09 16:25:09 · 10715 阅读 · 0 评论 -
Redis知识梳理(18) [ Sentinel 哨兵模式 ]
Redis 官方提供了这样一种方案 —— Redis Sentinel(哨兵)当故障发生时可以自动进行从 主切换,程序可以不用重启我们可以将 Redis Sentinel 集群看成是一个 ZooKeeper 集群,它是集群高可用 的心脏,它一般是由 3~5 个节点组成,这样挂了个别节点集群还可以正常运转。它负责持续监控主从节点的健康,当主节点挂掉时,自动选择一个最优的从节点 切换为主节点...原创 2019-05-09 16:23:51 · 10681 阅读 · 0 评论 -
Redis知识梳理(17) [ 主从同步 ]
当 master 挂掉的时候,运维让从库过来接管,服务就可以继续,否则 master 需 要经过数据恢复和重启的过程,这就可能会拖很长的时间,影响线上业务的持续 服务。CAP 原理CAP 原理就好比分布式领域的牛顿定律,它是分布式存储的理论基石。自打 CAP 的论文发表之后,分布式存储中间件犹如雨后春笋般一个一个涌现出来。 理解这个原理其实很简单,本节我们首先对这个原理进行一些简单的讲解。...原创 2019-05-09 16:22:22 · 10636 阅读 · 0 评论 -
Redis知识梳理(16) [ 小对象压缩 ]
Redis 是一个非常耗费内存的数据库,它所有的数据都放在内存里。如果我们不 注意节约使用内存,Redis 就会因为我们的无节制使用出现内存不足而崩溃。 Redis 作者为了优化数据结构的内存占用,也苦心孤诣增加了非常多的优化点, 这些优化也是以牺牲代码的可读性为代价的,但是毫无疑问这是非常值得的,尤 其像 Redis 这种数据库。32bit vs 64bitRedis 如果使用 32bit ...原创 2019-05-09 16:21:13 · 10553 阅读 · 0 评论 -
Redis知识梳理(15) [ PubSub ]
Redis 消息队列不支持消息的多播机制消息多播允许生产者生产一次消息,中间件负责将消息复制到多个消息队列,每个消息队列由相应的消费组进行消费。它是分布式系统常用的一种解耦方式,用于将多个消费组的逻辑进行拆分。支持了消息多播,多个消费组的逻辑就可以放到不同的子系统中。如果是普通的消息队列,就得将多个不同的消费组逻辑串接起来放在一个子系统中,进行连续消费。为了支持消息多播,Redis ...原创 2019-05-09 16:20:00 · 10749 阅读 · 0 评论 -
Redis知识梳理(14) [ 事务 ]
为了确保连续多个操作的原子性,一个成熟的数据库通常都会有事务支持, Redis 也不例外。Redis 的事务使用非常简单,不同于关系数据库,我们无须理 解那么多复杂的事务模型,就可以直接使用。不过也正是因为这种简单性,它的 事务模型很不严格,这要求我们不能像使用关系数据库的事务一样来使用 Redis。Redis 事务的基本使用每个事务的操作都有 begin、commit 和 rollback,...原创 2019-05-09 16:18:25 · 10652 阅读 · 0 评论 -
Redis知识梳理(13) [ 管道 ]
大多数同学一直以来对 Redis 管道有一个误解,他们以为这是 Redis 服务器提 供的一种特别的技术,有了这种技术就可以加速 Redis 的存取效率。但是实际上 Redis 管道 (Pipeline) 本身并不是 Redis 服务器直接提供的技术,这个技术本质 上是由客户端提供的,跟服务器没有什么直接的关系。下面我们对这块做一个深 入探究。Redis 的消息交互当我们使用客户端对 Redi...原创 2019-05-09 16:17:09 · 10638 阅读 · 1 评论 -
Redis知识梳理(12)[ 持久化 ]
Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一 种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久 化机制。Redis 的持久化机制有两种:第一种是 快照 ,快照是一次 全量备份,AOF 日志是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,第二种是 AOF 日志 , AOF 日志记录的是内存数据修改的指令...原创 2019-05-09 16:15:54 · 10666 阅读 · 0 评论 -
Redis知识梳理(11) [ 通信协议 ]
Redis 的作者认为数据库系统的瓶颈一般不在于网络流量,而是数据库自身内部 逻辑处理上。所以即使 Redis 使用了浪费流量的文本协议,依然可以取得极高的 访问性能。Redis 将所有数据都放在内存,用一个单线程对外提供服务,单个节 点在跑满一个 CPU 核心的情况下可以达到了 10w/s 的超高 QPS。RESP(Redis Serialization Protocol)RESP 是...原创 2019-05-09 16:14:41 · 10639 阅读 · 0 评论 -
Redis知识梳理(21) [ Info指令 ]
Info 指令显示的信息繁多,分为 9大块,每个块都有非常多的参数,这 9大块如下。 1. Server:服务器运行的环境参数 。2. Clients: 客户端相关信息。3. Memory: 服务器运行内存统计数据。4. Persistence:持久化信息 。5. Stats:通用统计数据 。6. Replication:主从复制相关信息 。7. CPU: CPU使...原创 2019-05-09 16:27:59 · 11214 阅读 · 0 评论 -
Redis知识梳理(22) [ 过期策略 ]
Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除。你可以 想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就 会立即收割。你还可以进一步站在死神的角度思考,会不会因为同一时间太多的 key 过期,以 至于忙不过来。同时因为 Redis 是单线程的,收割的时间也会占用线程的处理时 间,如果收割的太过于繁忙,会不会导致线上读写指令出现卡顿。过期的...原创 2019-05-09 16:30:59 · 10572 阅读 · 0 评论 -
Redis知识梳理(32) [ 基数树 ]
Rax 是 Redis 内部比较特殊的一个数据结构,它是一个有序字典树 (基数树 Radix Tree),按照 key 的字典序排列,支持快速地定位、插入和删除操作。 Redis 五大基础数据结构里面,能作为字典使用的有 hash 和 zset。hash 不具 备排序功能,zset 则是按照 score 进行排序的。rax 跟 zset 的不同在于它是按 照 key 进行排序的。Redis 作者认...原创 2019-05-09 16:42:46 · 13823 阅读 · 2 评论 -
Redis知识梳理(31) [ 紧凑列表 ]
Redis 5.0 又引入了一个新的数据结构 listpack,它是对 ziplist 结构的改进,在 存储空间上会更加节省,而且结构上也比 ziplist 要精简。它的整体形式和 ziplist 还是比较接近的,如果你认真阅读了 ziplist 的内部结构分析,那么 listpack 也是比较容易理解的。 structlistpack {int32 total_bytes; // 占用的总...原创 2019-05-09 16:41:36 · 10924 阅读 · 0 评论 -
Redis知识梳理(30)[ 跳跃列表 ]
Redis 的 zset 是一个复合结构,一方面它需要一个 hash 结构来存储 value 和 score 的对应关系,另一方面需要提供按照 score 来排序的功能,还需要能够指 定 score 的范围来获取 value 列表的功能,这就需要另外一个结构「跳跃列 表」。zset 的内部实现是一个 hash 字典加一个跳跃列表 (skiplist)。hash 结构在讲字 典结构时已经详细分析...原创 2019-05-09 16:40:20 · 10809 阅读 · 0 评论 -
Redis知识梳理(28) [ 压缩列表 ]
Redis 早期版本存储 list 列表数据结构使用的是压缩列表 ziplist 和普通的双向链 表 linkedlist,也就是元素少时用 ziplist,元素多时用 linkedlist。// 链表的节点struct listNode {listNode* prev;listNode* next;T value;}// 链表struct list {listNode *he...原创 2019-05-09 16:39:06 · 10793 阅读 · 0 评论 -
Redis知识梳理(28) [ 压缩列表 ]
Redis 为了节约内存空间使用,zset 和 hash 容器对象在元素个数较少的时候, 采用压缩列表 (ziplist) 进行存储。压缩列表是一块连续的内存空间,元素之间紧 挨着存储,没有任何冗余空隙。> zadd programmings 1.0 go 2.0 python 3.0 java(integer) 3> debug object programmingsVal...原创 2019-05-09 16:38:06 · 10856 阅读 · 1 评论 -
Redis知识梳理(27)[ 字典 内部结构 ]
dict 是 Redis 服务器中出现最为频繁的复合型数据结构,除了 hash 结构的数据 会用到字典外,整个 Redis 数据库的所有 key 和 value 也组成了一个全局字 典,还有带过期时间的 key 集合也是一个字典。zset 集合中存储 value 和 score 值的映射关系也是通过 dict 结构实现的。 struct RedisDb {dict* dic...原创 2019-05-09 16:36:53 · 10742 阅读 · 0 评论 -
Redis知识梳理(26)[ 字符串 内部结构 ]
Redis 中的字符串是可以修改的字符串,在内存中它是以字节数组的形式存在 的。我们知道 C 语言里面的字符串标准形式是以 NULL 作为结束符,但是在 Redis 里面字符串不是这么表示的。因为要获取 NULL 结尾的字符串的长度使用 的是 strlen 标准库函数,这个函数的算法复杂度是 O(n),它需要对字节数组 进行遍历扫描,作为单线程的 Redis 表示承受不起。Redis 的字符串叫...原创 2019-05-09 16:35:51 · 10744 阅读 · 1 评论 -
Redis知识梳理(25)[ Redis 安全通讯 ]
想象这样一个应用场景,公司有两个机房。因为一个紧急需求 , 需要跨机房读 取 Redis 数据。应用部署在 A 机房,存储部署在 B 机房。如果使用普通 tcp 直接访问, 因为跨机房所以传输数据会暴露在公网上,这非常不安全,客户端服务器交互的数 据存在被窃昕的风险,如图 4-11 所示。Redis本身并不支持 SSL安全链接,不过有了 SSL代理软件,我们可以让通信 数据得到加密,就好像 R...原创 2019-05-09 16:34:32 · 11501 阅读 · 0 评论 -
Redis知识梳理(24) [ 懒惰删除 ]
一直以来我们都知道 Redis 是单线程的,单线程为 Redis 带来了代码的简洁性和丰富多样的数据结构。不过 Redis 内部实际上并不是只有 个主线程,它还有几个异 步线程专门用来处理一些耗时的操作。Redis 为什么要懒惰删除(lazy free)?删除指令 del 会直接释放对象的内存,大部分情况下,这个指令非常快,没有 明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包...原创 2019-05-09 16:33:00 · 10622 阅读 · 0 评论 -
Redis知识梳理(23) [ 缓存算法法 LRU ]
当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来 说,这样龟速的存取效率基本上等于不可用。在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存, Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。当实际内存超出 maxmemory 时...原创 2019-05-09 16:31:58 · 11434 阅读 · 0 评论 -
Redis知识梳理(10) [ 线程IO模型 ]
Redis 单线程为什么还能这么快?因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些时间复杂度为 O(n) 级别的指 令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。Redis 单线程如何处理那么多的并发客户端连接?多路复用非阻塞 IO套接字读写流程:事件轮询 (多路复用)非阻塞 I...原创 2019-05-09 16:13:26 · 10674 阅读 · 0 评论 -
Redis知识梳理(9) [ scan 检索 ]
在平时线上 Redis 维护工作中,有时候需要从 Redis 实例成千上万的 key 中找出特定前缀的 key 列表来手动处理数据,可能是修改它的值,也可能是删除 key。这里就有一个问题,如何从海量的 key 中找出满足特定前缀的 key 列表 来?Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则 的 key。 127.0.0.1:6379&g...原创 2019-05-09 16:12:14 · 10785 阅读 · 0 评论 -
Redis知识梳理(8) [ GeoHash 地理位置 ]
Redis 在 3.2 版本以后增加了地理位置 GEO 模块,意味着我们可以使用 Redis 来实现摩拜单车「附近的 Mobike」、美团和饿了么「附近的餐馆」这样的功能 了。业界比较通用的地理位置距离排序算法是 GeoHash 算法,Redis 也使用 GeoHash 算法。GeoHash 算法将二维的经纬度数据映射到一维的整数,这样 所有的元素都将在挂载到一条线上,距离靠近的二维坐标映...原创 2019-05-09 16:11:04 · 10897 阅读 · 0 评论 -
Redis(8)为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因1.redis是基于内存的,内存的读写速度非常快;2.redis是单线程的,省去了很多上下文切换线程的时间;3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。下面重点介绍单线...原创 2019-05-01 13:58:49 · 15968 阅读 · 0 评论 -
Redis(7)分布式缓存的应用场景、选型比较、问题和挑战
为什么要使用分布式缓存高并发环境下,例如典型的淘宝双11秒杀,几分钟内上亿的用户涌入淘宝,这个时候如果访问不加拦截,让大量的读写请求涌向数据库,由于磁盘的处理速度与内存显然不在一个量级,服务器马上就要宕机。从减轻数据库的压力和提高系统响应速度两个角度来考虑,都会在数据库之前加一层缓存,访问压力越大的,在缓存之前就开始CDN拦截图片等访问请求。并且由于最早的单台机器的内存资源以及承载能力有限,如...原创 2019-05-01 13:58:02 · 16050 阅读 · 0 评论 -
Redis(6)如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
缓存雪崩数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。比如一个雪崩的简单过程:1、redis集群大面积故障2、缓存失效,但依然大量请求访问缓存服务redis3、redis大量失效后,大量请求转向到mysql数据库4、mysql的调用量暴增,很快就扛不住了,甚至直接宕机5、由于大量的应用服务依赖mysql和r...原创 2019-05-01 13:56:58 · 15952 阅读 · 0 评论 -
精选(45) 分布式应用限流 Redis + Lua 实践
来源:https://juejin.im/post/5b7625e051882533122e1fc4任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶。在之前的文章中,也讲到过,但是那是基于单机场景来写。之前文章:接口限流算法:漏桶算法&令牌桶算法然而再牛逼的机器,再优化的设计,对于特殊场景我们也是要特殊处理的。就拿秒杀来说,可能会有百万级别...原创 2019-05-04 14:46:17 · 12807 阅读 · 0 评论 -
Redis(5)n种妙用,不仅仅是缓存
介绍redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)Redis用作缓存,主要两个用途:高性能,高并发,因为内存天然支持高并发应用场景分布式锁(string)setnx key value,当key不存在时,将 key 的值设为 value ,返回1。若给定的 key 已经存...原创 2019-04-28 10:30:38 · 13358 阅读 · 0 评论 -
Redis(4)阿里云-开发规范
一、键值设计1. key名设计(1)【建议】: 可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:idugc:video:1(2)【建议】:简洁性保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}...原创 2019-04-28 10:18:53 · 13122 阅读 · 1 评论 -
Redis(3)内存回收原理,及内存过期淘汰策略详解
Redis内存回收机制Redis的内存回收主要围绕以下两个方面:1.Redis过期策略:删除过期时间的key值**2.Redis淘汰策略:**内存使用到达maxmemory上限时触发内存淘汰数据Redis的过期策略和内存淘汰策略不是一件事,实际研发中不要弄混淆了,下面会完整的介绍两者。Redis过期策略过期策略通常有以下三种:1.定时过期每个设置过期时间的key都需要创建一个定时器...原创 2019-04-28 10:17:15 · 13040 阅读 · 0 评论 -
Redis(2)集群redis-cluster & redis主从同步
设计原则和初衷性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式、异步复制、客户端重定向等设计,而牺牲了部分的一致性、使用性。水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点。可用性:在Cluster推出之前,可用性要靠Sentinel保证。有了集群之后也自动具有了Sentinel的监控和自...原创 2019-04-28 10:14:04 · 13619 阅读 · 0 评论 -
Redis(12)RDB和AOF的优缺点对比以及如何选择
一、RDB的优缺点1.1、RDB的优点(1)RDB文件是紧凑的二进制文件,比较适合做冷备,全量复制的场景。RDB做会生成多个文件,每个文件都代表了某一个时刻的Redis完整的数据快照;RDB这种多个数据文件的方式,非常适合做冷备,因为大量的一个个的文件,可以每隔一定的时间,复制出来;可以将这种完整的数据文件发送到一些远程的云服务、分布式存储上进行安全的存储,以预定好的备份策略来定期备份...原创 2019-05-01 22:50:09 · 10714 阅读 · 0 评论 -
Redis(1)常用操作命令
Redis基本操作命令很多网站教程都介绍的很详细的,这里只把主要的介绍一下。对于操作命令大小写不区分(DEL del Del是一样的。对于输入正确的命令,会自动出现后续输入参数提示),但是key是区分大小写的。key操作注:Redis是一个key-value的键值对的内存数据库。最基本的一些操作就是对这些key的操作。DEL删除Key, del key1 key2EXISTS检...原创 2019-03-29 12:02:06 · 13706 阅读 · 1 评论 -
Redis(9)缓存和MySQL数据一致性方案详解
需求起因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间...原创 2019-05-01 13:59:38 · 15908 阅读 · 0 评论 -
Redis(10)分布式锁的由来、特点、及Redis分布式锁的实现详解
在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天来探讨分布式锁这个话题。什么是分布式锁要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。1.线程锁主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同...原创 2019-05-01 14:00:21 · 16193 阅读 · 0 评论 -
Redis知识梳理(7) [ 漏斗限流 throttle ]
漏洞的容量是有限的,如果将漏嘴堵住,然后一直往里面灌水,它就会变满,直至再也装不进去。如果将漏嘴放开,水就会往下流,流走一部分之后,就又可以继续往里面灌水。如果漏嘴流水的速率大于灌水的速率,那么漏斗永远都装不满。如果漏嘴流水速率小于灌水的速率,那么一旦漏斗满了,灌水就需要暂停并等待漏斗腾空。所以,漏斗的剩余空间就代表着当前行为可以持续进行的数量,漏嘴的流水速率代表着系统允许该行为的最大...原创 2019-05-09 16:09:45 · 13458 阅读 · 4 评论 -
Redis知识梳理(6) [ 简单限流 ]
限流算法在分布式领域是一个经常被提起的话题,当系统的处理能力有限时,如 何阻止计划外的请求继续对系统施压,这是一个需要重视的问题。除了控制流量,限流还有一个应用目的是用于控制用户行为,避免垃圾请求。比 如在 UGC 社区,用户的发帖、回复、点赞等行为都要严格受控,一般要严格限 定某行为在规定时间内允许的次数,超过了次数那就是非法行为。对非法行为, 业务必须规定适当的惩处策略。这个限流需求中存在...原创 2019-05-09 16:07:02 · 10774 阅读 · 0 评论