
redis从入门到放弃
redis从入门到放弃
bohu83
微信:bohu83
展开
-
Redisson Rlist序列化报错
一 问题 在redisson的Rlist<Bean> .测试的时候,现在redis存放了数据。后来Bean属性做了调整,读取就报序列化错误了java.io.IOException: java.lang.NullPointerException at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:247) at org.redisson.codec.FstCodec$1.decod..原创 2020-12-23 19:48:09 · 1103 阅读 · 0 评论 -
redisson hincrby 遇到的编码问题
一 问题 老项目的redis 要切换到redis集群,所以客户端从leettuce的RedisAsyncCommands切换到到redisson.一个常见的hash增长:public long hincrby(String key,String field,Long amount){ //新旧代码开关 if( 老的Redis){ ...原创 2020-03-24 11:32:27 · 2541 阅读 · 0 评论 -
spring 集成redisson
一 背景 一定压力下,Redis的主从结构还是容易出问题,升级到Redis集群模式会提高性能。 如何平滑升级是需要重点考虑的。这里不展开,项目中升级遇到新项目springboot.老项目spring。这里看下如何集成。二 xml 整合首先推荐官网,看懂官网就不用看我啰嗦了。https://github.com/redisson/redisson/wiki/14.-%E...原创 2019-12-24 20:38:44 · 2183 阅读 · 0 评论 -
《redis设计与实现》-19事务transaction
一 序 Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 、UNWATCH 5个命令来实现事务功能, 本章首先讨论使用 MULTI 、 DISCARD 和 EXEC 三个命令实现的一般事务, 然后再来讨论带有 WATCH 的事务的实现,最后通过常见的 ACID 性质对 Redis 事务的安全性进行了说明。二 事务 事务提供了一种“将多个命令...原创 2019-02-04 01:03:35 · 328 阅读 · 0 评论 -
《redis设计与实现》-17集群故障转移
一 RAFT算法 书接上篇17 集群的故障检测,本篇主要介绍集群检测到某主节点下线后,是如何选举新的主节点的。注意到Redis集群是无中心的,那么使用分布式一致性的算法来使集群中各节点能对在新主节点的选举上达成共识就是一个比较可行的方案。Redis使用了Raft算法来做主节点选举的。所以这里先简单介绍下Raft的原理:( 坦白的说,我是看不懂论文的数学公式,真让人头疼,之前在看书pa...原创 2019-01-29 22:57:55 · 581 阅读 · 0 评论 -
《redis设计与实现》-17 集群的故障检测
一 序 redis集群中的节点分为master 和slave 。其中master负责处理槽;slave 会复制master 的数据, 并在master 下线后, 代替它继续进行处理命令请求。下面分别介绍节点复制、故障检测,限于篇幅故障转移下一篇整理。二 节点复制 向集群节点发送"CLUSTER REPLICATE <nodeID>"命令,使收到命令的集群节点成为...原创 2019-01-27 22:09:43 · 865 阅读 · 0 评论 -
《redis设计与实现》-17 集群重新分片reshard
一 重新分片 Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。 重新分片操作可以在线进行,在重新分片过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。二 重新分片的原理 Redis的集群管理工具redis-trib,通过向源节点和目标节点发送命令来进...原创 2019-01-23 23:52:27 · 1914 阅读 · 0 评论 -
《redis设计与实现》-17 在集群中执行命令
一 序在对数据库中的16384个槽都进行了指派之后,集群就会进入上线状态,这时客户端就可以向集群中的节点发送数据命令了。当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己:如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令 如果将所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,...原创 2019-01-18 23:50:45 · 291 阅读 · 0 评论 -
《redis设计与实现》-17槽指派
一 序 Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。 当数据库总的16384个槽都有节点在处理时,集群处于上线状态(ok);相反地,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。 通过向节...原创 2019-01-18 17:02:33 · 577 阅读 · 0 评论 -
《redis设计与实现》-17 集群 gossip协议
一 gossip协议 上一篇介绍了集群的cluster meet命令实现过程,握手过程结束后,A节点会将B节点信息通过gossip协议传播给集群的其他节点,其他节点也会与B节点握手,最终经过一段时间后,B节点会被集群的所有节点认识。 补充下背景知识: Gossip算法如其名,灵感来自办公室八卦,只要一个人八卦一下,在有限的时间内所有的人都会知道该八卦的信息,这种方式也与...原创 2019-01-16 23:23:37 · 5321 阅读 · 1 评论 -
《redis设计与实现》-17 cluster节点
一 序 关于redis的集群,官网介绍比较全面了。https://redis.io/topics/cluster-spec 设计目标:High performance and linear scalability up to 1000 nodes. There are no proxies, asynchronous replication is used, and no merge...原创 2019-01-14 21:42:16 · 963 阅读 · 0 评论 -
《redis设计与实现》-16sentinel 源码部分
一 序 上一篇整理了sentinal的理论部分,本篇继续看下源码部分,源码在sentinel.c 。 redis的sentinel的解决方案基于主从复制结构着眼于分布式存储的高可用方案,那么数据的持久化跟复制就是基础。而sentinel就是针对异常情况下,如何对于实现主从切换,并且对于客户端透明。所以从整个系统来看,sentinel本身是监督者的身份,没有存储功能。而为了实现监督...原创 2019-01-07 00:46:34 · 1690 阅读 · 13 评论 -
阿里云Redis短连接性能优化
一 序 前一阵,阿里云的专家来公司分享阿里云的自研数据库polarDB,号称性能是MySQL 的 6 倍,当然抛去一开介绍的硬件、网络的顶配外,主要是数据底层是分布式存储的,天然的适合多读。这些都没大规模商用,好吧,听到阿里云的专家提了一句,包括redis都有自研的版本,做了很多底层的优化,举例子是短连接优化跟AOF的类似mysql的binlog化。正好网上看到一篇介绍Redis短连接性...原创 2018-12-25 00:17:18 · 1001 阅读 · 0 评论 -
《redis设计与实现》-15复制
一 序 书上本章内容很丰富,分为新旧版复制来讲解。其中旧复制的实现、旧复制的缺陷、侧重部分重同步实现。 具体的复制的实现:(这部分本篇不展开,下一篇结合源码去看)主从关系的建立 主从网络连接建立 发送PING命令 认证权限 发送端口号 发送 IP 地址 发送能力capability 发送PSYNC命令 发送输出缓冲区数据 命令传播部分重同步实现心跳机制...原创 2018-12-18 19:43:37 · 316 阅读 · 1 评论 -
《REDIS设计与实现》-16 sentinel 哨兵
一 序 redis主从复制可将主节点数据同步给从节点,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。这个过程如果人工介入,效果肯定没有自动的高可用机制好。sentinel 哨兵机制就是为了解决这个问题。是redis的高可用HA方案:有一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服...原创 2018-12-26 00:10:25 · 508 阅读 · 0 评论 -
《redis设计与实现 》15复制-源码部分
一 序 上一篇整理了redis复制的概念性流程 ,本篇结合复制的实现来看下源码。 复制的建立方法有三种: 在redis.conf文件中配置slaveof <masterip> <masterport>选项,然后指定该配置文件启动Redis生效。 在redis-server启动命令后加上--slaveof <masterip> <m...原创 2018-12-21 00:01:17 · 405 阅读 · 0 评论 -
REDIS 数据淘汰机制
一 序 之前在整理Object的时候,关于LRU的淘汰地方没有看代码,本篇补上。redisobject中除了type、encoding、ptr和refcount属性外,还有一个lru属性用来计算空转时长。OBJECT IDLETIME命令可以打印出给定键的空转时长,是用当前时间减去键的lru时间计算得出的。OBJECT IDLETIME命令是特殊的,这个命令在访问键的对象时,不会修...原创 2018-12-17 23:32:43 · 1093 阅读 · 0 评论 -
《redis设计与实现》--客户端如何发送及接受命令
一 序 上一篇整理了redis的server端流程,本篇文章介绍的是 Redis 客户端如何处理输入的命令、向服务发送命令以及取得服务端回复并输出到终端等过程。 简单的交互过程如下:一、Client 发起socket 连接二、Server 接受socket连接三、客户端 开始写入四、server 端接收写入五、server 返回写入结果六、Client收到返回结果 详...原创 2018-12-16 22:41:41 · 1319 阅读 · 0 评论 -
《REDIS设计与实现》- 网络连接库剖析(client的创建/释放、命令接收/回复等)
一 序 这一篇看起来networking.c好头大,因为书上的没怎么提,主要看代码,这个流程有点长。感谢网上大神的文章,终于明白了这个流程。本篇的主要包含:客户端的连接处理、客户端的创建与释放、接受客户端的命令、回复客户端、关于客户端命令几部分。这个找到原始出处会补充上。限于篇幅本文只整理server端流程,客户端的待下篇整理。对比下自己画的server端的草图二...原创 2018-12-15 00:31:06 · 1085 阅读 · 0 评论 -
《redis设计与实现》-12事件event
一 序 书上主要介绍了文件事件、时间事件,事件调度三部分,结合源码来看,主要分在ae.hae.c 与networking.c两大块。限于篇幅。本文分两部分,第一部分整理书上概念,第二部分看一下时间事件及文件事件的部分源码。文件事件的处理器部分单独整理。二 事件类型Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:文件事件(file event):Redis服务器...原创 2018-12-12 13:52:58 · 405 阅读 · 0 评论 -
《redis设计与实现》-10 RDB持久化
一 序 本章书上内容较大部分介绍了RDB文件的创建与载入、自动间隔性保存、RDB文件结构。所以本文分为两部分上边参照书上梳理,第二部分看bgsave的源码实现。 Redis是内存型数据库,如果服务器进程退出,服务器中的数据状态也会消失不见,所以需要持久化功能。为了解决这个问题,Redis提供了两种持久化的机制:RDB和AOF。本篇主要整理RDB持久化的部分。RDB持久化功能...原创 2018-12-05 23:56:23 · 486 阅读 · 0 评论 -
《redis设计与实现》-9数据库命令实现
一 序 上一篇按照书上的第9章的内容整理了redis数据库, 主要侧重于键值的过期及删除策略。限于偏于本篇整理数据的命令。数据库管理的命令如下表所示:命令 描述 FLUSHDB 清空当前数据库的所有key FLUSHALL 清空整个Redis服务器的所有key DBSIZE 返回当前数据库的key的个数 DEL key [key …] 删...原创 2018-12-04 21:43:02 · 218 阅读 · 0 评论 -
《redis设计与实现》-9 单机数据库
一 序 第9章书上内容还是比较多的,主要是数据库的数量,切换,数据库键空间,设置键过期时间,过期删除策略,AOF对过期键的处理,数据库的通知等不同点去展开。下面接单总结下。二 数据库的实现 数据库结构,源码在server.htypedef struct redisDb { // 键值对字典,保存数据库中所有的键值对 dict *dict; ...原创 2018-12-04 00:14:14 · 335 阅读 · 0 评论 -
《redis设计与实现》-8对象总结
一 序 前面几篇文章分别整理了:8字符串对象 列表list list命令实现 hash对象 集合对象 有序集合zset 后面的几节就是回顾了对象的其他特性。下面简单汇总下。二 类型检查与命令多态2.1 类型检查 Redis 中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行, 比如说 DEL 命令、 EXPIRE 命令、 ...原创 2018-11-30 22:43:19 · 268 阅读 · 0 评论 -
《redis设计与实现》-8集合对象
一 序 之前的时候,拆二代(日天哥)问我集合的sdiff命令是怎么实现的?我说不知道,需要看代码才能知道。所以有了这篇。书上照例是举例说明编码及转换,还是按照惯例,先看编码、再看命令实现。谨以此文送给分享过disruptor的二代。二 t_set 之前在《redis设计与实现》-第8章object介绍过:一个集合类型的对象的编码有两种,分别是OBJ_ENCODING_HT和...原创 2018-11-28 23:28:56 · 254 阅读 · 0 评论 -
《redis设计与实现》-8 hash对象
一 序 昨天偷懒没有看代码,看了部电影《伸冤人2》,与中国的大侠不同,老外也有雷锋啊。明明是退役特工,却在生活中收敛锋芒,变成了滴滴快车的师傅,打戏占比不是全程从头打到尾的,却也干净利落。大段的镜头描写平静的美式中年生活。有一种大隐于市的感觉,喜欢主人公那种读书的感觉。 好吧,扯完闲篇开始 今天的读书生活。关于hash对象书上只是简单列了下编码格式及转换。后面整理命令的实现需要结合...原创 2018-11-28 00:44:16 · 303 阅读 · 0 评论 -
《redis设计与实现》-8 list命令实现
一 序 上一篇整理了《quicklist》底层数据结构的实现原理。Redis 3.2版本对外开放的列表list结构就是采用quicklist作为底层实现,所以编码上就只有OBJ_ENCODING_QUICKLIST,而quicklist底层又是ziplist.所以从list的接口层面来看,是基于quicklist的接口进行封装。源码在t_list.c. 可以结合quicklist的源码q...原创 2018-11-26 00:03:00 · 293 阅读 · 0 评论 -
《redis设计与实现》-8 列表list
一 序 书上这一节内容不是很多,3.0版本还是侧重讲了ziplist到linkedlist的实现。3.2已经用quiklist替代了。打算分两部分来整理。先看quicklist本身的结构特性,下一篇再看list的命令实现,二 quicklist 先说下背景吧,就是为啥用quicklist:1 考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节...原创 2018-11-25 00:36:24 · 319 阅读 · 0 评论 -
《redis设计与实现》-8字符串对象
今天下午去国家会议中心听了下gtic大会,孙玄老师讲的转转微服务化service mesh真好。接着看redis代码。一 编码及创建 字符串对象的编码可以是 int 、 raw 或者 embstr 。 源码在object.c/* Create a string object with EMBSTR encoding if it is smaller than * REIDS_E...原创 2018-11-23 23:46:26 · 371 阅读 · 0 评论 -
《redis设计与实现》-第8章object
一 序: 前面整理了edis基本的数据结构分别进行了简单的介绍,包括字符串、链表、哈希表、整数集合、压缩列表、压缩字典等,但是redis并不是直接使用这些数据结构来实现key-value对数据库的,而是基于这些数据结构为每一个对象创建一个对象robject。通过这五种不同类型的对象, Redis 可以在执行命令之前, 根据对象的类型来判断一个对象是否可以执行给定的命令。 使用对象的另一个好...原创 2018-11-22 13:30:24 · 442 阅读 · 0 评论 -
《redis设计与实现》-第7章压缩列表ziplist
一 序 压缩列表是 Redis 为了节约内存而开发的(上一篇还看了intset,都是时间换空间吧), 由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。书上分了两部分:介绍结构及连锁更新。本文也是从结构及API源码两部分。 ziplist是hash键以及zset键的底层实现之一(3.0之后list键已经不直接用ziplist和linkedlist作为底层...原创 2018-11-21 14:28:22 · 269 阅读 · 1 评论 -
《redis设计与实现》-第6章整数集合intset
一 序 intset是Redis集合的底层实现之一,当存储整数集合并且数据量较小的情况下Redis会使用intset作为set的底层实现。当数据量较大或者集合元素为字符串时则会使用dict实现set。这一章看书相对简单,看一下源码对应的api,发现自己对于字节序不懂,所以先把预备知识贴一下,熟悉的可以跳过无视了。 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端...原创 2018-11-19 21:32:51 · 356 阅读 · 0 评论 -
《redis设计与实现》-第5章跳跃表
一 序: 之前的文章<跳跃表的原理> 已经整理过,本篇看下redis的具体实现。以下摘自书上的介绍: 跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均 O(\log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。在大部分情况下, 跳跃表的效率可以和平...原创 2018-11-18 18:48:01 · 441 阅读 · 0 评论 -
《redis设计与实现》-4 字典
一 序 上一篇整理了redis的hash,其实算法看不懂是个人能力有限,但是剩下的没有那么复杂了,在理解了字典的结构后,主要是hash的扩容rehash等。所以,本篇分为两个部分,上面介绍结构,下面介绍api的部分实现,如扩容、缩容等。 Redis中的字典采用哈希表作为底层实现,一个哈希表有多个节点,每个节点保存一个键值对。C语言没有这个结构,所以redis构件自己的实现。字...原创 2018-11-17 00:04:09 · 238 阅读 · 0 评论 -
《redis设计与实现》-4字典中hash方法
一 序 本文打算整理hash,暂时看不懂大神的算法,先整理下来,至于redis字典结构啥的,文章很多了。大神的原著:http://www.concentric.net/~Ttwang/tech/inthash.htm 贴出来表示敬意,其实已经打不开了,好在有好心人有搬到github 了:https://gist.github.com/badboy/6267743 非常推荐。对了它...原创 2018-11-15 21:15:32 · 856 阅读 · 0 评论 -
《redis设计与实现》读书笔记-第三章链表
一 序: 书上这一章比较简单,redis链表就是一个双向链表的结构,每个元素都是一个结点。跟Java的linkedlist类似。所以它的插入和删除操作非常快,时间复杂度为 O(1),索引定位很慢,时间复杂度为 O(n)。主要列举下链表的特点: 双端:链表节点有prev 和next指针。 无环:头结点的prev跟尾节点的next都指向null。 带头尾指针:head...原创 2018-11-09 17:02:57 · 270 阅读 · 0 评论 -
《redis设计与实现》读书笔记
一 序 在看《redis设计与实现》,书中的版本毕竟是3.0的老一些了,荣有参考意义,代码以3.2版本为准。 字符串是Redis中最为常见的数据存储类型,其底层实现是简单动态字符串sds(simple dynamic string),是可以修改的字符串。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类...原创 2018-11-08 21:07:35 · 404 阅读 · 0 评论 -
redis 相关常见问题
1 redis与常见的key-value NOSQL的区别?为啥redis快? https://blog.youkuaiyun.com/bohu83/article/details/796097592. redis常见数据类型与使用场景?3. redis持久化怎么实现的?优缺点?4.redis 主从复制怎么实现的?5. redis主从切换过程?.6 redis集群如何实现的?7 redis key淘汰策略? ...原创 2018-03-22 20:06:06 · 513 阅读 · 0 评论 -
redis学习笔记(6):数据过期和淘汰策略:
Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况,目的是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。1清理时机为了防止一次性清理大量过期Key导致Redis服务受影响,Redis只在空闲时清理过期Key。Redis过期Key清理的机制对清理的频率和最大时间都有限制,在尽量不影响正常服务的情况下,进行过期Key的清理,以达到长时...原创 2018-03-21 18:27:10 · 564 阅读 · 0 评论 -
redis学习笔记(5):redis集群
目前到家业务规模,还没有使用redis集群。因为整理相关知识,补充此篇。没有亲自动手搭建集群进行测试,命令参考网上帖子。4.1TwemproxyTwemproxy是一个Twitter开源的一个Redis/Memcache代理服务器,使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,使用时在本需要连接redis的地方改为连接twemproxy,它会以一个代理的身份接收请求 并使...原创 2018-03-20 20:08:52 · 355 阅读 · 0 评论