0%

NoSQL简介

NoSQL最常见的解释是”non-relational”,”Not Only SQL”也被很多人接受,泛指非关系型数据库,NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题,它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。

阅读全文 »

redis事务

注意:我使用的版本是6.0.10,不同版本可能略有差别

redis事务就是一组命令的集合,一个事务中所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入

  • Redis的事务仅仅是保证事务里的操作会被连续独占的执行,因为是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的

  • Redis的事务没有隔离级别的概念,因为事务提交前任何指令都不会被实际执行,也就不存在事务内的查询要看到事务里的更新,在事务外查询不能看到这种问题了

  • Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力

事务的常用命令

  • multi 标记一个事务块的开始,后续命令逐个放入队列中
  • exec 执行事务块的命令
  • discard 取消事务,丢弃事务块的命令,需要在exec之前
  • watch key [key …] 监视key,如果在事务执行之前,这个key被其他命令所改动,则事务中断。watch要在multi之前进行执行
  • unwatch 取消监视所有key
阅读全文 »

redis数据结构

redis全名(Remote Dictionary Server),即远程字典服务

redis的值的数据结构类型有String、List、Set、Hash、zset(sorted set,有序集合)、Bitmaps(位图)、HyperLogLogs

注意:我使用的版本是6.0.10,不同版本可能略有差别

redis中key的最大长度为512M

对象

server.h

任何value对象都会被包装成一个redisObject,redisObject能指定value类型,编码方式等数据属性

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct redisObject {
// 对象的类型 字符串、列表、集合、哈希表
unsigned type:4;
// 编码方式,也就是存储方式,提供多种方式来保存一个数据
unsigned encoding:4;
// 记录最后一次被访问的时间
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
// 引用计数 * and most significant 16 bits access time). */
int refcount;
// 指向底层实现的指针
void *ptr;
} robj;
阅读全文 »

vim编辑器

vim有三种模式,命令模式,插入模式,末行模式,在一开始的时候默认进入的是命令模式

命令模式

命令模式:默认的模式,该模式下有很多的快捷键

阅读全文 »

redis主从复制

注意:我使用的版本是6.0.10,不同版本可能略有差别

虽然redis有持久化的功能可以保证redis服务重启不会丢失数据,但是如果redis服务器的硬盘损坏就会导致数据丢失,使用主从复制来避免这种单点故障。

主机数据更新后根据配置和策略自动同步到备机的master/slave机制,master以写为主,slave以读为主

原理

主要是使用PSYNC命令来实现

PSYNC命令具有全同步和部分同步两种模式

redis会首先尝试部分同步,如果失败才会尝试全同步。slave连接master后,会主动发起psync命令,slave会提供master_runid和offset,master验证maste_runid和offset是否有效,master_runid相当于master的身份验证码,用来验证slave上一次连接的master,offset是全局积压空间数据的偏移量。如果验证未通过,则进行全同步

  • 全同步用于处理初次复制的情况:slave启动成功连接到master后会发送一个psync命令,master接到命令后会启动后台创建并发送RDB文件,完成后将命令发送给slave
  • 部分同步用于处理断线后重复制的情况:在断线后重连,slave向master发送psync命令,master将断线之后的写命令发送给slave
阅读全文 »