- 博客(108)
- 资源 (5)
- 收藏
- 关注
原创 Redis深度历险-Redis基数树内部源码结构
Rax TreeRax是Redis内部比较特殊的一个数据结构,它是一个有序字典树(基数树Radix Tree),按照key的字典序排列,支持快速地定位、插入和删除操作;Redis五大基础数据结构里面能作为字典使用的有hash和zset,hash不具备排序功能,zset则是按照score进行排序的;rax跟zset的不同在于它是按照key进行排序的基数树的讲解参考:https://www.cnblogs.com/wgwyanfs/p/6887889.html应用可以将一本英.
2020-08-21 15:34:55
390
1
原创 Redis深度历险-Redis紧凑列表内部源码结构
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!listpackRedis5.0引入了一个新的数据结构listpack,它是对ziplist结构的改进,在存储空间上会更加节省,而且结构上比ziplist要精简;它的整体形式和ziplist比较接近struct listpack<T> { //这个结构体中删掉了用来标记最后一个节点偏移量的字短zltail_offset int32 total_bytes; // 占用的总字节数
2020-08-20 17:25:29
293
原创 Redis深度历险-Redis跳跃列表内部源码结构
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!ZSET的功能及特性1、Redis的zset类似于SortedSet和HashMap的结合体,一方面它需要一个hash结构来存储value和score的对应关系,另一方面需要提供按照score来排序的功能,还需要能够指定score的范围来获取value列表的功能,所以需要使用到“跳跃列表”2、zset内部是一个hash字典加一个跳跃列表(skiplist),hash结构类似于Java中的HashMap
2020-08-20 17:20:47
268
原创 Redis深度历险-Redis快速列表源码内部结构
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis早期版本中list的存储形式1、Redis早期版本存储list列表数据结构使用的是压缩列表ziplist和普通的双向链表linkedlist,元素少时使用ziplist,元素多时使用linkedlist2、链表的附加空间相对太高,prev和next指针要占用16个字节(64bit系统的指针是8字节),而且每个节点内存的单独分配会加剧内存的碎片化,影响内存管理的效率;后续版本中使用quicklist代替了
2020-08-20 17:14:06
170
原创 Redis深度历险-Redis压缩列表源码内部结构
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis为了节约内存空间使用,zset和hash容器对象在元素个数少的时候采用压缩列表(ziplist)进行存储。压缩列表是一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空间> zadd programmings 1.0 go 2.0 python 3.0 java(integer) 3> debug object programmingsValue at:0x7fec2de00020 refco
2020-08-20 17:09:56
162
原创 Redis深度历险-Redis字典源码内部结构
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis字典的用途Redis中 hash结构的数据会使用到字典,整个Redis数据库中所有的key和value也组成了一个全局字典,带过期时间的key集合也是一个字典。zset集合中存储value和score值的映射关系也是通过dict结构实现的struct RedisDb { dict* dict; // all keys key=>value dict* expires; // all
2020-08-20 17:03:41
268
原创 Redis深度历险-Redis字符串源码内部源码结构
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis字符串结构Redis中的字符串是可修改的字符串,在内存中是以字节数组形式存在的SDSRedis中的字符串叫做“SDS”,也就是Simple Dynamic String,它的结构是带长度信息的字节数组;字符串是可以修改的字符串,支持append操作struct SDS<T> { T capacity; //数组容量 T len; //数组长度 b
2020-08-19 23:53:30
179
原创 Redis深度历险-Redis安全通信
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis不支持SSL安全链接,但是可以使用SSL代理软件让数据透明得得到加密,例如spiped就是一款SSL代理软件spiped原理1、spiped会在客户端和服务器之间启动一个spiped进程,左边的spiped进程A负责接受来自Redis Client发送过来的请求数据,家猕猴传送导游变得spiped进程B。spiped B将收到的数据解密后传递到Redis Server。然后Redis S
2020-08-16 21:39:47
206
原创 Redis深度历险-Redis保护
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!指令安全1、使用某些Redis指令会导致Redis卡顿或者影响Redis的数据安全,比如说keys会导致Redis卡顿,flushdb和flushall会让Redis的所有数据全部清空2、使用Redis配置文件中的rename-command指令用于将某些危险的指令修改成别的名称,如果想禁止使用某指令,可以将指令rename成空串,就无法通过任何字符串指令来执行这条指令了rename-command keys
2020-08-16 21:36:40
197
原创 Redis深度历险-Redis LRU策略
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis内存不足的解决策略1、Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换(swap);交换会让Redis的性能急剧下降,对于访问量频繁的Redis是不可接受的2、使用配置参数maxmemory限制Redis使用的内存上限,当实际使用的内存超出maxmemory时,Redis会提供LRU策略(maxmemory-policy)让用户决定如何腾出新的内存空间LRU策略noevicti
2020-08-12 22:31:30
443
原创 Redis深度历险-Redis过期策略
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis过期时间1、Redis所有数据结构都可以设置过期时间,到了过期时间之后就会自动删除2、因为Redis是单线程的,所以同一时间如果大量的key过期或者key的过期太频繁都会导致线上指令出现卡顿Redis过期key集合Redis会将每个设置了过期时间的key放入到一个独立的字典当中,以后会定时遍历这个字典来删除到期的key;除了定时遍历外,Redis还会使用惰性策略来删除过期的key,惰行删除策略就
2020-08-12 22:27:14
159
原创 Redis深度历险-Redis分布式锁拾遗漏补
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis分布式锁不是绝对安全的在Redis Sentinel集群中,主节点挂掉时从节点会被晋升为主节点,如果这个时候原主节点上的锁未被同步到现主节点中那么新的客户端过来请求加锁时,就会导致未被解锁的锁又被加锁了;系统中同一把锁被两个客户端持有,导致不安全性;这种不安全的情况仅仅在主从发生failover的情况下才会产生且持续时间极短,业务系统多数情况下可以容忍Redlock算法1、可以使用Red
2020-08-12 22:24:55
226
2
原创 Redis深度历险-Redis Stream
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis StreamRedis5.0多出了新的数据结构Stream,它是一个新的强大的支持多播的可持久化的消息队列,Redis Stream 狠狠地借鉴了 Kafka 的设计1、Redis Stream是一个消息链表,其中的每一条消息都有一个唯一的ID和对应的内容,消息是持久化的;每个Stream都有唯一的名称,Redis的key就是Stream的名称;首次使用xadd指令追加消息时会自动创建Stream
2020-08-11 23:54:45
929
原创 Redis深度历险-Redis集群Cluster
Gossip协议https://www.jianshu.com/p/54eab117e6aeRedisCluster1、RedisCluster将所有数据划分为16384个槽(slots),每个节点负责其中一部分槽位,槽位信息存储于每个节点中2、RedisCluster的客户端连接集群时会得到一份集群的槽位配置信息,当客户端要查找某个key时可以直接定位到目标节点3、RedisCluster的每个节点会将集群的配置信息持久化到配置文件中槽位定位算法1、Cl.
2020-08-11 23:49:51
238
原创 Redis深度历险-Redis哨兵模式Sentinel
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!ZAB协议https://www.jianshu.com/p/2bceacd60b8aRedis哨兵模式1、可以将 Redis Sentinel 集群看成是一个 ZooKeeper 集群,它是集群高可用的心脏,它一般是由 3~5 个节点组成,这样挂了个别节点集群还可以正常运转2、Sentinel集群负责持续监控主从节点的健康,当主节点挂掉时,自动选择一个最优的从节点切换为主节点。客户端来连接集群时,会
2020-08-11 23:43:16
477
原创 Redis深度历险-Redis小对象压缩
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis是一个非常耗费内存的数据库,所有的数据都存在于内存之中。Redis如果使用32bit进行编译,内部数据结构使用的指针空间占用会减少一半,内存不超过4G可以使用32bit进行编译小对象压缩存Redis内部管理的集合数据很小时,会使用紧凑存储形式压缩;HashMap是数组+链表的二维结构,如果内部元素比较少,使用二维结构相比而言更浪费空间,不如使用一维数组进行存储,查找时因为使用的是一维结构且元素.
2020-08-10 20:48:40
169
原创 Redis深度历险-Redis PubSub消息订阅发送
消息多播机制1、Redis队列(list)不支持多播,但是使用PubSub模式可以支持消息多播机制,一个消息被多个消费者消费2、消息多播允许生产者产生一次消息,中间件将消息复制到多个消息队列,每个消息队列由相应的消费组进行消费;这是分布式系统常用的解耦方式,用余江多个消费组的逻辑进行拆分,;支持消息多播之后,多个消费组的逻辑就可以放到不同的子系统中普通的消息队列,如果要实现不同的消费组逻辑放在一个系统里,接收一条消息处理多种逻辑PubSub模式Redis PubSub.
2020-08-10 20:42:49
964
原创 Redis深度历险-Redis持久化
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis持久化的方式1、快照方式持久化,将内存中数据的二进制序列化形式备份到磁盘上,数据在存储上非常紧凑2、AOF日志,记录内存数据修改的指令记录文本,在长期运行后AOF日志的体积将会变得无比庞大,数据库重启时加载AOF日志进行指令重放,这个时间就会很漫长。所以要定期进行AOF重写,给AOF日志进行瘦身快照原理Redis在服务器处理请求的时候还需要进行内存快照,内存快照要求Redis必须进行
2020-08-10 20:35:21
153
原创 Redis深度历险-Redis事务
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!数据库事务事务有begin、commit、rollback操作,begin表示事务的开始,commit表示事务的提交,rollback表示事务的回滚Redis事务Redis事务也有multi、exec、discard,multi表示事务的开始,exec表示事务的执行,discard表示丢弃事务中的所有指令;Redis事务在遇到错误的指令时不会自动回滚,而是会继续执行之后的指令;discard指令只能在exec
2020-08-10 20:30:03
139
原创 Redis深度历险-Redis管道
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis管道Redis管道(Pipeline)是由Redis客户端提供的技术,和Redis服务器没有直接的关系;管道适合操作先后顺序对结果无影响的连续指令,连续读或连续写Redis的普通消息交互客户端和服务器之间每次交互都是经历了“写-读-写-读”四个阶段,这种模式每次完成交互需要花费一个网络数据包来回的时间管道的本质1、如果改成“写-写-读-读...
2020-08-10 20:26:33
200
原创 Redis深度历险-Redis bitmap位图
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Bitmap简介1、Redis中的位图就是字符串,也就是byte数组,可以使用get/set直接获取和设置整个位图的内容,也可以使用位图操作getbit/setbit等将byte数组看成“位数组”来处理2、Redis的位数组是自动扩展的,如果设置了某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充3、有符号数是指获取的位数组中第一个位是符号位,剩下的才是值。如果第一位是1,那就是负数。无符号数表示非负数
2020-08-07 00:33:39
717
原创 Redis深度历险-Redis通信协议
RESP(Redis Serialization Protocol)RESP是Redis序列化协议的简写,它是一种直观的问本协议,优势在于实现异常简单,解析性能极好Redis协议将传输的结构数据分为5种最小单元类型,单元结束后统一加上回车换行符号\r\n1、单行字符串 以 + 符号开头(单行字符串显示时不以""包裹)2、多行字符串 以 $ 符号开头,后跟字符串长度(多行字符串显示时以""包裹,多行字符串也可以表示单行字符串)3、整数值 以 : 符号开头,后跟整数的字符串形式4、错.
2020-08-07 00:18:55
142
原创 Redis深度历险-Redis线程IO模型
众所周知,Redis是单线程程序Redis 单线程为什么还能这么快因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为Redis是单线程,所以要小心使用Redis指令,对于那些时间复杂度为O(n)级别的指令,一定要谨慎使用,一不小心就可能会导致Redis卡顿Redis 单线程如何处理那么多的并发客户端连接因为Redis采用了多路复用的方法,通过select系列的事件轮询API,使用了非阻塞IO非阻塞IO1、当调用套接字的读写方法,默认它们是阻塞的,比.
2020-08-07 00:15:38
187
原创 Redis深度历险-Redis Scan
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!当要找出所有满足特定正则字符串规则的key时应该用什么命令?keys * #找出满足特定正则字符串规则的keykeys命令的缺点1、没有偏移量offset、限定数量limit,一次性找出所有满足条件的key,如果实例中有百万个满足条件的key则会影响性能2、keys命令的算法是遍历算法,复杂度是O(n),如果实例中有千万级别以上的key,则会导致Redis服务卡顿,所有Redis读写的指令都会被延后甚至超时
2020-08-07 00:10:52
384
原创 Redis深度历险-Redis GeoHash空间对象
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!GEO模块1、Redis在3.2版本以后增加了地理位置GEO模块,可以使用该模块来实现“附近的车辆”和“附近的餐馆”这样的功能,本质上数据结构是zset2、地图元素的位置数据使用二维的经纬度表示,经度范围(-180, 180],纬度范围(-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线(英国格林尼治天文台)为界,东正西负问题提出:如果某个人位于坐标轴(x0, y0)处,如何实现查找附近元素
2020-08-02 15:17:37
251
原创 Redis深度历险-Redis 漏斗限流
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!漏斗限流灵感限流算法漏斗限流:https://blog.csdn.net/dadiyang/article/details/82887663令牌桶限流:https://www.cnblogs.com/cjsblog/p/9379516.html漏斗限流单机实现public class FunnelRateLimiter { static class Funnel {
2020-08-02 15:05:59
644
原创 Redis深度历险-Redis HyperLogLog不精确的去重计数方案
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!PV和UV PV(访问量):即Page View, 具体是指网站的是页面浏览量或者点击量,页面被刷新一次就计算一次。如果网站被刷新了1000次,那么流量统计工具显示的PV就是1000 UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次 一个UV可以用很多PV,一个PV也只能对应一个IP。比如,今天访问了一次你的...
2020-08-02 14:58:36
831
原创 Redis深度历险-Redis 布隆过滤器
布隆过滤器作用1、布隆过滤器 (Bloom Filter)是专门用来解决去重问题的(新闻中已经看过的新闻去除,用户行为历史记录,邮箱系统的垃圾邮件过滤,爬虫URL去重;HBase、Cassandra 还有 LevelDB、RocksDB 内部都有布隆过滤器结构,布隆过滤器可以显著降低数据库的 IO 请求数量。当用户来查询某个 row 时,可以先通过内存中的布隆过滤器过滤掉大量不存在的 row 请求,然后再去磁盘进行查询)。在起到去重的同时,在空间上还能节省 90% 以上(因为存储的是元素指纹),只是.
2020-08-02 14:47:51
221
1
原创 Redis深度历险-Redis zset简单限流
Redis简单限流,使用zset来实现需求:指定用户在指定时间范围内最多请求n次看了这张图是不是会想象到TCP的流量窗口?需求分析:1、限流需求中存在一个滑动的时间窗口,而zset的score值可以用来圈定时间窗口,窗口之外的数据都可以删除2、zset的value需要是一个唯一的值,只需要保证唯一性即可3、zset的key应该是用户id和行为的组合userid_action4、同时还需指定用户行为的过期时间为:时间间隔 + 1 (原因:过期时间应该等于时...
2020-08-02 14:40:09
1290
3
原创 Redis深度历险-Redis延时队列
Redis list常用作异步消息队列,没有数据时阻塞,基于命令brpop、blpop;这种情况会存在空连接的问题,闲置连接过久服务器会主动断开连接,brpop、blpop会抛出异常,需要在程序中捕获异常并重新连接延时队列的实现延时队列可以使用Redis的zset(有序列表)来实现。将消息序列化成一个字符串作为zset的value,这个消息的到期处理时间作为score,然后用多个线程轮询zset获取到起的任务进行处理;多个线程保障可用性,但是多个线程是并发争抢任务,保证任务不能被执行多次
2020-08-02 14:35:55
273
原创 Redis深度历险-Redis分布式锁
原子操作原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何context switch线程切换分布式锁分布式锁本质上要实现的目标就是在 Redis 里面占一个“茅坑”,当别的进程也要来占时,发现已经有人蹲在那里了,就只好放弃或者稍后再试;对于执行时间超过锁定时间的,需要锁具有重入性Java 版本的可重入锁(基于ThreadLocal和引用计数)public class RedisWithReentrantLock { priva.
2020-08-02 14:33:02
157
原创 Redis深度历险-Redis基础数据结构
本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!Redis作用1、记录体制的点赞数、评论数和点技术(hash)2、记录用户的帖子ID列表(排序),便于快速显示用户的帖子列表(zset)3、记录贴子的标题、摘要、作者和锋面信息,用于列表页展示(hash)4、记录贴子的点赞用户ID列表,评论ID列表,用于显示和去重计数(zset)5、缓存近期热帖内容(帖子内容空间占用比较大),减小数据库压力(hash)6、记录贴子的相关文章ID,根据内容推荐相关帖子(
2020-08-02 14:24:22
194
原创 RabbitMQ镜像集群搭建(3节点)Centos7
本文安装的Erlang是21.3.8.12版本的,RabbitMQ是3.7.15版本的,环境是Centos7 64位安装Erlang和RabbitMQ1、编辑repo文件vim /etc/yum.repos.d/rabbitmq-erlang.repovim /etc/yum.repos.d/rabbitmq-server.reporabbitmq-erlang.rep...
2020-03-09 16:47:39
1086
原创 MyCat + MySQL(3实例)实现数据的分库分表Centos7
安装MySQL1、准备了三台虚拟机:192.168.56.102,192.168.56.103,192.168.56.1042、MyCat安装在192.168.56.103上,首先安装MyCat的机器必须要装jdk每台机器依次运行以下命令,我的机器上安装的板本是:mysql-community 5.7.29-1.el7,下载量很大等待进度条跑完yum -y install m...
2020-03-07 16:25:16
299
原创 Centos7 Redis5.0分片集群搭建
搭建之后发现,Redis5.0比Redis4.0搭建主从集群方便多了,推荐使用Redis5.0搭建集群有几个要注意的地方首需要注意:1、Redis5.0要求在3个主节点的主从集群中,从节点最少6个,所以每台机器平均下来布三个节点2、另一个注意的问题是防火墙,有可能启动并没有任何问题,但是在使用以下命令创建集群时会失败redis-cli --cluster create .....
2019-11-07 00:36:26
630
原创 Java多线程问题--线程运行时出现异常的解决办法
本文内容部分引自《Java多线程编程核心技术》,感谢作者!!!代码地址:https://github.com/xianzhixianzhixian/thread.git线程运行时出现问题的几种解决办法1、为特定线程指定一个异常处理器thread.setUncaughtException(new UncaughtExceptionHandler(){ @Override...
2019-03-05 22:59:58
2907
原创 Java多线程问题--schedule函数和scheduleAtFixedRate的用法和区别
本文内容部分引自《Java多线程编程核心技术》,感谢作者!!!代码地址:https://github.com/xianzhixianzhixian/thread.gitschedule函数和scheduleAtFixedRate的用法和区别1、schedule(TimerTask task, Date time)的作用在指定的时间执行任务,如果指定时间早于当前时间则立即执行任务...
2019-02-14 23:05:39
2304
4
maven本地仓库压缩包
2018-01-31
maven-3.3.9
2018-01-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人