
redis
微笑看你哭
这个作者很懒,什么都没留下…
展开
-
Redis(一)——基础数据结构
Redis有5个基本数据结构,string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了。string首先我们从string谈起。string表示的是一个可变的字节数组,我们初始化字符串的内容、可以拿到字符串的长度,可以获取string的子串,可以覆盖string的子串内容,可...转载 2019-02-28 17:01:15 · 226 阅读 · 0 评论 -
Redis(十三)——Sentinel和Cluster
Sentinel目前我们讲的 Redis 还只是主从方案,最终一致性。读者们可思考过,如果主节点凌晨 3 点突发宕机怎么办?就坐等运维从床上爬起来,然后手工进行从主切换,再通知所有的程序把地址统统改一遍重新上线么?毫无疑问,这样的人工运维效率太低,事故发生时估计得至少 1 个小时才能缓过来。如果是一个大型公司,这样的事故足以上新闻了。所以我们必须有一个高可用方案来抵抗节点故障,当故障发生时可以...转载 2019-03-03 15:00:44 · 2131 阅读 · 0 评论 -
Redis(十八)——Redisson
Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数据库提供的一系列优势,基于Java实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服...原创 2019-03-03 14:58:39 · 1128 阅读 · 0 评论 -
Redis(十七)——底层源码实现
Redis的对象redisObject当我们执行set hello world命令时,会有以下数据模型:dictEntry: Redis给每个key-value键值对分配一个dictEntry,里面有着key和val的指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希值相同的键值对链接在一起,由此来解决哈希冲突问题(链地址法)。sds: 键key“hello”是以...原创 2019-03-03 14:59:05 · 511 阅读 · 0 评论 -
Redis(十六)——Lua脚本
Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题。Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执行自定义动作,获取脚本的响应数据。Redis 服务器会单线程原子性执行 lua 脚本,保证 lua 脚本在处理的过程中不会被任意其它请求打断。比如在分布式锁小节,我们提到了 del_if_equa...转载 2019-03-03 14:59:23 · 170 阅读 · 0 评论 -
Redis(十五)——LRU
当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。当实际内存超出 maxmemory 时,R...转载 2019-03-03 14:59:43 · 192 阅读 · 0 评论 -
Redis(十四)——过期策略
Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除。你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割。你还可以进一步站在死神的角度思考,会不会因为同一时间太多的 key 过期,以至于忙不过来。同时因为 Redis 是单线程的,收割的时间也会占用线程的处理时间,如果收割的太过于繁忙,会不会导致线上读写指令出现卡顿。这些问题 An...转载 2019-03-03 15:00:28 · 166 阅读 · 0 评论 -
Redis(十四)——缓存雪崩、缓存穿透、缓存并发
缓存雪崩数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。比如一个雪崩的简单过程:1、redis集群大面积故障2、缓存失效,但依然大量请求访问缓存服务redis3、redis大量失效后,大量请求转向到mysql数据库4、mysql的调用量暴增,很快就扛不住了,甚至直接宕机5、由于大量的应用服务依赖mysql和re...原创 2019-03-08 11:26:24 · 579 阅读 · 0 评论 -
Redis-Cluster
RedisCluster 是 Redis 的亲儿子,它是 Redis 作者自己提供的 Redis 集群化方案。数据分区方式哈希节点数取余是在客户端分片。优点简单。缺点:扩容影响太大!添加节点的时候整个数据会做很多偏移。3个节点扩容添加1个节点,会发生80%的数据迁移。如果用这个中方式做数据分布,扩容的时候建议使用多倍扩容。比如3个节点,扩容的时候,再添加3个节点,这样只会发生50%的数据...转载 2019-04-28 18:18:56 · 505 阅读 · 0 评论 -
Redis Sentinel知识总结
主从复制的优点和问题优点:从节点是主节点的一个备份,能在主节点宕机之后作为备份。能够读写分离减轻主节点的压力。问题:如果主节点宕机需要手动进行故障转移。如果使用脚本也无法周密的考虑所有情况,例如:怎样判断主节点宕机?设置哪个从节点作为主节点?Redis Sentinel是官方提供的监控并自动故障转移的组件。Redis Sentinel架构简介redis集群对应redis集群...原创 2019-04-23 15:36:23 · 229 阅读 · 0 评论 -
Redis(十二)——主从同步
很多企业都没有使用到 Redis 的集群,但是至少都做了主从。有了主从,当 master 挂掉的时候,运维让从库过来接管,服务就可以继续,否则 master 需要经过数据恢复和重启的过程,这就可能会拖很长的时间,影响线上业务的持续服务。在了解 Redis 的主从复制之前,让我们先来理解一下现代分布式系统的理论基石——CAP 原理。CAP 原理CAP 原理就好比分布式领域的牛顿定律,它是分布式...转载 2019-03-03 15:00:06 · 192 阅读 · 0 评论 -
Redis(十一)——事务
为了确保连续多个操作的原子性,一个成熟的数据库通常都会有事务支持,Redis 也不例外。Redis 的事务使用非常简单,不同于关系数据库,我们无须理解那么多复杂的事务模型,就可以直接使用。不过也正是因为这种简单性,它的事务模型很不严格,这要求我们不能像使用关系数据库的事务一样来使用 Redis。Redis 事务的基本使用每个事务的操作都有 begin、commit 和 rollback,beg...转载 2019-03-03 14:59:57 · 241 阅读 · 0 评论 -
Redis(二)——分布式锁
分布式应用进行逻辑处理时经常会遇到并发问题。比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个操作不是原子的。(Wiki 解释:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch 线程切换。)这个时候就要使...转载 2019-02-28 17:11:31 · 452 阅读 · 0 评论 -
Redis(三)——延时队列
对于那些只有一组消费者的消息队列,使用 Redis 就可以非常轻松的搞定。Redis 的消息队列不是专业的消息队列,它没有非常多的高级特性,没有 ack 保证,如果对消息的可靠性有着极致的追求,那么它就不适合使用。异步消息队列Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用lpop 和 rpop来出队列。> rpush ...转载 2019-02-28 17:25:13 · 367 阅读 · 0 评论 -
Redis(四)——HyperLogLog
在开始这一节之前,我们先思考一个常见的业务问题:如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现?如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器就可以了,这个计数器的 key 后缀加上当天的日期。这样来一个请求,incrby 一次,最终就可以统计出所有的 PV 数据。但是 UV 不一样,它要...转载 2019-02-28 17:42:23 · 1647 阅读 · 0 评论 -
Redis(五)——布隆过滤器
上一节我们学会了使用 HyperLogLog 数据结构来进行估数,它非常有价值,可以解决很多精确度不高的统计需求。但是如果我们想知道某一个值是不是已经在 HyperLogLog 结构里面了,它就无能为力了,它只提供了 pfadd 和 pfcount 方法,没有提供 pfcontains 这种方法。讲个使用场景,比如我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,...转载 2019-02-28 17:56:40 · 3572 阅读 · 0 评论 -
Redis(六)——限流
限流算法在分布式领域是一个经常被提起的话题,当系统的处理能力有限时,如何阻止计划外的请求继续对系统施压,这是一个需要重视的问题。老钱在这里用 “断尾求生” 形容限流背后的思想,当然还有很多成语也表达了类似的意思,如弃卒保车、壮士断腕等等。除了控制流量,限流还有一个应用目的是用于控制用户行为,避免垃圾请求。比如在 UGC 社区,用户的发帖、回复、点赞等行为都要严格受控,一般要严格限定某行为在规定时...转载 2019-02-28 18:15:08 · 3264 阅读 · 2 评论 -
Redis(七)—— GeoHash
Redis 在 3.2 版本以后增加了地理位置 GEO 模块,意味着我们可以使用 Redis 来实现摩拜单车「附近的 Mobike」、美团和饿了么「附近的餐馆」这样的功能了。用数据库来算附近的人地图元素的位置数据使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。比如掘...转载 2019-02-28 18:22:52 · 277 阅读 · 0 评论 -
Redis(八)——Scan
在平时线上 Redis 维护工作中,有时候需要从 Redis 实例成千上万的 key 中找出特定前缀的 key 列表来手动处理数据,可能是修改它的值,也可能是删除 key。这里就有一个问题,如何从海量的 key 中找出满足特定前缀的 key 列表来?Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。127.0.0.1:6379> set cod...转载 2019-02-28 18:38:15 · 652 阅读 · 0 评论 -
Redis(九)——线程 IO 模型
Redis 是个单线程程序也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉,它就是单线程,你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程,除了 Redis 之外,Node.js 也是单线程,Nginx 也是单线程,但是它们都是服务器高性能的典范。Redis 单线程为什么还能这么快?因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为 Redis 是单线程,所以要...转载 2019-02-28 18:48:28 · 194 阅读 · 0 评论 -
Redis(十)——持久化
Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。Redis 的持久化机制有两种,第一种是快照,第二种是 AOF 日志。快照是一次全量备份,AOF 日志是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本。AOF...转载 2019-02-28 21:45:52 · 139 阅读 · 0 评论 -
Redis使用场景
分布式锁计数器:在互联网行业,我们经常会看到文章都有统计关注数,浏览数,这些数据都需要实时变化这里使用Redis以下两个api可以实现:INCR key //INCR readcount:{帖子id} 每浏览一次GET key //GET readcount:{帖子id} 获取浏览量分布式全局序列在分布式架构中,通常会涉及到全局序列增...原创 2019-04-29 10:49:02 · 157 阅读 · 0 评论