文章 62
浏览 15135
哈希槽和一致性hash

哈希槽和一致性hash

- 首先,从使用 hash 取模数据分片开始说起 先从经典的 hash 取模数据分片说起 经典哈希取模分片的问题和对策: -** 一致性 hash 算法** 第一阶段,需要完成 key 到 slot 槽位之间的映射 第二阶段,需要完成 slot 槽位到 Redis node 节点之间的映射。 Hash 槽位环 一致性哈希原理: 经典场景 1:Key 入环 经典场景 2:新增 Redis 节点 经典场景 3:删除 Redis 节点 -** 经典哈希取模与一致性 hash 的对比:** -** 一致性 hash 的数据不平衡(数据倾斜)问题** 什么是 虚拟节点? 一致性 hash 的简易实现 回顾下一致性 Hash 算法 -** Redis 为什么使用哈希槽而不用一致性哈希** -** Redis Cluster 集群核心特点一:去中心化** 先看分布式集群的设计中的核心:元数据存储 设计。 中心化的 元数据存储架构 去中心化的 元数据存储架构 -** 去中心化场景如何保证元数据一致?** 问题 1:Redis 如何进行数据分片的? Redis cluster 哈希槽 增加节点 减少节点....

当 Redis 碰上 @Transactional,有大坑

当 Redis 碰上 @Transactional,有大坑

标题: 探索 Redis 与 @Transactional 注解的冲突之谜 正文: 前言 在我们的项目中,我们遇到了一个让人费解的生产环境问题:每天早上,当运营人员后台尝试创建新事件时,系统总是无法成功创建。经过重新启动相关微服务后,系统又能恢复正常运行,直到次日早上问题再次出现,又得重启服务。 初步调查 我们发现,问题出现在使用 Redis 生成唯一分布式 ID 的过程中。每天早上,Redis 的递增操作异常地返回了 null 值,导致后续流程中断。重新启动服务似乎是暂时的解决方法,但根本问题仍然悬而未决。 return redisTemplate.opsForValue().increment("count", 1); 深入探索 根据重启后就恢复正常,我们推测晚上执行了大量的 job,大量 Redis 连接未释放,当早上再来执行 Redis 操作时,执行失败。重启后,连接自动释放了。但是其他有使用到 Redis 的业务功能又是正常的,所以推测一的方向有问题,排除 。 通过查询 ```redisTemplate 递增的方法 increment` 源码注释, 发现事务&管道会返....

SDS数据结构

SDS数据结构

前言 之前工作中学习应用 Redis,只停留再 API 应用层,知其然,不知其所然,近在用 Redis 做大量的测试应用,发现关注与性能,后面激发自己想了解为啥 Redis 性能这么快,字符串结构是怎样,基于此,在网上找了下资料和看了下 <Redis5 设计与源码分析 >,有所感,记录下 Redis 用途 Redis 是目前最流行的键值对( key-value)数据库,以出色的性能著称,官方提供的数据是可以支持 100 000 以上的 +QPS。Redis 具有高性能的主要原因如下。 1 ) Redis 是基于内存的存储数据库,绝大部分的命令处理只是纯粹的内存操作,内存的读写速度非常快。 2) Redis 是单进程线程的服务(实际上一个正在运行的 Redis Server 肯定不止一个线程,但只有一个线程来处理网络请求),避免了不必要的上下文切换,同时不存在加锁/释放锁等同步操作。 3 ) Redis 使用多路 I/O 复用模型(select、poll、epoll),可以高效处理大量并发连接。 4 ) Redis 中的数据结构是专门设计的,增、删、改、查等操作相对简单。 简....

布隆过滤器使用

布隆过滤器使用

什么是布隆过滤器 布隆过滤器(Bloom Filter)是1970年由布隆提出的。 它实际上是一个很长的二进制向量 和一系列随机映射函数 。 布隆过滤器可以用于检索一个元素是否在一个集合中 。 它的优点是空间效率和查询时间都比一般的算法要好的多 ,缺点是有一定的误识别率和删除困难。 上面这句话可以理解为:有个二进制的集合 ,里面存放的0和1,0代表不存在,1代表存在,可以通过一些定义好的方法 快速判断元素是否在集合中。内部逻辑如下图展示 布隆过滤器有哪些作用 由于布隆过滤器的特性,能够判断一个数据可能在集合中 ,和一个数据绝对不在集合中 ,所以他可以用于以下场景 网页URL的去重(爬虫,避免爬取相同的 URL 地址) 垃圾邮件的判别 集合重复元素的判别 查询加速(比如基于key-value的存储系统) 数据库防止查询击穿,使用 BloomFilter 来减少不存在的行或列的磁盘查找(缓存穿透 )。 ... 演示一下布隆过滤器的用法 如何解决布隆过滤器无法删除数据的问题 升级版的布隆过滤器(Coun....

02-Redis持久化、主从与哨兵架构详解

02-Redis持久化、主从与哨兵架构详解

Redis持久化 RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。 比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集 save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可 还可以手动执行命令生成RDB快照,进入redis客户端执行命令save或bgsave可以生成dump.rdb文件,每次命令执行都会将所有redis内存快照到一个新的rdb文件里,并覆盖原有rdb快照文件。 bgsave的写时复制(COW)机制 Redis 借助操作系统提供的写时复制技术(Copy-On-Write, COW),在生成快照的同时,依然可以正常处理写命令。简单来说,bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RD....

01-Redis核心数据结构与高性能原理

01-Redis核心数据结构与高性能原理

Redis安装 下载地址:http://redis.io/download 安装步骤: # 安装gcc yum install gcc # 把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下,并解压 wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zxvf redis-5.0.3.tar.gz cd redis-5.0.3 # 进入到解压好的redis-5.0.3目录下,进行编译与安装 make # 修改配置 daemonize yes #后台启动 protected-mode no #关闭保护模式,开启的话,只有本机才可以访问redis # 需要注释掉bind #bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可) # 启动服务 src/redis-server redis.conf # 验证启动是否成功 ps -ef | grep redis # 进入....

人民有信仰 民族有希望 国家有力量