最近有一道常见的Redis面试题,Redis为什么那么快?下面我们来分析下"快"的原因。...1.Redis基于内存进行读写数据 Redis的数据存储在内存上,而且也会持久化到硬盘上,内存在读写速度上相比硬盘有很大的优势,无论是机械硬盘(SSD)还是固态硬盘(HDD),都没法与其相比,...Redis相比传统的关系型数据库Mysql使用硬盘储存快很多,可达到每秒数万访问。...2.Redis中数据结构比较简单 字符串、列表、哈希、集合、有序集合,都是专门设计的。...、锁等问题,Redis使用了IO多路复用技术解决IO问题 ?
4月第一天,开启一个新的篇章——《高性能redis》 为什么选择写Redis,考虑以下几点: 个人认为,缓存、MQ、分库分表可称为并发三剑客,而缓存就是三剑客中的大哥。...Redis个人觉得有两本写的非常好的书:《Redis的设计与实现》和《Redis深度历险》,本专栏也会参考书中的内容,力求言简意赅,但又鞭辟入里,脚踏实地的带大家把 Redis 拿下。...也可以 用 wget 直接下载 ## 官网:http://redis.cn/ wget http://download.redis.io/releases/redis-6.0.6.tar.gz 下载完成后...tar -zxf redis-6.2.6.tar.gz cd redis-6.2.6 make 3.修改配置文件 Redis 默认使用的端口是 6379 ,默认无密码。这是非常不安全的。...4.启动 # redis-server 启动,并指定配置文件 ./bin/redis-server ./etc/redis.conf 启动成功,本地先连接一下 # -p指定端口 .
这是从一个Lua脚本中使用两个不同的Lua函数来调用Redis的命令的例子: redis.call() redis.pcall() redis.call() 与 redis.pcall()很类似, 他们唯一的区别是当...redis命令执行结果返回错误时, redis.call()将返回给调用者一个错误,而redis.pcall()会将捕获的错误以Lua表的形式返回 redis.call() 和 redis.pcall(...数据类型之间的转换遵循这样一个设计原则:如果将一个 Redis 值转换成 Lua 值,之后再将转换所得的 Lua 值转换回 Redis 值,那么这个转换所得的 Redis 值应该和最初时的 Redis...Redis integer reply -> Lua number / Redis 整数转换成 Lua 数字 Redis bulk reply -> Lua string / Redis bulk 回复转换成...redis.LOG_VERBOSE redis.LOG_NOTICE redis.LOG_WARNING 上面的这些等级(level)和标准 Redis 日志的等级相对应。
OpenResty OpenResty是一个基于 Nginx与 Lua的高性能 Web平台,其内部集成了大量精良的 Lua库、第三方模块以及大多数的依赖项。...使用OpenResty的lua-resty-redis模块使nginx具备直接访问redis的能力,不占用tomcat线程,Tomcat暂时挂掉仍可正常处理请求,减少响应时长,提高系统并发能力。...压缩减少带宽 数据大于1K,nginx压缩再保存到redis: 提高redis的读取速度 减少带宽的占用 压缩会消耗cpu时间,小于1K的数据不压缩tps更高。...OpenResty并没有提供redis连接池的实现,需要自己用lua实现redis的连接池; 在网上已有实现的例子,直接参照使用。...获取页面html redis不存在数据时,从tomcat获取页面,同时更新redis 返回页面HTML给浏览器 单进程定时更新 Nginx的所有worker进程都可以处理前端请求转发到redis,只有
来源:http://mtw.so/6kWE3N 一、OpenResty OpenResty是一个基于 Nginx与 Lua的高性能 Web平台,其内部集成了大量精良的 Lua库、第三方模块以及大多数的依赖项...使用OpenResty的lua-resty-redis模块使nginx具备直接访问redis的能力,不占用tomcat线程,Tomcat暂时挂掉仍可正常处理请求,减少响应时长,提高系统并发能力。...三、压缩减少带宽 数据大于1K,nginx压缩再保存到redis: 提高redis的读取速度 减少带宽的占用 压缩会消耗cpu时间,小于1K的数据不压缩tps更高。.../redis/out_package.html,直接参照使用。...获取页面html redis不存在数据时,从tomcat获取页面,同时更新redis 返回页面HTML给浏览器 六、单进程定时更新 Nginx的所有worker进程都可以处理前端请求转发到redis,
介绍 上个礼拜,我搭建了一个mongo分片集群,发现分布式系统保证高可用和高性能的套路都差不多。...高性能就是做分片(可以类比为分库分表,将数据分到不同服务器上),在Kafka中叫分区,在mongodb中叫shard,在HDFS上叫DataNode。而保证高可用的方式就是做交叉备份。...cluster(集群) 主从+哨兵,只能保证Redis的高可用,并不能保证Redis的高性能,因为一个master节点并不能放海量数据,而且单个Redis的实例过大时,会导致rdb文件过大,当执行主从同步时时间过长...如果想做到高性能该怎么办?分片啊,我一开始就提到了,都是一个套路。redis搞几个节点,每个节点存储一部分数据。...当然Redis作者也意识到这个问题了,redis cluster应用而生。 没时间写了,下一篇再补充sentinel 和 redis cluster的其他知识吧
上次我们简单的说了一下我们的redis的安装和使用,这次我们来说说redis为什么那么快和持久化数据 在我们现有的redis中(5.0....*之前的版本),Redis都是单线程的,那么单线程的Redis为什么还会有那么高的效率呢?...因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换中性能损耗的问题,正因为Redis是单线程,所以我们要小心使用Redis指令,对于那些耗时的指令(比如keys),我们一定要谨慎使用...我们还可以通过进入redis-cli客户端以后,我们手动输入save或者bgsave来生成我们的dump.rdb文件。我们的redis服务端配置是采用bgsave的方式来保存的。...总结 这次我们主要说了我们的Redis的内存高性能,Redis在内存来计算的,再就是我们的高级设置keys *(少用或者别用)和我们的scan命令,再就是Redis的持久化,两种RDB和AOF,RDB
类似的当Redis通过recv()从一个客户端读取数据时,如果数据一直没有到达,Redis也会一直阻塞在recv();这就导致Redis整个线程阻塞,无法处理其他客户端请求,效率很低; 非阻塞模式 在...:Redis 调用 recv()后,如果已连接套接字上一直没有数据到达,Redis线程同样可以返回处理其他操作;我们也需要有机制继续监听该已连接套接字,并在有数据达到时通知Redis;这样才能保证 Redis...线程,既不会像基本 IO 模型中一直在阻塞点等待,也不会导致 Redis无法处理实际到达的连接请求或数据; 基于多路复用的高性能 I/O 模型 Linux中的IO多路复用机制是指一个线程处理多个IO...一旦有请求到达就会交给Redis线程处理,这就实现了一个Redis线程处理多个IO流的效果; 图中的多个FD就是刚才所说的多个套接字;Redis网络框架调用epoll机制,让内核监听这些套接字。...因为Redis一直在对事件队列进行处理,所以能及时响应客户端请求,提升Redis的响应性能; 这两个请求分别对应Accept事件和Read事件,Redis分别对这两个事件注册accept和get回调函数
sortset和hashmap的结合体,但是在redis中是通过两种底层数据结构实现的。...一种是ziplist压缩列表,另一种就是redis中最经典的数据结构skipList跳跃表。...上图就是跳跃列表的示意图,图中只画了四层,Redis 的跳跃表共有 64 层,意味着最 多可以容纳 2^64 次方个元素。...Redis 就是这么干的。 不过 Redis 遇到 score 值改变了就直接删除再插入,不会去判断位置是否 需要调整。...还有我们大概看了下redis的skip底层数据结构 上面文章也有说道红黑树,博主也有看到很多面试题是这样问的: redis的有序集为什么使用skiplist 而不使用红黑树来实现呢?
译者注 该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单、高性能兼容Redis协议的数据库的经历。...首先这个"Redis"是非常简单的实现,但是他在优化这个简单"Redis"路程很有趣,也能给我们在从事性能优化工作时带来一些启示。...原作者:Ayende Rahien 原链接:https://ayende.com/blog/197473-C/high-performance-net-building-a-redis-clone-architecture...构建Redis克隆版-架构 在之前的文章中,我们尝试用最简单的方式来完成一个Redis克隆版。...让我们退一步来构建一个与Redis架构更为接近的Redis克隆版。为此,我们需要在一个线程中完成所有工作。这在C#中是比较难实现的,没有用于执行Redis那样工作类型的API。
下载脚本将其放置在/usr/local/openresty/lualib目录下面,以便在lua脚本中引用 获取redis数据 编写连接redis的测试脚本,并从redis中获取指定key的值。...脚本内容如下: local redis = require("resty.redis") local json = require ("dkjson") --创建实例 local redis_instance...: ", err) return close_redis(redis_instance) end local resp, err = redis_instance:eval("return redis.call...浏览器输入http://192.168.1.105/lua_redis_test,应当输出redis中alibaba键的值。...redis获取数据,大大提高的数据请求响应的效率。
当线程 1 释放锁之后,会触发 redis 的解锁消息,消息的观察者会观察到然后去唤醒解锁的逻辑,线程 2 继续竞争锁。...配置部分 Config config = new Config(); String address = "redis://127.0.0.1:6379";...('exists', KEYS[1]) == 0) then " + "redis.call('hincrby', KEYS[1], ARGV[2], 1...); " + "redis.call('pexpire', KEYS[1], ARGV[1]); " +..."return nil; " + "end; " + "if (redis.call('hexists',
背景 redis之所以快,除了他是基于内存存储的,还有优秀的IO框架外更离不了其底层高性能数据结构的设计。现在我们来细细品一下redis的高新能数据结构是如何设计的。...Redis数据结构 redis有五种数据结构,分别是String,list(列表),Set(集合),Hash(哈希),Zset(有序结合)。这五种数据结构代表的是他的Value值的数据结构。...今天我们来看redis的String类型。动态字符串SDS。...//todo redis SDS源码理解 1. redis时使用C语言写的,那为什么不直接使用C语言函数库里里面的字符串呢?拿来即用。...如果总体超出了 64 字节,Redis 认为它是一个 大字符串,不再使用 emdstr 形式存储,而该用 raw 形式 (来自redis深度历险) 通俗一点说吧,redis的内存开辟是有规格的,只能开辟
高性能开发(1) Redis缓存主从配置详解 强烈推介IDEA2020.2破解激活...windows版本官方下载地址:https://github.com/MSOpenTech/redis/releases 三、安装Redis(用windows版本为例) 下载Redis-x64-3.0.504...Files\redis\masterRedis -win-3.0.5\redis-server.exe" redis.windows.conf ?...启动从服务脚本: D:\Program Files\redis\slaveRedis-win-3.0.5>"D:\Program Files\redis\slaveRedis-w in-3.0.5\redis-server.exe...2. shutdown 3. exit 4. redis-server.exe redis.windows.conf 注:最主要的是启动redis-server.exe时,后面要带上redis.windows.conf
Redis Github开源 Redis:一款基于C语言开发的高性能NOSQL系统 我已经将Redis源码fork到我的github仓库了,可以去我的github上看看https://github.com.../JLGPL/redis Linux下安装Redis 下载解压Redis 本博客介绍Redis-2.6.14版本的安装 按照Linux系统安装常规,我们一般先下载源代码到/usr/local/src...### 建立Redis链接 ln -s redis-2.6.14 redis 进入Redis文件夹目录 cd redis 安装Redis到/usr/local/redis make.../local/redis目录下面了,使用需要修改redis配置,使其可以找到Redis-server和Redis-cli服务 添加&符号的作用是使Redis服务后台运行,否则,启动Redis服务时,.../etc/profile 使用Redis服务 然后我们可以在Redis源代码路径下面,检测redis进程是否启动了 ps -ef | grep redis 可以看到如下类似的,说明redis
所以今天我们就来聊一下如何实现高性能的限流。 重试、限流、熔断、降级被称为分布式系统高可用的四板斧。...对于限流有很多方式,最经典的几种就是,计数器法、滑动窗口、漏桶法、令牌桶等,今天北哥要讲的是采用Redis + Lua脚本实现高性能的分布式限流,下面就跟着北哥来一起实战吧。...Redis+Lua实现高性能分布式限流 这篇文章介绍Redis+Lua实现分布式限流,很多小伙伴不知道Lua是什么,个人理解,Lua脚本和 MySQL数据库的存储过程比较相似,他们执行一组命令,所有命令的执行要么全部成功或者失败...并且通常我们使用Redis事务时,并不是直接使用Redis自身提供的事务功能,而是使用Lua脚本。...相比Redis事务,Lua脚本的优点: 减少网络开销:使用Lua脚本,无需向Redis 发送多次请求,执行一次即可,减少网络传输 原子操作:Redis 将整个Lua脚本作为一个命令执行,原子,无需担心并发
背景 上一节讲Redis的高性能字符串结构SDS,今天我们来看一下redis的hash对象。 Hash对象 简介 redis的hash对象有两种编码(底层实现)方式,字典编码和压缩列表编码。...在哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节和哈希对象保存的键值对数量小于 512 个使用的是ziplist,不能满足这个的使用的是hashtable(字典编码) 深度理解 ZipList(压缩列表) redis...如果是一样的话就可以根据下表进行行为(个人理解,有错误还请指出),且prevlen 是一个变长的整数,redis的常规操作,将不同长度使用不同的数据类型。...不仅是hash对象底层使用了dict,而且在redis全局也是使用的是key-vlue结构,也就是字典的形式,还有Zset的数据结构底层也是基于redis 中的dict结构。...高性能数据结构我们可以看到他在很对细节的把握很多,如不同的数字大小选用不同的字段类型,同一个对象根据大小选择不同的存储类型。
Redis的单线程和高性能 ---- Redis是单线程吗?...Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。...但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。 Redis 单线程为什么还能这么快?...正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。...Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。
相信大家在面试过程中经常会被问到:“单线程的Redis为啥这么快?”...文件处理器的四个组成部分 Redis的IO多路复用程序的所有功能都是通过包装常见的select、poll、evport和kqueue这些IO多路复用函数库来实现的,每个IO多路复用函数库在Redis源码中都有对应的一个单独的文件...这就是IO多路复用在redis中的应用。 四、总结 Redis 6.0 之后的版本开始选择性使用多线程模型。...Redis 选择使用单线程模型处理客户端的请求主要还是因为 CPU 不是 Redis 服务器的瓶颈,使用多线程模型带来的性能提升并不能抵消它带来的开发成本和维护成本,系统的性能瓶颈也主要在网络 I/O...操作上; 而 Redis 引入多线程操作也是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。
Redis是一个非关系型数据库,也是一个内存数据库(确切一点,可以把它看做内存数据结构服务器, 设计极其精简,如果说在mongo里面还能看到表的影子"集合(collection)",那么redis则是完全放弃了..."表"结构,存储数据完全依赖于 五种类型的数据结构; Redis存储数据 的 五种数据结构 1....Redis存储数据的五种数据结构 1.基础类型string(最基本) 1.1增set 格式: set 键 值 示例: set Apple iPhone 1.2删del 格式: del...对象类型hash(相当于一个小的redis数据库) 5.1增hset 格式: hset 键 属性1的名称 属性1的值 属性2的名称 属性2的值 属性3的名称 属性3的值 示例:...Redis常用命令总结
领取专属 10元无门槛券
手把手带您无忧上云