
redis
文章平均质量分 75
wangfy_
这个作者很懒,什么都没留下…
展开
-
######## redis各章节终篇索引 ############
关系:zset:ziplist(注意是可变长度的,下同)、skiplisthash:ziplisthashTable(是一种子结构,区别于hash)set:inset(有序列表,二分查找)、hashTablelist:quickList(由多个ziplist链接起来组成的)前置了解hashTable【string】【zset】【hash、set】【list】【bitmap】原创 2024-06-06 21:00:40 · 963 阅读 · 0 评论 -
#### redis bitmap ####
如果我们需要记录某一用户在一年中每天是否有登录我们的系统这一需求该如何完成呢?如果使用KV存储,每个用户需要记录365个,当用户量上亿时,这所需要的存储空间是惊人的。Redis 为我们提供了位图这一结构,每个用户每天的登录记录只占据一个比特位(0/1)。Bitmap的偏移量用来做key,Bitmap的比特位值的0/1用来做val。其实,Bitmap本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。Bitmaps 单独提供了一套命令。转载 2022-10-14 18:33:24 · 144 阅读 · 0 评论 -
#### redis cluster 槽位信息、故障转移 ####
1、clusterState.slots和clusterNode.slots(记录槽位信息的结构体)每个节点内都有clusterState.slots和clusterNode.slots这俩结构,clusterState.slots和clusterNode.slots是必须都存在的:(1)clusterState.slots用于花费O(1)的时间复杂度找到某个slot的处理节点。转载 2022-10-14 17:48:14 · 744 阅读 · 0 评论 -
#### redis集群模式:主从、哨兵sentinel、cluster ####
当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线。转载 2022-10-14 16:41:12 · 206 阅读 · 0 评论 -
#### redis hashTable数据结构(注意不是hash结构) ####
摘自 https://juejin.cn/post/7027096770303754248。转载 2022-10-14 11:19:50 · 172 阅读 · 0 评论 -
#### redis线程模型 ####
流程总结为,将主线程 IO 读写任务拆分出来给一组独立的线程处理,使得多个 socket 读写可以并行化,但是 Redis 命令还是主线程串行执行。主线程执行 IO 线程读取和解析出来的 Redis 请求命令;主线程阻塞等待 IO 线程将指令执行结果回写回。主线程清空全局队列,等待客户端后续的请求。主线程负责接收建立连接请求,获取。主线程阻塞等待 IO 线程读取。提高网络请求处理的并行度。放入全局等待读处理队列;主线程通过轮询将可读。分配给 IO 线程;转载 2022-10-03 16:27:09 · 122 阅读 · 0 评论 -
#### redis主从复制原理 ####
向master发送自己记录的旧master的replication id和offset,而master会计算与slave之间的数据偏移量,并将缓冲区中的偏移数量同步到slave,此时master和slave的数据一致。注意:而如果slave引用的replication太旧了,master与slave之间的数据差异太大,则master与slave之间会使用全量复制的进行数据同步。master会累积过期的key,积累一定的量之后,发送del命令到slave,删除slave上的key。转载 2022-10-03 16:00:26 · 102 阅读 · 0 评论 -
#### redis cluster mget 优化方案 ####
部分内容摘自:【redis cluster mget 引发的讨论 - 简书】【redis cluster如何高效率的跨节点间使用mget ? - 知乎】首先,cluster是不支持mutlikey操作的,例如:mget【mget】redis之上的中间层对mget包一层,方案:方案一:传统的串行IO操作,也就说n个key,分n次串行操作来获取key,复杂度是o(n)。方案二:将Mget操作(n个key),利用已知的hash函数算出key对应的节点,这样就可以得到一个这样的关系:原创 2022-03-15 14:05:26 · 3028 阅读 · 0 评论 -
Redis和MC的对比
转自:Redis和MC的对比仅做个人备份,浏览请看原文需求复杂方面Redis数据类型更丰富,MC只支持string类型(纯KV)数据持久化方面Redis支持持久化,而MC是纯内存(注意指的不是服务内存,而是启动mc中间件后的内存)高可用方面Redis原生支持集群模式,而MC还需要客户端去实现集群I/O模型方面Redis核心使用IO多路单线程模型,MC是多线程IO复用模型...转载 2021-07-05 14:51:11 · 360 阅读 · 0 评论 -
令牌桶限流之redis-cell模块
部分摘自:https://blog.youkuaiyun.com/yzf279533105/article/details/111310685仅做个人备份,浏览请看原文目录令牌桶算法 概念安装使用令牌桶算法 概念令牌桶算法的优势:令牌桶在应对突发流量的时候,桶内假如有 100 个令牌,那么这 100 个令牌可以马上被取走,而不像漏桶那样匀速的消费。所以在应对突发流量的时候令牌桶表现的更佳。详见:https://blog.youkuaiyun.com/chushoufengli/article/.转载 2021-04-09 17:04:07 · 312 阅读 · 0 评论 -
#### redis 事务/lua脚本/pipeline ####
事务Redis事务是一组命令的集合,将多个命令进行打包,然后这些命令会被顺序的添加到队列中,并且按顺序的执行这些命令。Redis事务中没有像Mysql关系型数据库事务隔离级别的概念,不能保证原子性操作,也没有像Mysql那样执行事务失败会进行回滚操作。这个与Redis的特点:「快速、高效」有着密切的关联,「因为一些列回滚操作、像事务隔离级别那这样加锁、解锁,是非常消耗性能的」。所以,Redis中执行事务的流程只需要简单的下面三个步骤:开始事务(MULTI) 命令入队 执行事务(EXEC)原创 2021-03-28 20:11:24 · 886 阅读 · 2 评论 -
redis事务
转自:https://zhuanlan.zhihu.com/p/235466985仅做个人备份,浏览请看原文目录概述事务命令的3 个阶段ACID特性网络读写详述Redis 事务的几个命令一帆风顺事务中的错误为什么 Redis 不支持回滚带 Watch 的事务WATCH 命令的实现原理概述事务命令的3 个阶段开启:以 MULTI 开始一个事务 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面..转载 2021-03-28 19:56:41 · 180 阅读 · 0 评论 -
redis故障转移原理,以及go-redis连接集群的地址数组
目录go-redis连接集群的配置,尤其看地址数组redis故障转移原理前提一、故障模拟三、机制解读go-redis连接集群的配置,尤其看地址数组转自:https://blog.youkuaiyun.com/pengpengzhou/article/details/105559884 client := redis.NewClusterClient(&redis.ClusterOptions{ //-----------------------------------.转载 2021-03-28 19:30:17 · 927 阅读 · 0 评论 -
#### redis cluster 集群架构、原理、通信协议 ####
转自:https://juejin.cn/post/6844904002098823181仅做个人备份,浏览请看原文目录Redis Cluster 原理及协议结点状态信息结构Gossip协议的概念Gossip协议的使用基于Gossip协议的故障检测官方集群引入slot的概念进行数据分片,之后将数据slot分配到多个Master结点,Master结点再配置N个从结点,从而组成了多实例sharding版本的官方集群架构。Redis Cluster 是一个可以在多个..转载 2021-03-26 14:38:39 · 821 阅读 · 0 评论 -
redis——6.0版前的单线程 vs 6.0版后的多线程
部分内容摘自:https://juejin.cn/post/6844904148832354312https://cloud.tencent.com/developer/article/1483779仅做个人备份,浏览请看原文6.0版前的单线程严格讲,6.0版前也并不是单线程。有后台线程在工作,处理一些较为缓慢的操作,例如无用连接的释放、大key的删除等。client端命令的请求获取 (socket 读)、解析、执行、内容返回 (socket 写) 都是由一个线程处理【概括为:处理.转载 2021-03-26 11:29:02 · 236 阅读 · 0 评论 -
#### redis里string结构底层——简单动态字符串(SDS)####
摘自:https://juejin.cn/post/6844903936520880135仅做个人备份,浏览请看原文Redis是用C语言写的,但是Redis并没有使用C的字符串表示(C是字符串是以\0空字符结尾的字符数组),而是自己构建了一种简单动态字符串(simple dynamic string,SDS)的抽象类型,并作为Redis的默认字符串表示。源码结构体的组成len:记录当前已使用的字节数(不包括'\0'),获取SDS长度的复杂度为O(1) alloc:记录当前字节数组总共.转载 2021-03-22 16:13:15 · 182 阅读 · 0 评论 -
#### redis里list结构底层——quickList,以及ziplist ####
摘自:https://zhuanlan.zhihu.com/p/102422311仅做个人备份,浏览请看原文quickListquickList是一个ziplist组成的双向链表。每个节点使用ziplist来保存数据。本质上来说,quicklist里面保存着一个一个小的ziplist。结构如下:源码typedef struct quicklistNode { struct quicklistNode *prev; //上一个node节点 struct qu.转载 2021-03-22 16:03:27 · 536 阅读 · 0 评论 -
#### 几个限流算法 ####
转自:https://segmentfault.com/a/1190000023552181仅做个人备份,浏览请看原文目录限流是什么?为什么要限流?常见的限流算法计数限流固定窗口限流固定窗口临界问题滑动窗口限流漏桶算法令牌桶算法限流算法小结单机限流和分布式限流限流的难点限流组件最后限流是什么?首先来解释下什么是限流?在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000.转载 2021-03-18 14:42:09 · 590 阅读 · 0 评论 -
#### 简述 redis cluster 架构 ####
摘自:https://www.jianshu.com/p/1ef5ce24d7fa仅做个人备份,浏览请看原文Redis Cluster是Redis的分布式解决方案,在3.0版本正式推出,解决单master架构的内存、并发、流量等瓶颈,以达到负载均衡的目的。每个master负责整个集群的一部分数据,每个节点负责数据多少可能不一样 每个master的角色是对等的 每个master节点都可以有N个slave节点,当一个master节点挂掉后,它的其中一个slave节点升级为mast..转载 2021-03-11 13:15:37 · 164 阅读 · 0 评论 -
#### redis hash(ziplist/hashtable)、set(inset/hashtable) ####
转自:https://juejin.cn/post/6863258283483807752仅做个人备份,浏览请看原文1. hashhash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable。(1) ziplisthash对象只有同时满足以下条件,才会采用ziplist编码:hash对象保存的键和值字符串长度都小于64字节 hash对象保存的键值对数量小于512 ziplist存储的结构如下当数据量比较小的时候,我们会将所有的key及value都当成.转载 2021-03-10 20:38:30 · 746 阅读 · 1 评论 -
docker搭建redis cluster(Mac)
转自:https://github.com/modouxiansheng/about-docker/tree/master/redis-cluster仅做个人备份,浏览请看原文本文只是记录一下我在Mac上利用Docker搭建Redis集群成功后的步骤,期间走了许多的坑。有许多教程对于Mac用户不友好,搭建成功以后无法进行集群间的通信。首先说明一下有多简单,如果你机器上已经有了Docker,那么就一个步骤就行。如果没有Docker那么在Docker下载下载一个就行。接下来我们就开始进行R.原创 2020-12-15 13:38:14 · 456 阅读 · 0 评论 -
分布式锁
转自:https://books.studygolang.com/advanced-go-programming-book/ch6-cloud/ch6-01-lock.html仅做个人备份,浏览请看原文6.1 分布式锁在单机程序并发或并行修改全局变量时,需要对修改行为加锁以创造临界区。为什么需要加锁呢?可以看看下段代码:package mainimport ( "sync")// 全局变量var counter intfunc main() { var.转载 2020-12-15 10:53:44 · 166 阅读 · 0 评论 -
#### Redis Cluster 限制及解决方案 ####
转自:https://www.cnblogs.com/lovezbs/p/13885569.html仅供个人备份,浏览请务必查看原文1. 概述Redis Cluster 是 Redis 原生的数据分片实现,可以自动在多个节点上分布数据,不需要依赖任何外部的工具。Redis Cluster 中所有 key 会被分派到16384个slot(hash 槽)中,这些 slot 又会被指派到多个 Redis 节点上。一个 key 会映射到某个 slot,算法:HASH_...原创 2020-12-08 18:24:50 · 3587 阅读 · 0 评论 -
#### Redis Cluster 集群 ####
【转发声明!!!】转自作者:Kevin_ZGJ链接:https://www.jianshu.com/p/c869feb5581d来源:简书仅作个人备份以便后期回顾,大家浏览务必请看原文,原文更详细。感谢作者的干货~前言Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Redis集群。本文参考了Rdis的官方文档和使用Redis官方提供的Redis ...转载 2020-06-14 13:21:00 · 386 阅读 · 0 评论 -
#### redis 缓存穿透、击穿、雪崩、数据一致性 ####
// 解决缓存穿透if exist := bloomFilter.find(ID); !exist { return err("not found")}// 先查询redisif v, ok := redis.get(ID); ok { return v}// 再查询mysqllock(ID) // 使用redis实现的分布式锁,解决缓存击穿// 再查询一次redisif v, ok := redis.get(ID); ok { return v}if.原创 2020-06-14 13:04:34 · 749 阅读 · 2 评论 -
redis集群数据分片原理——哈希槽
哈希槽redis集群用的是哈希槽,而不是简单哈希和一致性哈希。槽位的转移,即为槽位ID不变,而是槽位地址变了。集群只需要记住槽位ID和槽位地址映射就可以了。crc计算一个key的结果是一个恒定的槽位ID,即使是槽位发生了迁移,集群根据槽位ID还是可以找到槽位新地址的。简单哈希(摘自:https://www.jianshu.com/p/6ad87a1f070e 仅作个人备份,浏览请看原文)假设有三台机,数据落在哪台机的算法为:c = Hash(key) % 3例如 key A.原创 2020-06-12 22:40:46 · 2344 阅读 · 0 评论 -
#### redis的zset数据结构底层实现——跳表 ####
声明仅作个人备份,浏览请看原文转自链接:https://juejin.im/post/5e075c9b6fb9a0164c7bbbd7作者:lee4007来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。zset的两种实现方式ziplist:满足以下两个条件的时候 元素数量少于128的时候 每个元素的长度小于64字节 skiplist:不满足上述两个条件就会使用跳表,具体来说是组合了map和skiplist map用来存储member到.转载 2020-06-07 16:38:14 · 3491 阅读 · 0 评论 -
Redis分布式锁的简单实现——set命令及参数
EXsecond:设置键的过期时间为second秒。SETkeyvalueEXsecond效果等同于SETEXkeysecondvalue。 PXmillisecond:设置键的过期时间为millisecond毫秒。SETkeyvaluePXmillisecond效果等同于PSETEXkeymillisecondvalue。 NX:...原创 2020-02-14 14:32:21 · 1842 阅读 · 0 评论 -
redis item
例如子评论数减的时候,用脚本减,先判断字段的值redis.result val, err原创 2019-11-08 18:25:27 · 399 阅读 · 0 评论 -
redis缓冲区
使用缓冲区,在get、set动作时做一些事情func (r *RedisClient) GetStructValue(key string, value interface{}) error { codec := &cache.Codec{ Redis: r.Client, Marshal: func(v interface{}) ([]byte, error) { r...原创 2019-10-31 17:10:34 · 576 阅读 · 0 评论 -
redis - 序列化/hashmap - 存储/读取
// 序列化 存储func (r *RedisClient) SetStructValue(key string, value interface{}, expiration time.Duration) error { codec := &cache.Codec{ Redis: r.Client, Marshal: func(v interface{}) ([]byte, ...原创 2019-10-14 12:26:47 · 875 阅读 · 0 评论 -
redis scan
栗:func (s *commentRedisStore) SyncArticleCommentActionChanged() error { randomKey, err := utils.GetNO(commonModel.InfoType(89), 0, s.RedisClient) sourceKey := utils.GetArticleCommentActionChanged...原创 2019-09-15 17:49:17 · 827 阅读 · 0 评论 -
redis 坑位 及解决
1. time类型的转换//struct映射func (s *commentRedisStore) CommentMapToStruct(commentInfo *model.CommentInfo, mapValue map[string]string) error { decoder, _ := mapstructure.NewDecoder(&mapstructure.De...原创 2019-09-07 09:20:41 · 385 阅读 · 0 评论 -
redis 存对象用 hashmap or 序列化
原子性(atomicity):一个事务是一个不可分割的最小工作单位,事务中包括的诸操作要么都做,要么都不做。Redis所有单个命令的执行都是原子性的,这与它的单线程机制有关;Redis命令的原子性使得我们不用考虑并发问题,可以方便的利用原子性自增操作实现简单计数器功能;-----------------------------------------所以,对象一般用has...原创 2019-09-04 11:54:45 · 2129 阅读 · 0 评论 -
redis key 命名规范
转自:https://www.cnblogs.com/caolyl/p/10607305.html1.建议全部大写2.key不能太长也不能太短,键名越长越占资源,太短可读性太差3.key 单词与单词之间以 : 分开4.redis使用的时候注意命名空间,一个项目一个命名空间,项目内业务不同命名空间也不同。一般情况下: 1) 第一段放置项目名或缩写 如 project...转载 2019-08-30 11:21:10 · 691 阅读 · 0 评论 -
####### redis持久化rdb、aof #######
转自:https://juejin.im/post/5bcab6f46fb9a05d3c802ea6转自:https://blog.youkuaiyun.com/bible_reader/article/details/84138665仅做个人备份笔记以备查看使用,请移步原文https://juejin.im/post/5bcab6f46fb9a05d3c802ea6Redis 是一个...原创 2019-08-17 14:10:05 · 126 阅读 · 0 评论 -
my note for redis
redis 基础教程https://www.runoob.com/redis/redis-sorted-sets.html其他博文https://blog.youkuaiyun.com/qq_42093488/article/details/82149385redis特点Redis SET 如果 key 已经存储其他值,就覆写旧值redis类型string在单一,list没有判...原创 2019-08-15 10:59:44 · 130 阅读 · 0 评论 -
redis pipe
redis nil err寻找1922902342900000103-23,但是redis里没有,返回的cacheList里则会:val=""baseCmd: args: 有东西 err: redis nillval为数组时多个pipe多个时,返回的是交替的,长度为len(单pipe时)*N,N为几个pipepipe := s.Redi...原创 2019-08-19 12:10:36 · 643 阅读 · 0 评论