redis原理
Redis原理篇1、原理篇-Redis数据结构1.1 Redis数据结构-动态字符串我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:获取字符串长度的需要通过运算非二进制安全不可修改Redis构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称SDS。例如,我们执行命令: 那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含“虎哥”的SDS。 Redis是C语言实现的,其中SDS是一个结构体,源码如下: 例如,一个包含字符串“name”的sds结构如下: SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为“hi”的SDS: 假如我们要给SDS追加一段字符串“,Amy”,这里首先会申请新内存空间: 如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1; 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1...
redis最佳实践
Redis高级篇之最佳实践今日内容 Redis键值设计 批处理优化 服务端优化 集群最佳实践 1、Redis键值设计1.1、优雅的key结构Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id] 长度不超过44字节 不包含特殊字符 例如:我们的登录业务,保存用户信息,其key可以设计成如下格式: 这样设计的好处: 可读性强 避免key冲突 方便管理 更节省内存: key是string类型,底层编码包含int、embstr和raw三种。embstr在小于44字节使用,采用连续内存空间,内存占用更小。当字节数大于44字节时,会转为raw模式存储,在raw模式下,内存空间不是连续的,而是采用一个指针指向了另外一段内存空间,在这段空间里存储SDS内容,这样空间不连续,访问的时候性能也就会收到影响,还有可能产生内存碎片 1.2、拒绝BigKeyBigKey通常以Key的大小和Key中成员的数量来综合判定,例如: Key本身的数据量过大:一个String类型的Key,它的值为5 MB Key中的成员数过...
分布式缓存(redis的高可用)
基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: 1.Redis持久化Redis有两种持久化方案: RDB持久化 AOF持久化 1.1.RDB持久化RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。 1.1.1.执行时机RDB持久化在四种情况下会执行: 执行save命令 执行bgsave命令 Redis停机时 触发RDB条件时 1)save命令 执行下面的命令,可以立即执行一次RDB: save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。 2)bgsave命令 下面的命令可以异步执行RDB: 这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。 3)停机时 Redis停机时会执行一次save命令,实现RDB持久化。 4)触发RDB条件 Re...
多级缓存
什么是多级缓存传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能: 浏览器访问静态资源时,优先读取浏览器本地缓存 访问非静态资源(ajax查询数据)时,访问服务端 请求到达Nginx后,优先读取Nginx本地缓存 如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat) 如果Redis查询未命中,则查询Tomcat 请求进入Tomcat后,优先查询JVM进程缓存 如果JVM进程缓存未命中,则查询数据库 在多级缓存架构中,Nginx内部需要编写本地缓存查询、Redis查询、Tomcat查询的业务逻辑,因此这样的nginx服务不再是一个反向代理服务器,而是一个编写业务的Web服务器了。 因此这样的业务Nginx服务也需要搭建集群来提高并发,再有专门的nginx服务来做反向代理,如图: 另外...
记录雪花算法ID到前端之后丢失精度
问题描述 12345后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况。例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440js中的number类型是16位的,而雪花id是19位 下图可以看出,输入的值超出安全值,可能会被js自动转化 3种jackason解决方式(前端再把String类型的19位数字传回服务端的时候,服务端还是接收long类型即可,这是Spring反序列化参数接收默认支持的行为) 重新注册ObjectMapper的Long类型序列化方式 123456789101112131415161718192021222324@Configurationpublic class LongClassMessageConverter implements InitializingBean { @Resource ObjectMapper objectMapper; private SimpleModule getSimpleModule() { ...
记录容器化后的java项目问题处理
背景: 生产环境, 项目cpu一直报警 进入容器查看cpu占用高的进程top 查看占用cpu高的线程top -Hp 90 这里得到占用资源高的线程, 假如是93 获取线程id的16进制printf "%x\n" 93 这里得到的5d 对于只有jre的镜像, 需要安装对应版本jdk然后打印堆栈信息打印堆栈信息: ./jstack -l 90 > jstack.log 查找到对应线程的信息: cat jstack.log |grep "nid=0x5d" 查看gc格式: jstat -gcutil pid interval(ms) n次 jstat -gcutil 90 5000 10 123456789101112131415161718192021222324S0 S1 E O M CCS YGC YGCT FGC FGCT GCT0.00 0.00 99.64 100.00 94.39 92.31 285 14.940 474 329.694 344.6350.00 0.00 98.78 99.99 94.40 92.31 2...
使用SpringBoot创建DockerImage(layers分层的使用)
简介在Spring Boot 2.3以前,我们创建Spring Boot - docker image最通用的办法就是将Spring boot的应用程序打包成一个fat jar,然后写一个Dockerfile,将这个fat jar制作成为一个docker image然后运行。 在Spring Boot 2.3发布后,附带了快速创建docker image的功能 传统做法和它的缺点首先创建一个非常简单的Spring Boot程序: 12345678910111213@SpringBootApplication@RestControllerpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @GetMapping("/getInfo") public String getInfo() { re...
自定义Eslint规则并整合到Sonarqube
背景Eslint Eslint,我们常应用在代码静态扫描中,通过设定的Eslint的语法规则,来对代码进行检查,通过规则来约束代码的风格,以此来提高代码的健壮性,避免因为 代码不规范导致应用出现bug的可能。而规则是自由的,可以设定内部自己团队适用的规则,也可以直接使用开源社区比较热门的规则集合, 比如Airbnb等 Sonarqube Sonarqube是一个用于代码质量管理的开源平台,用于管理源代码的质量 通过插件形式,可以支持包括Java,C#,C/C++,PL/SQL,Cobol,JavaScript,Groovy等等二十几种编程语言的代码质量管理与检测 自定义规则 实际业务中,我们可以把团队的编码规范和最佳实践通过自定义规则落地到实际项目中,在编码阶段对开发者进行提示和约束,然后在Sonarqube进行统一管理,这对于多人协助、代码维护、统一代码风格都会有很大的帮助。 按照Sonarqube官方文档描述,每个语言都有对应的第三方整合插件开发支持 JavaScript中则建议使用Eslint进行整合 参考链接: https://docs.sonarsource.c...
seata的使用
初识Seata以及Seata的架构Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。 官网地址:http://seata.io/,其中的文档、播客中提供了大量的使用说明、源码分析。 Seata事务管理中三个重要的角色 TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - **资源管理器:**管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 整体的架构如图: Seata基于上述架构提供了四种不同的分布式事务解决方案: XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入 TCC模式:最终一致的分阶段事务模式,有业务侵入 AT模式:最终一致的分...
nslookup和dig指令
dig和nslookup的安装Ubuntu,Debian: 1# apt install -y dnsutils Fedora / Centos: 1# yum install -y bind-utils nslookup命令详解nslookup命令用于查询DNS的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题。 nslookup的用法相对来说还是蛮简单的,主要是下面的几个用法 直接查询查询一个域名的A记录。 1nslookup domain [dns-server] 如果没指定dns-server,用系统默认的dns服务器。 查询其他记录直接查询返回的是A记录,我们可以指定参数,查询其他记录,比如AAAA、MX等。 1234nslookup -qt=type domain [dns-server]nslookup -q=type domain [dns-server]nslookup -type=type domain [dns-server]nslookup -querytype=type domain [dns-server] 注意以上四...
