Redis

Redis应用-限流

血红的双手。 提交于 2020-08-18 05:20:15
在高并发场景下有三把利器保护系统:缓存、降级、和限流。缓存的目的是提升系统的访问你速度和增大系统能处理的容量;降级是当服务出问题或影响到核心流程的性能则需要暂时屏蔽掉。而有些场景则需要限制并发请求量,如秒杀、抢购、发帖、评论、恶意爬虫等。 限流算法 常见的限流算法有:计数器,漏桶、令牌桶。 计数器 顾名思义就是来一个记一个,然后判断在有限时间窗口内的数量是否超过限制即可 function isActionAllowed($userId, $action, $period, $maxCount) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $key = sprintf('hist:%s:%s', $userId, $action); $now = msectime(); # 毫秒时间戳 $pipe=$redis->multi(Redis::PIPELINE); //使用管道提升性能 $pipe->zadd($key, $now, $now); //value 和 score 都使用毫秒时间戳 $pipe->zremrangebyscore($key, 0, $now - $period); //移除时间窗口之前的行为记录,剩下的都是时间窗口内的 $pipe->zcard($key); //获取窗口内的行为数量

redis外网连接的一些坑

喜你入骨 提交于 2020-08-18 04:57:26
前言 在使用阿里云和腾讯云的redis 可以减少很大的维护量。但是在我们的业务场景中遇到了一个情况,阿里和腾讯的redis均不支持外网访问。 因此,正好帮人解决一个问题,就拿出来分享一下。 阿呆的故事 阿呆是从事编程工作半年,一直使用阿里云和腾讯云。公司在要在全球部署服务器,由于运维成本高等问题,将所有服务采用了私有云+公有云的模式。 redis就架在了公有云上,结果在部署到全球5个地区的时候,全球5个地区都无法访问北京的redis。 阿呆的分析 阿呆的分析: 防火墙 公有云的规则 selinux 阿呆解禁了公有云上的安全组规则,失败; 后来几次打听才了解到redis不让外网访问。 阿呆的解决办法 使用转发方式 自建redis server 由于redis 要求可靠性很高,转发可能会影响到性能,阿呆放弃了这种方式。 自建redis吧,自建redis,可是阿呆发现依然不行。同样,放行了所有的网络通信还是不行。 阿呆惆怅了 突然的发现 阿呆修改配置文件,远程调试,内网访问,N种办法后,阿呆去楼下点了支烟,看了看外面的云朵,阿呆有些想妈妈了。 突然灵感突现,会不会是IP地址的问题呢,阿呆打开一看,redis server的配置文件中: bind 127.0.0.1 阿呆加上公网IP,可还是失败,服务都没办法启动了。 算了,不加了试试,注释掉bind 127.0.0.1。启动成功

C# Redis实战(一)

a 夏天 提交于 2020-08-18 04:43:14
一、初步准备 Redis 是一个开源的使用ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。 Redis的出现,很大程度补偿了memcached 这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。 本文主要讲述的是如何使用C#语言来进行Redis分布式缓存的程序编写。首先,需要从github下载最新的32/64位安装( 下载地址 ),解压后根据自己机器的实际情况选择32位或者64位,例如:我机器是64位win7,于是将64bit下所有文件拷贝到D盘根目录下新建文件夹redis中,如图: 接下来我们需要在vs中新建一个Redis的测试Demo,并为其添加Redis程序包,如图: 至此,Redis分布式编程的准备工作已经完成,可以得到如下示例Demo效果图: : 如需转载,请注明出处, 本系列博文示例程序下载地址 来源: oschina 链接: https://my.oschina.net/u/4323912/blog/4297510

Redis知识点

和自甴很熟 提交于 2020-08-18 04:41:31
1. 应用场景 缓存:根据键值过期时间设置 请求频率限制:比如短信验证码120秒内只能发送一次,则将标志性的key-value键值对设置过期时间为120秒,用户请求的时候判断一下【 SET key value EX 120 NX 】 排行榜:利用 zset 数据类型 计数器:利用 INCR KEY 命令,key不存在初始化为0,存在则自增1 用户爱好:利用 set集合 ,其特有的命令方法能够计算用户共同爱好 消息队列:利用 list 数据类型的 lpush和brpop 分布式锁:利用 SET key value [EX seconds] [PX milliseconds] [NX|XX] 2.速度快的原因 纯内存访问 底层I/O用多路复用技术epoll实现 单线程避免了线程切换和竞争 3. 数据类型 字符串(String):内部编码【8个字节长整型:int】【小于等于39个字节的字符串:embstr】【大于39个字节的字符串:raw】 哈希(Hash):内部编码【元素个数小于512个并且每个值都小于64字节:ziplist-压缩列表】【否则是hashtable-哈希表】 列表(List):内部编码【元素个数小于512个并且每个值都小于64字节:ziplist-压缩列表】【否则是linkedlist-链表】 集合(Set):内部编码【元素都是整数并且个数小于512个:intset

redis-setbit理解

戏子无情 提交于 2020-08-18 04:35:52
在redis中,存储的字符串都是以二级制的进行存在的。 举例: 设置一个 key-value ,键的名字叫“andy” 值为字符'a' 我们知道 'a' 的ASCII码是 97。转换为二进制是:01100001。offset的学名叫做“偏移” 。二进制中的每一位就是offset值啦,比如在这里 offset 0 等于 ‘0’ ,offset 1等于'1' ,offset2等于'1',offset 6 等于'1' ,没错,offset是从左往右计数的,也就是从高位往低位。 我们通过SETBIT 命令将 andy中的 'a' 变成 'b' 应该怎么变呢? 也就是将 01100001 变成 01100010 (b的ASCII码是98),这个很简单啦,也就是将'a'中的offset 6从0变成1,将offset 7 从1变成0 。 果然,就从'a' 变成 'b'了。  这就是redis 中 “SETBIT” 的基本用法。 2. BITCOUNT 就是统计字符串的二级制码中,有多少个'1'。 所以在这里, BITCOUNT andy 得到的结果就是 3 啦。 3. Getbit 命令用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 原文链接:https://blog.csdn.net/hgd613/article/details/54095729 来源: oschina

ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存

我们两清 提交于 2020-08-18 04:30:01
原文: ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存 前言 上篇博文 介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件。项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资源缓存和Session缓存。 如果你觉得对你有帮助的话,不妨点个【推荐】。 目录 Redis 介绍 asp.net core Session 介绍 Redis & Session 实例讲解 Session的使用 使用 Protobuf 给 Session添加扩展方法 Redis 介绍 下面是 Redis官网 的介绍: Redis is an open source (BSD licensed), in-memory data structure store, used as database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis

PHP操作Redis,记不住多操作几次

感情迁移 提交于 2020-08-18 03:07:43
redis 的基本操作方法 1.redis 的连接 : //实例化redis $redis = new Redis(); //连接 $redis->connect('127.0.0.1', 6379); //检测是否连接成功 echo "Server is running: " . $redis->ping(); // 输出结果 Server is running: +PONG 2.redis 操作 Strng (字符串): // 设置一个字符串的值 $redis->set('cat', 111); //获取一个字符串的值 echo $redis->get('cat'); // 111 // 重复set $redis->set('cat', 222); echo $redis->get('cat'); // 222 3.redis 操作 List (列表): //存储数据到列表中 $redis->lpush('list', 'html'); $redis->lpush('list', 'css'); $redis->lpush('list', 'php'); //获取列表中所有的值 $list = $redis->lrange('list', 0, -1); print_r($list);echo '<br>'; // Array ( [0] => php [1] => css

推荐15款优质Spring开源项目,覆盖权限类、搜索、秒杀、支付

心不动则不痛 提交于 2020-08-17 23:57:34
不管是工作还是学习,很多时候我们都不需要自己再造轮子,并且如果有一个足够可用的轮子,在工作或者学习上,都会帮我们节省很多时间,这个真的哦。有的公司的管理框架就是用开源项目改的。今天在这边给大家推荐15个,优质开源Spring Boot & Spring Cloud 的比较多,包括权限管理类、支付类、商城类,博客管理、CRM、ERP等。 ❞ 微人事 spring-boot-pay springboot-plus Spring-boot-seckill V 部落 Cloud-Platform litemall jeeSpringCloud 美人鱼 bootshiro open-capacity-platform 悟空 CRM paascloud-master mall 华夏ERP 微人事 star: 17k 项目介绍 : 微人事是一个前后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发,项目加入常见的企业级应用所涉及到的技术点,例如 Redis、RabbitMQ 等。 技术栈: 项目图: spring-boot-pay star : 6.1k 项目介绍 : 支付服务:支付宝,微信,银联详细 代码案例 (除银联支付可以测试以外,支付宝和微信支付测试均需要企业认证,个人无法完成测试)。 技术栈: JDK1.8、Maven、IDEA、SpringBoot2.2.6

[PHP] 基于redis实现滑动窗口式的短信发送接口限流

二次信任 提交于 2020-08-17 23:53:56
滑动窗口短信发送限流算法 1.有两条规则 基于IP的限制和基于手机号的限制 IP规则: 1分钟限制5 10分钟限制30 1小时限制50 手机号规则: 1分钟限制1 10分钟限制5 1小时限制10 2.滑动窗口就是随着时间的流动 , 进行动态的删减区间内的数据 , 限制时获取区间内的数据 最主要的是用到了redis的 zRemRangeByScore 来进行删除区间外的数据 <? php /* 滑动窗口短信发送限流算法 1.有两条规则 基于IP的限制和基于手机号的限制 IP规则: 1分钟限制5 10分钟限制30 1小时限制50 手机号规则: 1分钟限制1 10分钟限制5 1小时限制10 */ // IP规则 $ipRules = array ( 60=>5, 600=>30, 3600=>50 ); // 手机号规则 $phoneRules = array ( 60=>1, 600=>5, 3600=>10 ); $r = checkLimits( $ipRules , $_SERVER ["REMOTE_ADDR"], $_GET ['tel' ]); var_dump ( $r ); $r = checkLimits( $phoneRules , $_GET ['tel'], $_GET ['tel' ]); var_dump ( $r ); function

Redis缓存设计

做~自己de王妃 提交于 2020-08-17 20:58:39
缓存的收益及成本 收益:加速读写、降低后端负载 成本:数据不一致性、代码维护成本、运维成本 缓存更新策略 LRU/LFU/FIFO算法剔除,用于缓存使用量超过预设最大值时的缓存处理 超时剔除:缓存数据超过过期时间后自动删除,存在一定时间的数据不一致性 主动更新:应用方对数据的一致性要求较高,需要在真实数据更新后立刻更新缓存数据 缓存粒度控制 (即缓存的内容应该如何选择) 基于通用性、空间占用及代码维护三个层面考虑 缓存穿透优化 (查询一个根本不存在的数据,缓存层和存储层都不会命中) 缓存空对象,这样在访问时会从缓存中直接返回空对象,保护了数据库 空值缓存意味着更多的键和内存空间,需要给这些空对象设置较短的过期时间 缓存层和存储层会存在一定时间的数据不一致现象 布隆过滤器,通过布隆过滤器判断键是否存在,不存在就不访问存储层,使用面积有限 缓存无底洞优化 (缓存节点水平扩展后,性能因为获取的键散步于不同的机器上导致的IO增多使得请求反而变慢的现象) 串行执行,简单对所有请求的键执行get 串行IO,计算出请求的键分布于哪些节点上,对这些节点做mget或pipeline 并行IO,与串行IO的不同仅在于并行的请求节点做mget或pipeline hash_tag,将请求的键放到一个节点上 雪崩优化 (缓存大量失效导致请求打到存储层) 保证业务高可用性 依赖隔离组件为后端限流降级