rdb

Redis事务的实现原理

别来无恙 提交于 2020-08-14 09:58:11
Redis通过 MULTI 、 EXEC 、 WATCH 、 DISCARD 等命令来实现事务功能。主要有以下三个阶段: 事务开始 MULTI 命令的执行,标识着一个事务的开始。 MULTI 命令会将客户端状态的 flags 属性中打开 REDIS_MULTI 标识来完成的。 命令入队 当一个客户端切换到事务状态之后,服务器会根据这个客户端发送来的命令来执行不同的操作。如果客户端发送的命令为 MULTI 、 EXEC 、 WATCH 、 DISCARD 中的一个,立即执行这个命令,否则将命令放入一个事务队列里面,然后向客户端返回 QUEUED 回复 Redis客户端拥有自己的事务状态 typedef struct client { // ...... // 事务状态(MULTI或者EXEC) multiState mstate; // ...... } client; 事务状态包含一个事务队列 typedef struct multiState { // 事务队列,FIFO multiCmd *commands; // 已入队命令计数 int count; // ...... } multiState; 事务队列中multiCmd类型保存了一个已入队命令的相关信息 typedef struct multiCmd { // 参数 robj **argv; // 参数数量 int

Redis事务的实现原理

廉价感情. 提交于 2020-08-14 09:54:30
Redis通过 MULTI 、 EXEC 、 WATCH 、 DISCARD 等命令来实现事务功能。主要有以下三个阶段: 事务开始 MULTI 命令的执行,标识着一个事务的开始。 MULTI 命令会将客户端状态的 flags 属性中打开 REDIS_MULTI 标识来完成的。 命令入队 当一个客户端切换到事务状态之后,服务器会根据这个客户端发送来的命令来执行不同的操作。如果客户端发送的命令为 MULTI 、 EXEC 、 WATCH 、 DISCARD 中的一个,立即执行这个命令,否则将命令放入一个事务队列里面,然后向客户端返回 QUEUED 回复 Redis客户端拥有自己的事务状态 typedef struct client { // ...... // 事务状态(MULTI或者EXEC) multiState mstate; // ...... } client; 事务状态包含一个事务队列 typedef struct multiState { // 事务队列,FIFO multiCmd *commands; // 已入队命令计数 int count; // ...... } multiState; 事务队列中multiCmd类型保存了一个已入队命令的相关信息 typedef struct multiCmd { // 参数 robj **argv; // 参数数量 int

使用Redis-port迁移数据

两盒软妹~` 提交于 2020-08-14 05:44:17
迁移介绍 Redis-port是一款开源的数据批量传输工具,主要用于Redis节点间的数据库同步,该工具具备以下功能: dump 生成缓存快照,将缓存数据导出为rdb文件。 decode 解析rdb文件,查看数据分布情况。 restore 将rdb文件恢复(导入)到实例中。 sync 将Redis实例中的数据同步到另一个Redis实例中。 适宜场景 通过Redis-port导入整库,需要能够获取到RDB文件,适宜以下场景: “数据中心自建Redis服务”迁移到“DCS缓存实例” “华为云自建Redis服务”迁移到“DCS缓存实例” 本文主要介绍基于 Redis-port v2.0-beta版本(linux) 如何从用户自建Redis迁移到华为云DCS中。 步骤1:安装Redis-port 下载和解压工具,可直接使用,无需编译。 在执行导出和导入操作的服务器上都需要安装Redis-port。 wget https://github.com/CodisLabs/redis-port/releases/download/v2.0-beta/redis-port-v2.0-beta-go1.10.1-linux.tar.gz tar -xvf redis-port-v2.0-beta-go1.10.1-linux.tar.gz 步骤2:导出数据 redis-dump -n 3 -m

记一次Redis错误排查经历(redis cluster 节点重启后无限同步问题)

百般思念 提交于 2020-08-14 03:47:44
日志集中式监控平台上线已经有一段时间,但是大部分情况下只是作为发布或者出问题时查看日志的便利工具使用。平时大家都不怎么主动上去看看。于是前几天把应用的错误日志也加上邮件、Hi和短信报警,马上就收到很多错误报警,引起了大家的重视。其中有一个 Redis 报错: Push notify error: => redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java: 53 ) at redis.clients.jedis.JedisPool.getResource(JedisPool.java: 99 ) at com.baidu. global .mobile.server.dataaccess.cache.CacheClient.execute(CacheClient.java: 285 ) at com.baidu. global .mobile.server.dataaccess.cache.CacheClient.getAsRaw(CacheClient.java: 793 ) at com.baidu. global .mobile.server

Redis凭啥这么快?只能做缓存?架构师道出了真相(颠覆你的认知)

纵然是瞬间 提交于 2020-08-14 00:32:18
Redis到底有多快 Redis采用的是基于内存的采用的是 单进程单线程 模型的 KV 数据库 , 由C语言编写 ,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差!有兴趣的可以参考官方的基准程序测试《 How fast is Redis? 》( redis.io/topics/benchma ) 横轴是连接数,纵轴是QPS 。此时,这张图反映了一个数量级,希望大家在面试的时候可以正确的描述出来,不要问你的时候,你回答的数量级相差甚远! Redis为什么这么快 1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1); 2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的; 3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; 4、使用多路I/O复用模型,非阻塞IO; 5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话

面试必问之redis

吃可爱长大的小学妹 提交于 2020-08-13 13:26:14
这里是我作为10年面试经验总结的面试中必问问题 问题一 简单介绍下redis redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化 问题二 redis有哪几种数据结构 1、string是redis最基本的类型,可以理解成与memcached一模一样的类型,一个key对应一个value。value不仅是string,也可以是数字。string类型是二进制安全的,意思是redis的string类型可以包含任何数据,比如jpg图片或者序列化的对象。string类型的值最大能存储512M。 2、Hash是一个键值(key-value)的集合。redis的hash是一个string的key和value的映射表,Hash特别适合存储对象。常用命令:hget,hset,hgetall等。 3

Redis的持久化和事务

对着背影说爱祢 提交于 2020-08-13 01:57:49
两种持久化方式 Redis 有两种持久化方式, RDB 和 AOF RDB(Redis DataBase) RDB 默认将数据保存到 dump.rdb 文件中 可以理解为将数据备份到磁盘,通过使用该文件就可以将磁盘中的数据恢复到 Redis 中 相关配置 ################################ SNAPSHOTTING ################################ # # 保存 DB 到硬盘: # # save <seconds> <changes> # # 将会在<seconds> 和 <changes>两个值同时满足时,将DB数据保存到硬盘中 # 其中<seconds> 每多少秒,<changes>是改变的key的数量 # # 在以下的例子中,将会存在如下的行为 # 当存在最少一个key 变更时,900秒(15分钟)后保存到硬盘 # 当存在最少10个key变更时,300秒后保存到硬盘 # 当存在最少1000个key变更时,60秒后保存到硬盘 # # 提示: 你可以禁用如下的所有 save 行 # # 你可以删除所有的save然后设置成如下这样的情况 # # save "" save 900 1 save 300 10 save 60 10000 在 redis-cli 中使用 save 或 bgsave 均可立即保存数据(

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

吐血整理60个Redis面试题

微笑、不失礼 提交于 2020-08-12 05:32:01
1.Redis 是一个基于内存的高性能key-value数据库。 2.Redis相比memcached有哪些优势: memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 redis的速度比memcached快很多 redis可以持久化其数据 3.Redis是单线程 redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销 4.Reids常用5种数据类型 string,list,set,sorted set,hash 6.Reids6种淘汰策略: noeviction : 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。大多数写命令都会导致占用更多的内存(有极少数会例外。 **allkeys-lru:**所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。 **volatile-lru:**只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。 **allkeys-random:**所有key通用; 随机删除一部分 key。 volatile-random : 只限于设置了 expire 的部分; 随机删除一部分 key。 volatile-ttl : 只限于设置了 expire

Redis从入门到精通:中级篇

喜你入骨 提交于 2020-08-12 05:12:01
原文链接:http://www.cnblogs.com/xrq730/p/8944539.html,转载请注明出处,谢谢 本文目录 上一篇文章以认识Redis为主,写了Redis系列的第一篇,现在开启第二部分的学习,在本文中,我们将看到以下内容: Redis数据结构String、Hash、List、Set、SortedSet及相关操作,提一下Redis在3.2.0之后有新增了一种GEO的数据类型表示地理位置,不过本文这种数据结构略过 Redis其他一些常用命令,分为Key操作与服务器操作 Redis事务机制 主要以实战为主,希望通过本文可以让大家掌握Redis的基本使用。 本来这篇文章还准备加上Redis线程模型分析的,但是写完发现篇幅实在太长,就把Redis线程模型放到最后一篇中了,也挺好的,本文专注于对Redis命令的讲解。 另外说一下,本文讲Redis中的数据结构,但是 数据结构本身不在本文的讲解范围内 ,如果想知道Hash、List、Set等数据结构特点及使用场景,可以自己查阅数据结构相关资料。 String数据结构的基本操作 首先说一下数据结构String,这是Redis中最简单的一种数据结构,和MemCache数据结构是一样的,即Key-Value型的数据,根据Redis官方文档, Value最大值为512M 。 下面用表格来看一下String操作的相关命令: 命令