redis分布式

RocketMQ学习笔记(14)----RocketMQ的去重策略

白昼怎懂夜的黑 提交于 2020-03-23 06:51:24
1. Exactly Only Once   (1). 发送消息阶段,不允许发送重复的消息   (2). 消费消息阶段,不允许消费重复的消息。   只有以上两个条件都满足情况下,才能认为消息是“Exactly Only Once”,而要实现以上两点,在分布式系统环   境下,不可避免要产生巨大的开销。所以RocketMQ 为了追求高性能,并不保证此特性,要求在业务上进行去重,也就是说消费消息要做到幂等性。RocketMQ 虽然不能严格保证不重复,但是正常情况下很少会出现重复发送、消 费情况,只有网络异常,Consumer 启停等异常情况下会出现消息重复。   此问题的本质原因是网络调用存在不确定性,即既不成功也不失败的第三种状态,所以才产生了消息重复性问 题。 2. 重复消费的原因   在于回馈机制。正常情况下,消费者在消费消息时候,消费完毕后,会发送一个ACK确认信息给消息队列(broker),消息队列(broker)就知道该消息被消费了,就会将该消息从消息队列中删除。 不同的消息队列发送的确认信息形式不同,例如RabbitMQ是发送一个ACK确认消息,RocketMQ是返回一个CONSUME_SUCCESS成功标志,kafka实际上有个offset的概念。   造成重复消费的原因?,就是因为网络原因闪断,ACK返回失败等等故障,确认信息没有传送到消息队列

Windows下安装Redis

对着背影说爱祢 提交于 2020-03-22 17:51:34
  Redis作为一款NoSQL的热门分布式数据库,同时也是一款热门的分布式缓存,作为广大的Windows用户们,我们如何安装呢?很遗憾,它没有Windows版本。但有一群人自己鼓捣了一个Windows平台的redis,虽然目前已经3年没有更新,我们也只能将就着用了。 https://github.com/MicrosoftArchive/redis 是它的github地址,最新版本是3.2.100,进入到发布目录下 https://github.com/MicrosoftArchive/redis/releases -> 点开Assets -> 下载Redis-x64-3.2.100.zip -> 解压后打开管理员命令行,进入到解压目录执行启动命令(我本地是D盘Dev目录): C:\WINDOWS\system32>D: D:\>cd Dev\Redis-x64-3.2.100 D:\Dev\Redis-x64-3.2.100>redis-server.exe redis.windows.conf _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.2.100 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode

redis 缓存击穿 3

坚强是说给别人听的谎言 提交于 2020-03-22 17:00:21
什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义。如果在大流量下数据库可能挂掉。这就是缓存击穿。 场景如下图所示: 我们正常人在登录首页的时候,都是根据userID来命中数据,然而黑客的目的是破坏你的系统,黑客可以随机生成一堆userID,然后将这些请求怼到你的服务器上,这些请求在缓存中不存在,就会穿过缓存,直接怼到数据库上,从而造成数据库连接异常。 解决方案 在这里我们给出三套解决方案,大家根据项目中的实际情况,选择使用. 讲下述三种方案前,我们先回忆下redis的setnx方法 SETNX key value 将 key 的值设为 value ,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 可用版本 :>= 1.0.0 时间复杂度 : O(1) 返回值 : 设置成功,返回 1。设置失败,返回 0 。 效果如下 redis > EXISTS job # job 不存在 ( integer ) 0 redis > SETNX job "programmer" # job 设置成功 ( integer ) 1

Redis集群方案

二次信任 提交于 2020-03-21 12:32:09
3 月,跳不动了?>>> 单机 redis最主要的适用场景:少量数据存储,高速读写访问,数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能。 分布式 随着用户量的增长,数据量随之增长,大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,这时候我们需要横向扩展,多台主机共同提供服务,既分布多个redis协同工作。大致有如下几种集群方案: 方案一:Redis官方集群方案Redis Cluster Redis Cluster由3.0版本正式推出,是一种服务器sharding技术,对客户端来说是完全透明的。 Redis Cluster中,Sharding采用slot(槽)的概念,一共分成16384个槽。对于每个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简单,就是CRC16后16384取模。 Redis集群中的每个node(节点)负责分摊这16384个slot中的一部分,也就是说,每个slot都对应一个node负责处理。当动态添加或减少node节点时,需要将16384个槽做个再分配,槽中的键值也要迁移。当然,这一过程,在目前实现中,还处于半自动状态,需要人工介入。 Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效

分布式redis

末鹿安然 提交于 2020-03-21 04:44:07
一. 水平拆分 sharding 1. 解决数据量和访问量增加后对单节点造成的性能压力;水平拆分后的每个节点存储和处理的数据原则上没有交集; 2. 数据分布: hash映射:将不可控的业务值域key均匀映射到可控的有限值域(hash值)上,再将均匀分布的hash值枚举的映射到redis实例上; 范围映射:选择key本身而不是key的某个运算值作为数据分布的条件,且每个数据节点存放的key的值域是连续的; hash和范围映射:典型的方式是一致性hash,首先对key进行hash运算,得到值域有限的hash值,再对hash值做范围映射; 3. 请求路由 只读的跨实例请求需要将请求中的多个key分别分发到对应实例上执行,再合并结果; 跨实例的原子读写请求中,实例B的写入操作依赖于实例A的读取,没有单线程特性保证并发安全,因此原子请求是不支持的; 二. 主备复制 replication 1. 当某个节点宕机时,其上的数据在其他节点上有副本;同一份数据在多个节点上存储,可以分离读取和写入操作; 2. 主备复制流程 redis包含master和slave两种节点,master提供读写服务,slave作为master的数据备份拥有master的全量数据,不提供写服务; slave启动后触发SYNC命令,master被动的讲新进slave节点加入主备复制集群;

redis数据结构

我怕爱的太早我们不能终老 提交于 2020-03-19 00:22:28
踩在各个巨人的肩膀上写的,感谢涉及到的各位巨人!!!特别是钱老师(redis深度历险)! redis:web项目中间件、缓解数据库压力、分布式锁等。 Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。 string ( 字符串) redis的字符串不同于Java的字符串,redis的字符串是动态字符串,类似于Java的ArrayList,采用预分配--减少内存分配的频繁度。 涉及到的命令:     (单key操作)set 、get、del     (批量操作)mget name1 name2 name3;mset name1 boy name2 girl name3 unknown 在此基础上可以设置过期时间;set name 6 value list ( 列表) Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。 Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表

基于Redis的开源分布式服务Codis

喜你入骨 提交于 2020-03-17 19:51:46
Redis在豌豆荚的使用历程——单实例==》多实例,业务代码中做sharding==》单个Twemproxy==》多个Twemproxy==》Codis,豌豆荚自己开发的分布式Redis服务。在大规模的Redis使用过程中,他们发现Redis受限于多个方面:单机内存有限、带宽压力、单点问题、不能动态扩容以及磁盘损坏时的数据抢救。 Redis通常有3个使用途径:客户端静态分片,一致性哈希;通过Proxy分片,即Twemproxy;还有就是官方的Redis Cluster,但至今无一个新版本。随后刘奇更详细的分析了为什么不使用Twemproxy和Redis Cluster: Twemproxy:最大的痛点是无法平滑的扩容或者缩容,甚至修改配置都需要重启服务;其次,不可运维,甚至没有Dashboard。 Redis Cluster(官方):无中心化设计,程序难以编写;代码有点吓人,clusterProcessPacket函数有426行,人脑难以处理所有的状态切换;迟迟没有正式版本,等了4年之久;目前还缺乏最佳实践,没有人编写Redis Cluster的若干条注意事项;整个系统高度耦合,升级困难。 虽然我们有众多的选择,比如 Tair 、 Couchbase 等,但是如果你需要更复杂和优秀的数据结构, Redis 可称为不二之选。基于这个原因,在 Redis 之上,豌豆荚设计了 Codis

redis 主从分布式

。_饼干妹妹 提交于 2020-03-17 15:13:35
某厂面试归来,发现自己落伍了!>>> 1.测试环境 master: 127.0.0.1 6379 slave1: 127.0.0.1 6479 slave2: 127.0.0.1 6579 master-sentinel: 127.0.0.1 26379 slave1-sentinel: 127.0.0.1 26479 slave2-sentinel: 127.0.0.1 26579 2.下载安装redis 2.8.3 cd wget http://download.redis.io/releases/redis-2.8.3.tar.gz tar –zxvf redis-2.8.3.tar.gz cd redis-2.8.3 make;make install(此处可用PREFIX参数将redis安装到其他目录) 3.配置测试环境 ----创建目录: cd /usr/local mkdir redis_cluster mkdir redis_cluster/master_6379 mkdir redis_cluster/slave_6479 mkdir redis_cluster/slave_6579 ----配置redis: master: cp –a –R –p ~/redis-2.8.3/redis.conf ./redis_cluster/master_6379/ cp

Redis分布式集群实战(2)——主从同步及哨兵模式

五迷三道 提交于 2020-03-17 02:14:38
一、Redis主从同步 1、主从复制概念 主从复制模型中,有多个redis节点。 其中,有且仅有一个为主节点Master。从节点Slave可以有多个。 只要网络连接正常,Master会一直将自己的数据更新同步给Slaves,保持主从同步。 2、特点 (1)主节点Master可读、可写. (2)从节点Slave只读。(read-only) 因此,主从模型可以提高读的能力,在一定程度上缓解了写的能力。因为能写仍然只有Master节点一个,可以将读的操作全部移交到从节点上,变相提高了写能力。 3、实验 实验环境: 本实验搭建主从同步,一主两备 server1虚拟机作主Redis缓存数据库: ip为:172.25.76.1 关闭防火墙及selinux server2虚拟机作备Redis缓存数据库: ip为:172.25.76.2 关闭防火墙及selinux server3虚拟机作备Redis缓存数据库: ip为:172.25.76.3 关闭防火墙及selinux 实验步骤: 主Redis(server1)上: yum install -y gcc -y #下载GNU编译器套件gcc tar zxf redis-5.0.3.tar.gz #解压redis安装包 cd redis-5.0.3 进入解压目录 make #编译 make install #安装 cd utils/ .

redis-主从复制(sentinel)

本小妞迷上赌 提交于 2020-03-15 23:46:53
前言 redis的持久化功能在一定程度上保证了数据的安全性,即便时服务器宕机的情况下,也可以保证数据的丢失非常少,通常,为了避免服务的单点故障,会把数据复制到多个副本放在不同的服务器上,且这些拥有数据副本的服务器可以用于处理客户端的读请求,扩展整体的性能,下面将介绍redis的主从复制。 1,主从复制概述 redis的复制功能是支持多个服务器之间的数据同步。被复制的服务器称为主服务器(master),对服务器进行复制操作的为从服务器(slave),主服务器master可以进行读写操作,当发生写操作的时候自动将数据同步到从服务器,而从服务器一般是只读的,并接收master同步过来的数据,一个master可以有多个slave,而一个slave只能由一个master。 主从复制的过程: 1,从节点执行slaveof命令; 2,从节点只是保存了slavef命令中主节点的信息,并没有立即发起复制; 3,从节点内部的定时任务发现由主节点的信息,开始使用socket连接主节点; 4,连接建立成功后,发送ping命令,希望得到pong命令响应,否则会进行重连; 5,如果主节点设置了权限,那么就需要进行权限验证;如果验证失败,复制终止; 6,权限验证通过后,进行数据同步,这是耗时最长的操作,主节点将把所有的数据全部发送给从节点; 7,当主节点把当前的数据同步给从节点后,便完成了复制的建立流程