众所周知,Redis是一个单线程架构的NoSQL数据库,但是是单线程模型的Redis为什么性能如此之高?这就是我们接下来要探究学习的内容. 1.Redis的单线程架构 1.1.Redis单线程简介 首先要明白,Redis的单线程指的是执行命令时的单线程. Redis客户端与服务端的模型可以简化成下图,每次客户端调用都经历了发送命令.执行命令.返回结果三个过程. 我们说的单线程就是在第二步执行命令,一条命令从从客户端达到服务端不会立刻被执行,而是会进入一个队列中等待,每次只会有一条指令被选中执行.…
1.安装Redis Redis6.0在2020年已经发布,所以我们安装Redis3.0. 1.1.在Linux上安装Redis 我们在CentOS上安装Redis.常见的的有三种安装方式: yum/apt软件管理软件安装 源码的方式进行安装 容器化安装 我们这里选择第二种方式: 1)下载Redis指定版本的源码压缩包到当前目录 wget http://download.redis.io/releases/redis-3.0.7.tar.gz 2)解压缩Redis源码压缩包 tar xzf red…
在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于Java编程语言的客户端. 在Java语言体系下,有三个常用的Redis客户端Jedis.Redisson.Lettuce.三者各有特点,各有适用的场景. Jedis:Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持: Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,…
1.string 这是最基本的类型了,就是普通的set和get,做简单的kv缓存. 2.hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在redis里,然后每次读写缓存的时候,可以就操作hash里的某个字段. key=150 value={ "id": 150, "name": "zhangsan", "age": 20 } hash类的数据结构,主要是…
参考链接: http://blog.csdn.net/qqqqq1993qqqqq/article/details/77538202 单线程模型: redis中的数据结构并不全是简单的kv,还有list.hash等复杂的结构,这些结构很可能会进行细粒度的操作,比如在很长的列表偶棉添加一个元素,在hash当中或者删除一个对象,这样的一个操作就会添加很多的锁,导致同步的开销大大增加,redis权衡之后选择使用单线程,突出自己功能的灵活性,在单线程基础上任何原子操作都可以无代价的实现,多复杂的数据结构…
Redis 是将数据存储在内存中的,如果出现断电或系统故障的时候数据就会存在丢失的现象,Redis通过将数据持久化到硬盘中来避免这个问题的出现,我们今天就来学习下 Redis 持久化. Redis 持久化触发条件 手动触发 save bgsave 自动触发 配置策略 系统命令 flushdb exit save 和 bgsave 的区别 Redis 是单线程操作的,当执行 save 命令时会阻塞住线程,阻塞时长根据数据量变化,这样就会造成 Redis 无法响应其他命令.而调用 bgsave 命令…
一.单线程模型 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的每一条到达服务端的命令都不会立刻执行,所有的命令都会进入一个队列中,然后逐个执行.并且多个客户端发送的命令的执行顺序是不确定的.但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型. 二.单线程模型每秒万级别处理能力的原因 (1)纯内存访问.数据存放在内存中,内存的响应时间大约是100纳…
这次我们来简单说说分布式锁,我记得过去我也过一篇JMM的内存一致性算法,就是说拿到锁的可以继续操作,没拿到的自旋等待. 思路与场景 我们在Zookeeper中提到过分布式锁,这里我们先用redis实现一个简单的分布式锁,这里是我们一个简单的售卖减库存的小实例,剩余库存假设存在数据库内. @GetMapping(value = "/getLock") public String getLock() { int stock = Integer.parseInt(stringRedisTem…
导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第一篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首先要感谢一个人三太子敖丙 ,就是他的文章让我发现,原来Redis的知识如此的多姿多彩.恩恩,他的文章,我是期期都看 这是这篇文章的思维导图,因为用的是免费版的软件,所以有不少水印,需要原版的可以问我要 Redis篇,因为时间和篇幅的原因,并没有一次性写完,于是乎,分成了上下两篇,没有看过上半部分的小…
本篇文章介绍下redis排序命令.redis支持对list,set和sorted set元素的排序.排序命令是sort 完整的命令格式如下: SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey]  下面我们一一说明各种命令选项 (1)sort key 这个是最简单的情况,没有任何选项就是简单的对集合自身元素排序并返回排序结果.下面给个例子 redis> lpush ml…
上一章 [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis  介绍了Redis的初始化脚本文件及启动配置文件,并图解如何以服务的形式来启动.终止Redis服务,可以说我们的Redis本地服务器已基本搭建完成,那可能就有小伙伴要问了,什么叫基本搭建完成,原因是此时的Redis服务虽然已经可以正常启\停,但是客户端还无法远程连接到Redis并执行响应的操作.若要实现远程客户端正常连接,我们仍需要对Redis启动配置文件进行一些设置,这个章节我们重点来讲解下如何对Redis…
1.通用API 1.1 keys命令和dbsize命令 keys * 遍历所有key keys [pattern] 遍历模式下所有的key dbsize 计算Redis中所有key的总数 例子: 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> set php good OK 127.0.0.1:6379> set python best OK 127.0.0.1:6379> keys * # 查看Redis中所有的key 1)…
一.Redis的介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型. 二.Redis使用场景 为什么使用Redis: 解决应用服务器的cpu和内存压力 减少io的读操作,减轻io的压力 关系型数据库的扩展性不强,难以改变表结…
Redis源码阅读(三)集群-连接建立 对于并发请求很高的生产环境,单个Redis满足不了性能要求,通常都会配置Redis集群来提高服务性能.3.0之后的Redis支持了集群模式. Redis官方提供的集群功能是无中心的,命令请求可以发送到任意一个Redis节点,如果该请求的key不是由该节点负责处理,则会返回给客户端MOVED错误,提示客户端需要转向到该key对应的处理节点上.支持集群模式的redis客户端会自动进行转向,普通模式客户端则只返回MOVED错误. 先看下常见的Redis集群结构:…
redis做集群的时候有很多种配置方法,一主二从三哨兵这种模式是官网推荐的.,写配置文件链接的时候,写的是哨兵地址,不是IP,用户名,密码之类的. 一主二从很好理解,一个主的redis,实时备份到两个从的redis上面,三个哨兵都是监听到主的redis,如果主的redis挂了的话,三个哨兵会在两个从的redis中选举出一个主的redis.,并且哨兵配置文件会自动修改,挺有意思的看着它自己改动了.然后就没有然后了,模式的大致思路跟mongodb和mysql实现差不多的. 2.3.配置哨兵监听哨兵都…
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置给定 key 的值.如果 key 已经存储其他值, SET 就覆写旧值,且无视类型. ') # 插入成功后返回True ','[123,dffd]') # 插入成功后返回True 2. Get 命令用于获取指定 key 的值.如果 key 不存在,返回 None .如果key 储存的值不是字符串类型,返回一个…
一.简介 1)分布式限流 如果是单实例项目,我们使用Guava这样的轻便又高性能的堆缓存来处理限流.但是当项目发展为多实例了以后呢?这时候我们就需要采用分布式限流的方式,分布式限流可以以redis + lua 或者 nignx + lua这样的组合来实现.. 分布式限流一般应用场景都是在业务上进行限流,所以本文不涉及niginx + lua,简单介绍redis + lua分布式限流的实现.如果是需要在接入层限流的话,应该直接采用nginx自带的连接数限流模块和请求限流模块. 2)redis re…
本篇基于centos7服务器进行部署开发 一.拉取redis镜像,使用如下命令 docker pull redis 1.查看镜像是否拉取成功,使用如下命令 docker images 显示如下则证明拉取成功 二.编写docker-compose.yml文件实现redis一主二从 version: '3.7' services: master: image: redis container_name: redis-master restart: always command: redis-serv…
1.Centos7 Redis一主二从三哨兵配置 Redis一主二从三哨兵环境搭建 2.接入过程 与集成redis单机不同的是jedis相关的配置做了修改,JedisPool换成了JedisSentinelPool,相关改动如下: application文件: # Redis spring.redis: sentinel: #与Redis环境配置的保持一致 master: mymaster #从节点集合 nodes: localhost:26388,localhost:26380,localho…
我们使用的redis,单机的绝对做不到高可用的,万一单机的redis宕机了,就没有备用的了,我们可以采用集群的方式来保证我们的高可用操作. 主从架构 大致就是这样的,一个主节点,两个从节点(一般两个就可以了) 主从工作原理 如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个SYNC命 令(redis2.8版本之前的命令)给master请求复制数据. master收到SYNC命令后,会在后台进行数据持久化通过bgsave生成最新的rdb快照文…
上次我们搭建了Redis的主从架构,哨兵架构以及我们的集群架构,但是我们一直还未投入到实战中去,这次我们用jedis和springboot两种方式来操作一下我们的redis 主从架构 如何配置我上次已经讲过了,https://www.cnblogs.com/cxiaocai/p/11711377.html.我们这次主要看如何用java来操作redis,先来复习一下上次的配置,准备三台服务器,安装redis,保证互通,两台改为slave,配置replicaof IP 端口,主从复制是通过rdb文件…
上几次说了redis的主从,哨兵,集群配置,但是内部的选举一直没说,先来简单说一下选举吧. 集群选举 redis cluster节点间采取gossip协议进行通信,也就是说,在每一个节点间,无论主节点还是从节点,他们之间都是存在相互通信的.例如你的redis端口号是6379,那么你的gossip协议端口号就是16379. gossip协议包含多种消息,包括ping,pong,meet,fail等等. ping:每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群元数据,互…
一.Redis主从 1.1 Redis主从原理 和MySQL需要主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生性能瓶颈,特别是在读压力上,为了分担压力,Redis支持主从复制.Redis的主从结构一主一从,一主多从或级联结构,复制类型可以根据是否是全量而分为全量同步和增量同步.下图为级联结构: 1.1.1 全量同步 Redis全量复制一般发生在slave的初始阶段,这时slave需要将master上的数据都复制一份,具体步骤如下:(1).slave连接master,发送S…
导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第二篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首先要感谢一个人三太子敖丙 ,就是他的文章让我发现,原来Redis的知识如此的多姿多彩.恩恩,他的文章,我是期期都看 Redis篇,因为时间和篇幅的原因,并没有一次性写完,于是乎,分成了上下两篇,没有看过上半部分的小伙伴可以去看一下~ 索引中一些易忽视的点 Redis基础知识两篇就满足(一) Redi…
https://mp.weixin.qq.com/s/QTqcBZlAhp5cLRJGJVZRNw 干货 | 携程Redis治理演进之路(二) 原创 技术中心 携程技术 2020-12-24      …
记得点赞+关注呦. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis 之所以能脱颖而出很大原因是他数据结构丰富,可以支持多种场景.并且 Redis 的数据结构实现以及应用场景在面试中是相当常见的,接下来就和大家聊聊 Redis 的数据结构. Redis数据结构有:string.list.hash.set.sorted set 这五个是大家都知道的,但Redis还有更高级得数据结构,比如:HyperLogLog.Geo.BloomFilter 这几个数据结构,接下来聊聊Red…
前言 在一定的策略下适度地初始化线程池的线程数有利于提高CPU的利用率,达到高效率地在同一段时间内处理多个任务,最佳的线程数量一般是 最佳线程数=(线程等待的时间与线程CPU执行时间之比+1)*CPU核数 像笔者电脑电脑的CPU为8核,假设DB操作.RPC操作.缓存操作等为900毫秒,CPU运行时间为100毫秒,那么以此公式要达到CPU利用率最高,合适的线程数应该为80个. 是不是线程数越多越好呢? 答案肯定是否定的,大名鼎鼎的redis就是单线程的,但它却非常地高效,基本操作都能达到十万量级每…
实践 - 搭建Redis一主两从三哨兵 原因: 最近在复习Redis的时候,学习到了为了提高Redis集群的高可用性,有一个模式为哨兵模式.哨兵模式的作用是为了在主节点出现阻塞或者错误,无法接收数据的时候,及时将从节点切换为主节点,由此保证Redis集群能够保持正常状态,保持高可用. 但是尽管引入哨兵模式能够提高集群的高可用性,但是随之带来的有数据丢失,数据不一致问题.这些问题的原因有可能是因为主从异步复制的时候,主节点挂了,导致子节点接收数据不完整,出现数据不一致问题.也有可能是因为出现了脑裂…
一台服务器上都快开启200个redis实例了,看着就崩溃了.这么做无非就是想让不同类型的数据属于不同的应用程序而彼此分开. 那么,redis有没有什么方法使不同的应用程序数据彼此分开同时又存储在相同的实例上呢?就相当于mysql数据库,不同的应用程序数据存储在不同的数据库下. redis下,数据库是由一个整数索引标识,而不是由一个数据库名称.默认情况下,一个客户端连接到数据库0.redis配置文件中下面的参数来控制数据库总数: databases 可以通过下面的命令来切换到不同的数据库下: re…
Redis 事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行. 一个事务从开始到执行会经历以下三个阶段: 开始事务. 命令入队. 执行事务. 实例 以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执…