Redis

Redis使用规范

╄→尐↘猪︶ㄣ 提交于 2020-08-13 02:12:00
Redis使用规范 在公司项目中,redis属于高频使用,在使用中,我们遇到了各种各样的redis问题,于是针对自身情况梳理了一个redis使用规范。 一、键名设计 1、key名设计 禁止包含特殊字符(比如空格、换行、单双引号以及其他转义字符) 建议以业务名为前缀,以冒号分割来构造一定规则的key名(比如业务名:表名:id) 比如:teach:leeson_id:21 控制key的长度 key太长量一大起来就会非常占用内存 2、value设计 拒绝大key操作 禁用超过10K的string大key(虽然redis支持512MB大小的string),如果1mb的key每秒重复写入10次,就会导致写入网络IO达10MB。 错误示范:直接将laravel的整个模型或者对象当成value存储 设计key时使用合适的数据类型(在资源利用和性能之间作平衡) 错误示范:一个普通字符串弄成hash类型进行存储 一定要控制key的生命周期 错误示范:key设置为永不过期 控制value长度 比如string类型,如果value为'8个字节的长整型'则内部使用int类型,如果value为'小于等于39个字节的字符串'则内部使用embstr类型,如果value为'大于39个字节的字符串'则内部使用raw类型。这样能很好的利用redis的性能。 数据按需存储 不需要的数据千万不要存储在redis

模块级别自动化测试的经验与教训

依然范特西╮ 提交于 2020-08-13 02:01:34
搞了几个月的自动化测试,结果不甚理想,这里做一个简单的总结。 为什么要做自动化测试呢?因为手工测试效率低,找 case、执行 case 太费时间。 为什么自动化测试前面要加“模块级别”呢?因为一个系统依赖很多外部系统,如果不能有效屏蔽外部环境的差异,自动化测试会经常因为环境问题而失败。 原理 这里讲的自动化测试原理是,在线上环境录制测试 case,在线下测试环境利用录制的 case 进行回放测试。 如何录制 case?某个系统对一次请求的一次处理可以认为是一个 case,模块级别的自动化测试要求录制该系统在处理请求时的所有对外交互,包括但不限于: 该模块接收到的请求和对外响应信息。 该模块在处理请求过程中,产生的所有下游调用的请求和响应。常见的有:HTTP 请求、DB 请求、Redis 查询、MQ 输出、热更新配置等等。 在请求处理过程中,往往会出现各种线程的切换、异步调用,如何将一个请求的所有对外交互串起来呢?很多公司都有分布式链路跟踪系统,会有一个 traceID 能够把不同系统的请求串联起来,同理也可以利用该 traceID 把单个系统内部的请求处理过程串联起来,拥有同一个 traceID 的输入输出可以认为是属于同一个 case 的。 case 的录制思路比较简单,收集数据后存储到 DB 中即可。case 的回放测试分为两步: 运行测试 case。 DIFF 测试结果

Java架构师面试题系列之Dubbo面试专题(29题,含详细答案解析)

让人想犯罪 __ 提交于 2020-08-13 01:52:24
【 Java架构师面试网 】收集整理了几乎整个架构师学习途中会遇到的面试题,希望大家都能早日圆自己的架构师梦~ 网站近期在备案和迁移服务器,暂时无法打开,先关注一波公众号吧 公众号: Java架构师面试网 ,关注回复“ 资料 ”即可领取精美整理的面试资料一份哦~ 1. Dubbo 支持哪些协议,每种协议的应用场景,优缺点? dubbo : 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步, Hessian 序列化; rmi : 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接, TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操作。在依赖低版本的 Common-Collections 包, java 序列化存在安全漏洞; http : 基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器 JS 调用; webservice : 基于 WebService 的远程调用协议,集成 CXF 实现

高并发时,使用Redis应注意的问题 及 Redis缓存帮助类

空扰寡人 提交于 2020-08-13 01:52:04
十年河东,十年河西,莫欺少年穷 学无止境,精益求精 缓存的出现解决了数据库压力的问题,但是当以下情况发生的时候,缓存就不在起到作用了, 缓存穿透、缓存击穿、缓存雪崩 这三种情况。 1. 缓存穿透: 我们的程序中用缓存的时候一般采取的是先去缓存中查询我们想要的缓存数据,如果缓存中不存在我们想要的数据的话,缓存就失去了作用(譬如缓存失效),这时我们就是需要伸手向DB库要数据,如果这种动作过多数据库就崩溃了。 这种情况需要我们去预防了,比如说:我们向缓存获取一个用户信息,但是故意去输入一个缓存中不存在的用户Key,这样就避过了缓存,把压力重新转移到数据上面了。 对于这种问题我们可以采取: 因为缓存查不到用户信息,数据库也查询不到用户信息,我们就把访问的数据进行缓存,这时候就可以避免重复访问,顺利把压力重新转向缓存中,有人会有疑问了,当访问的参数有上万个都是不重复的参数,并且都是可以躲避缓存的怎么办,我们同样把数据存起来设置一个较短过期时间清理缓存。 示例代码如下: [HttpGet] [Route( " RedisGet " )] public IActionResult RedisGet( string key) { if (rd.KeyExists(key)) { /* * 如果缓存中存在,则直接返回结果 */ var result = rd.StringGet(key);

redis的三种部署方式和数据读取方式

怎甘沉沦 提交于 2020-08-13 01:51:19
redis redis的三种部署方式 1:主从复制,就是每台机器都是一样的,这种部署方式每台服务器都会向主服务器同步自己的数据,所以其中的数据内容是相同的 工作机制:从服务器连接到主服务器发送SYNC命令,主服务器接收命令,开始执行BGSAVEE命令申城RDB文件并使用缓冲区域记录伺候执行的所有写命令,主服务器的BGSAVE命令执行完成后,向所有服务器发送快照文件,并继续记录执行的写命令,从服务器收到快照文件后丢弃所有的旧数据,载入收到的快照,主服务器发送完毕后开始向服务器发送缓冲区的写命令,从服务器完成对快照的载入,开始接受命令请求,并执行来自主服务器缓冲区的写命令,完成初始化,最后主服务器接收到写命令后就向从服务器发送这个写命令,从服务器接收并执行 slaver将master中的信息读取出来放入磁盘中,然后加载进内存,客户端直接从内存中读取信息,从这一点也可以看出,redis其实就是一个内存数据库 只有一个master,可以有n个slaver,每个slaver也可以有自己的slaver,master只负责写和同步数据给slaver,所以如果我们要提高读取效率只需要扩容slaver就可以了 SYNC命令是非常消耗资源的,因为每次执行SYNC命令,主从服务器需要执行以下操作: 主服务器需要执行BGSAVE命令来生成RDB文件,这个生成操作会耗费主服务器大量的CPU、内存和磁盘I

Kubernetes/K8s CKA认证全套实训视频教程下载

自古美人都是妖i 提交于 2020-08-13 01:46:11
地址: 链接: https://pan.baidu.com/s/1bwEUZTCVzqM3mGjrlISbcg 提取码:r1kx 目录: 目录: │ 1-1、kubernetes理论教程 - 云原生技术的前世今生.mp4 │ 1-2、kubernetes理论教程 - K8S初体验.mp4 │ 1-3、kubernetes理论教程 - K8s工作负载原理剖析和实践.mp4 │ 1-4、kubernetes理论教程 - K8s调度器原理剖析和实践.mp4 │ 1-5、kubernetes理论教程 - K8S网络模型原理剖析与实践.mp4 │ 1-6、kubernetes理论教程 - K8S服务发现与负载均衡原理剖析与实践.mp4 │ 1-7、kubernetes理论教程 - K8S存储原理剖析与实践.mp4 │ 1-8、kubernetes理论教程 - K8S安全原理剖析与实践.mp4 │ 2-10、Kubernetes CKA认证培训 - K8S集群运维.mp4 │ 2-11、Kubernetes CKA认证培训 - K8S故障排查 (上).mp4 │ 2-12、Kubernetes CKA认证培训 - K8S故障排查(下).mp4 │ 2-13、Kubernetes CKA认证培训 - 《K8s CKA官方认证实战班介绍》.mp4 │ 2-1、Kubernetes CKA认证培训

将python 中的变量保存到本地

雨燕双飞 提交于 2020-08-13 01:06:22
如何将python中的变量保存在本地? 将python 的一些代码保存在本地, 特别是一些需要大量运算的结果,例如 机器学习里面的模型,,放在本地,还是比较好用的。下次就可以直接拿出来使用就好。 其实可以 我觉得可以把 python 中的变量 保存在 redis 中,好像很骚气的样子。现在的代码是放在本地文件中。 参考博客: https://blog.csdn.net/qq_27061325/article/details/82113883 参考链接: https://www.thoughtco.com/using-shelve-to-save-objects-2813668 见代码: import shelve from contextlib import closing class local_cache: def __init__(self, cache='var.pkl'): self.cache = cache def __setitem__(self, key, value): """ key: 变量名 value: 变量值 cache: 缓存名 """ with closing(shelve.open(self.cache, 'c')) as shelf: shelf[key] = value def __getitem__(self, key): """ key :

【JMICRO】 微服务简介及异步RPC体验

走远了吗. 提交于 2020-08-13 01:02:42
一, 为什么写 JMicro 印象中初次接触微服务大概是2011年,那会做Eclpise插件开发,网上查看好多关于OSGI的技术文章,发现Spring新出了一个叫Spring-boot的框架,那会没太上心,只是了解了点皮毛,工作又太忙,之后就没下文了。 直到大概2015年的某天,碰到一个小项目,没什么难度,都用老套路去玩,没什么意思,得玩点新东西才行,也不枉一翻付出,于是选择用GO语言实现,选择GO主要是想体验一下GO,看是不是真如传说中的那样无敌。经过一翻折腾,最终确定GOGIN+GOMICRO实现。是的,从那会开始,通过学心和使用GOMICRO,从此迷上微服务。后来因为工作需要,再没什么机会在项目中接触GO。 后面也曾试图去用Dubbo和Spring-Cloud做项目,但也止于浅尝则止,没能深入。一方面项目时间太紧,折腾不起。另一方面,也是最重要的,项目组成员根本不愿意去学新东西,在很多成员心中,微服务,Spring-Cloud太深奥,玩不起,没时间,至于Dubbo,写个服务,做个RPC也是从百度复制下来的,跑起来就完事了,没人关心个中的原理,经常碰到问题就抓狂! 从那时候起,就一直琢磨着能不能用Java写一个像GoMicro一样简单的微服务框架,这个框架要确保足够简单,入门和使用成本要底,就像写HelloWord一样,但微服务的基本功能要全。因此项目依赖不能多

挑战阿里社招百万年薪,吃透这37个经典面试题,offer能拿到手软

元气小坏坏 提交于 2020-08-13 00:06:10
最强面试题推荐: 2020Java面试题及答案,命中率高达90% 1.bio与nio的区别 2.select与poll的区别 3.zookeeper的⼯作原理 4.cap理论 5.⼆段式满⾜cap理论的哪两个理论 6.线程池的参数配置,为什么java官⽅提供⼯⼚⽅法给线程池 7.分布式框架dubbo的好处,不⽤dubbo可不可以。为什么要使⽤分布式 8.七个垃圾回收器之间如何搭配使⽤ 9.接⼝限流⽅案 10.ConcurrentHashMap使⽤原理 11.解决map的并发问题⽅案 12.什么是协程,以及实现要点 13.lru cache 使⽤hash map 的实现(算法) 14.图的深度遍历和⼴度遍历(算法) 15.基本排序(算法) 16.设计模式的使⽤ 17.java 8 流式使⽤ 18.说说b+树? 19.内存屏障与volatile 20.java 域的概念 21.分布式设计领域的概念 22.如何实现双11的购物限流(redis实现⽅案) 23.mysql调优 24.cdn(异地多活) 25.进程之间的通信⽅式 26.tcp/ip协议、http协议 27.写⼀个redis分布式锁 28.spring 7种事务的传播⾏为 29.分布式下down机的处理⽅案(⼼跳检测) 30、分析下分布式强⼀致性、弱⼀致性、最终⼀致性? 31、dubbo与zookeeper 两者作为注册中

关于Java码农这10年来的艰辛路程和技术生涯成长,生发篇

谁都会走 提交于 2020-08-12 23:57:17
一朝入IT,帽子头上带. 这一路走来过程多艰难心酸,多少次有过想退却的想法,还有哪些迷茫,怀疑自己的阶段 相信你,也一定有过 . 阶段1:只会增删改查: 时间:大学期间(2008年-2009年) 学习的方式:看视频、看书。(学会了使用控件的增删改查,和写SQL语句)。 自我感觉:XX管理系统已不在话下,反正网站弄来弄去也是增删改查,这大概就是无知者无畏。 如何破:(走出社会去就好了)。 阶段2:能快速实现功能,却不会思考: 时间:(2009年-20012年) 学习的方式:看博客、大量的编码(第1年,封闭式开发(1天敲15个小时代码),第二年后:每周六天,每天到夜里3点)。 感觉:大量的编码,做了大量的不同类型的系统,已练就成一个高级代码工:(CodeSmith代码生成器+批量生成增删改查)。 如何破:(让自己静下来)。 阶段3:学会了分享、安全、性能、底层原理 时间:(20012年-2016年) 学习的方式:写博客、看博客、写框架(CYQ.Data V-V4系列、QBlog)。 感觉:为某个框架代码而自我得意。 如何破:不断重复的将自己归零(把自己的认为得意的东西开源出去,如果要保留一点感觉,可阶段性开源)。 阶段4:领悟了抽象思维、面向对象、写框架、用户体验 时间:(2016年-至今) 感觉:也许我懂的很多,但是我不懂的更多。 如何破:(转行卖烧烤。。。) 总结一下: 上面的内容