Redis

3306π北京站拍了拍你

帅比萌擦擦* 提交于 2021-02-04 19:31:11
社区的线上活动又来了,开源软件所具有的分享精神,体现在方方面面,拥抱开源,加入开源社区的大家庭! 错过了618?没关系 8月8号有一场不容错过的数据库盛宴等你来 不需要定金,不需要尾款,统统免费 这里有MySQL 8.0、Redis、分布式、Proxy... 活动议程 嘉宾介绍 主题一 MySQL 8.0 自动升级与新的错误日志 徐轶韬 MySQL解决方案高级工程师 Oracle公司MySQL解决方案工程师,为中国及东北亚地区的MySQL用户提供MySQL相关产品的售前咨询,企业级产品介绍服务以及推广和普及MySQL数据库在社区的使用 内容简介 MySQL8.0做出了巨大的改变,本次为您分享MySQL8.0的自动升级、注意事项和MySQL8.0新的错误日志 主题二 Redis sentinel原理及实现源码剖析 冯光普 数据库负责人 新零售电商多点Dmall数据库负责人,负责大规模MySQL、Redis、MongoDB集群运维、架构、平台建设。曾在阿里巴巴数据库团队,负责AliSQL分支维护,特性开发及bugfix。对MySQL、Redis原理及实现、高可用架构方案有一定研究,热衷开源数据库技术交流 内容简介 1. Redis sentinel原理介绍 2. 源码实现剖析 3. 实践建议及讨论 主题三 MarxDB金融级分布式数据库 石慧兴 数据库研发

分布式锁和分布式保证幂等性

你离开我真会死。 提交于 2021-02-04 10:46:55
一、幂等性概念 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数. 更复杂的操作幂等保证是利用唯一交易号(流水号)实现. 我的理解:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。 二、幂等性场景 1、查询操作:查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select是天然的幂等操作; 2、删除操作:删除操作也是幂等的,删除一次和多次删除都是把数据删除。(注意可能返回结果不一样,删除的数据不存在,返回0,删除的数据多条,返回结果多个) ; 3、唯一索引:防止新增脏数据。比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建资金账户多个,那么给资金账户表中的用户ID加唯一索引,所以一个用户新增成功一个资金账户记录。要点:唯一索引或唯一组合索引来防止新增数据存在脏数据(当表存在唯一索引,并发时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可); 4、token机制:防止页面重复提交。 原理上通过session token来实现的( 也可以通过redis来实现

高并发下如何保证接口的幂等性?

不打扰是莪最后的温柔 提交于 2021-02-04 10:42:12
介绍 幂等性就是同一个操作执行多次,产生的效果一样。如http的get请求,数据库的select请求就是幂等的 在分布式系统中,保证接口的幂等性非常重要,如提交订单,扣款等接口都要保证幂等性,不然会造成重复创建订单,重复扣款,那么如何保证接口的幂等性呢? 前端保证幂等性的方法 按钮只能点击一次 用户点击按钮后将按钮置灰,或者显示loading状态 RPG模式 即Post-Redirect-Get,当客户提交表单后,去执行一个客户端的重定向,转到提交成功页面。避免用户按F5刷新导致的重复提交,也能消除按浏览器后退键导致的重复提交问题。目前绝大多数公司都是这样做的,比如淘宝,京东等 后端保证幂等性的方法 使用唯一索引 对业务唯一的字段加上唯一索引,这样当数据重复时,插入数据库会抛异常 状态机幂等 如果业务上需要修改订单状态,例如订单状态有待支付,支付中,支付成功,支付失败。设计时最好只支持状态的单向改变。这样在更新的时候就可以加上条件,多次调用也只会执行一次。例如想把订单状态更新为支持成功,则之前的状态必须为支付中 update table_name set status = 支付成功 where status = 支付中 乐观锁实现幂等 查询数据获得版本号 通过版本号去更新,版本号匹配则更新,版本号不匹配则不更新 -- 假如查询出的version为1 select version

高并发下的接口如何保证幂等性

廉价感情. 提交于 2021-02-04 10:41:41
点击上方“ Java学习指南 ” 关注我 , 加个“ 星标 ” ,每天阅读Java干货文章 一、背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。 例如: 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱; 发送消息,也应该只发一次,同样的短信发给用户,用户会哭的; 创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题。 等等很多重要的情况,这些逻辑都需要幂等的特性来支持。 二、幂等性概念 幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。 这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数. 更复杂的操作幂等保证是利用唯一交易号(流水号)实现. 我的理解:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的 三、技术方案 1. 查询操作 查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select是天然的幂等操作

redis执行Lua脚本

拟墨画扇 提交于 2021-02-04 04:56:20
https://blog.csdn.net/mytt_10566/article/details/99732583 jianshu.com/p/366d1b4f0d13 Redis Lua 这个技术,我之前就在关注,今天有空,我把项目中基于Redis实现的ID生成器改成用lua脚本实现,防止并发id冲突问题 Redis中使用Lua的好处 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。 复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。 Redis Lua脚本与事务 从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。 并且一般来说, 使用脚本要来得更简单,并且速度更快。 使用事务时可能会遇上以下两种错误: 事务在执行 EXEC 之前,入队的命令可能会出错。比如说,命令可能会产生语法错误(参数数量错误,参数名错误,等等),或者其他更严重的错误,比如内存不足(如果服务器使用 maxmemory 设置了最大内存限制的话)。 命令可能在 EXEC 调用之后失败。举个例子,事务中的命令可能处理了错误类型的键

redis执行lua脚本实战

被刻印的时光 ゝ 提交于 2021-02-04 04:22:29
eval调用传递参数 [root@base task]# redis-cli 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second" 127.0.0.1:6379> 其中2为参数的redis键key的个数,key1,key2为redis键key,first,second为键名的附加参数。在lua脚本中通过KEYS和ARGV数组对脚本执行指定的参数进行访问。 调用redis的set命令(方式一) 127.0.0.1:6379> eval "return redis.call('set','foo','bar')" 0 OK 127.0.0.1:6379> get foo "bar" 127.0.0.1:6379> 调用redis的set命令(方式二) 127.0.0.1:6379> eval "return redis.call('set',KEYS[1],'bar')" 1 foo OK 127.0.0.1:6379> get foo "bar" 127.0.0.1:6379> 需要注意的是,上面这段脚本的确实现了将键 foo 的值设为 bar 的目的,但是,它违反了 EVAL

Redis 实战 —— 14. Redis 的 Lua 脚本编程

百般思念 提交于 2021-02-04 02:15:34
简介 Redis 从 2.6 版本开始引入使用 Lua 编程语言进行的服务器端脚本编程功能,这个功能可以让用户直接在 Redis 内部执行各种操作,从而达到简化代码并提高性能的作用。 P248 在不编写 C 代码的情况下添加新功能 P248 通过使用 Lua 对 Redis 进行脚本编程,我们可以避免一些减慢开发速度或者导致性能下降对常见陷阱。 P248 将 Lua 脚本载入 Redis P249 SCRIPT LOAD 命令可以将脚本载入 Redis ,这个命令接受一个字符串格式的 Lua 脚本为参数,它会把脚本存储起来等待之后使用,然后返回被存储脚本的 SHA1 校验和 EVALSHA 命令可以调用之前存储的脚本,这个命令接收脚本的 SHA1 校验和以及脚本所需的全部参数 EVAL 命令可以直接执行指定的脚本,这个命令接收脚本字符串以及脚本所需的全部参数。这个命令除了会执行脚本之外,还会将被执行的脚本缓存到 Redis 服务器里面 由于 Lua 的数据传入和传出限制, Lua 与 Redis 需要进行相互转换。因为脚本在返回各种不同类型的数据时可能会产生含糊不清的结果,所以我们应该尽量显式的返回字符串。 P250 我们可以在 官方文档 中找到 Redis 和 Lua 不同类型之间的转换表: Redis 类型转换至 Lua 类型 Redis Lua integer reply

分布式限流

放肆的年华 提交于 2021-02-03 13:17:56
前言 本文接着上文 应用限流 进行讨论。 之前谈到的限流方案只能针对于单个 JVM 有效,也就是单机应用。而对于现在普遍的分布式应用也得有一个分布式限流的方案。 基于此尝试写了这个组件: https://github.com/crossoverJie/distributed-redis-tool DEMO 以下采用的是 https://github.com/crossoverJie/springboot-cloud 来做演示。 在 Order 应用提供的接口中采取了限流。首先是配置了限流工具的 Bean: @Configuration public class RedisLimitConfig { @Value("${redis.limit}") private int limit; @Autowired private JedisConnectionFactory jedisConnectionFactory; @Bean public RedisLimit build() { RedisClusterConnection clusterConnection = jedisConnectionFactory.getClusterConnection(); JedisCluster jedisCluster = (JedisCluster) clusterConnection

请你讲讲分布式系统中的限流器一般如何实现?

天大地大妈咪最大 提交于 2021-02-03 11:50:45
限流器相关算法 一般限流器有五种算法,分别是:令牌桶,漏斗桶,固定窗口,滑动日志(指的其实是广义上的滑动窗口),滑动窗口( 这里指的是滑动日志+固定窗口结合的一种算法 )。 1. 令牌桶(Token bucket) 令牌桶算法用来控制一段时间内发送到网络上的数据的数目,并允许突发数据的发送。 算法大概是: 假设允许的请求速率为 r 次每秒,那么每过 1/r 秒就会向桶里面添加一个令牌。桶的最大大小是 b 。当一个大小为 n 的请求到来时,检查桶内令牌数是否足够,如果足够,令牌数减少 n ,请求通过。不够的话就会触发拒绝策略。 令牌桶有一个固定大小,假设每一个请求也有一个大小,当要检查请求是否符合定义的限制时,会检查桶,以确定它当时是否包含足够的令牌。如果有,那么会移除掉这些令牌,请求通过。否则,会采取其他操作,一般是拒绝。令牌桶中的令牌会以一定速率恢复,这个速率就是允许请求的速率(当然,根据大小的配置,可能实际会超过这个速率,但是随着令牌桶的消耗会被调整回这个恢复速率)。 如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。可以看出,令牌桶在保持整体上的请求速率的同时,允许某种程度的突发传输。 分布式环境下的令牌桶的实现需要考虑如下几个问题: 令牌桶当前大小究竟如何存储?是只存储一个当前令牌桶的大小(例如通过 redis 的一个键值对存储)

数据库分库分表、读写分离的原理实现,使用场景

丶灬走出姿态 提交于 2021-02-03 04:51:01
为什么要分库分表和读写分离? 类似淘宝网这样的网站,海量数据的存储和访问成为了系统设计的瓶颈问题,日益增长的业务数据,无疑对数据库造成了相当大的负载,同时对于系统的稳定性和扩展性提出很高的要求。随着时间和业务的发展,数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作的开销也会越来越大;另外,无论怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、网络IO、事务数、连接数)总是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。分表、分库和读写分离可以有效地减小单台数据库的压力。 分库分表的原理和实现 1.什么是分区、分表、分库 分区 就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的,分区实现比较简单,数据库mysql、oracle等很容易就可支持。 分表 就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。 分库 一旦分表,一个库中的表会越来越多 将整个数据库比作图书馆,一张表就是一本书。当要在一本书中查找某项内容时,如果不分章节,查找的效率将会下降。而同理,在数据库中就是分区。 2.什么时候考虑使用分区? 一张表的查询速度已经慢到影响使用的时候。 sql经过优化 数据量大 表中的数据是分段的 对数据的操作往往只涉及一部分数据,而不是所有的数据