redis简单了解
一言之
redis是一个速度非常快的非关系数据库Nosql数据库
redis为什么快
- redis是C语言写的语言性能较高
- redis是基于内存的,访问速度快
- 多路复用io阻塞机制
Redis有什么特点
最为人称道的就是快(对于程序来说当然是越快越好,对于男人来说可就不一样了)
那具体Reids有哪些特点
- 单进程单线程模型
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
- 支持lua脚本
Redis的数据类型
- String类型它是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。对每种数据类型,Redis都提供了丰富的操作命令,如:GET/MGETSET/SETEX/MSET/MSETNXINCR/DECRGETSETDEL
- 哈希类型该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。Hash的操作命令如下:HGET/HMGET/HGETALLHSET/HMSET/HSETNXHEXISTS/HLENHKEYS/HDELHVALS
- 列表类型该类型是一个插入顺序排序的字符串元素集合, 基于双链表实现。List的操作命令如下:LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSETLINDEX/LRANGELLEN/LTRIM
- 集合类型Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是唯一的。Set类型的底层是通过哈希表实现的,其操作命令为:SADD/SPOP/SMOVE/SCARDSINTER/SDIFF/SDIFFSTORE/SUNION
- 顺序集合类型ZSet是一种有序集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与Set类型一样,其底层也是通过哈希表实现的。ZSet命令:ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNTZINTER/ZDIFF/ZDIFFSTORE/ZUNION
Reids持久化
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis 提供了两种持久化方式:RDB(默认) 和AOF
- RDB时间间隔内将内存中的数据和操作通过快照的方式保存到redis bin目录下的一个默认名为 dump.rdb的文件,可以通过配置设置自动的快照持久化的方式,我们可以配置redis在n秒内进行快照的时间,如果超过这个时间节点,将会自动执行快照操作。虽然这种方式方便快捷,但是无法保证数据的绝对安全可靠,如果服务器在非备份时间跨度内发生了故障,无法做到对当前状态的实时保存,导致数据丢失。而且每次保存 RDB文件时, Redis都需要 fork()出一个子进程,由子进程来执行具体的持久化工作,对资源消耗较大。
- AOFredis 的 AOF 持久化是在每次接受到的写命令通过 write函数追加到文件中(默认是 appendonly.aof),但是由于操作系统在写入文件时使用了缓存来提高写入效率,还是可能会出现因服务器突然故障而导致的数据丢失,故我们可以通过配置文件告诉redis我们同步数据的时间间隔(默认间隔是每秒同步一次)。
AOF 的速度可能会慢于 RDB 。——最大缺点;也是RBD的优点
在一般情况下, 每秒 fsync 的性能依然非常高——折中方案,数据安全与访问性能折中, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。
支持lua脚本
可以参考我之前写的简单使用lua脚本~ Redis调用。后面我们在进行其他的实战练习。好吧小尾巴
Redis通信协议
- redis的请求响应模型redis接收由不同参数组成的命令,执行后返回响应给客户端。这种模式由2个例外情况Redis支持管道操作。所以客户可以一次发送多个命令,稍后等待回复。Redis客户端订阅 Pub/Sub模式的通道时,协议会改变语义变成推送协议,也就是说,客户端不再需要发送命令,因为服务器一旦收到消息就会自动向客户端发送该新消息(对于订阅了通道的客户端)。
RESP(Redis的序列化协议)协议与Redis的服务器端进行通信。 虽然该协议是专门为Redis设计的,但是该协议也可以用于其他 客户端-服务器 (Client-Server)。具有 实现简单、解析快速、人类可读的特点
RESP协议支持5种数据类型:简单字符串(Simple Strings)、错误数据(Errors)、整数(Integers)、批量字符串(Bulk Strings)、数组(Arrays);
客户端和服务器间通信的时候不同的数据类型根据请求/响应报文的第一个字节进行区分:
- 简单字符串以 + 开头
- 错误数据以 - 开头
- 整数以 : 开头
- 批量字符串以 $ 开头
// 批量字符串类型,用于表示二进制安全的字符串,最大长度支持512MB。
// 字符串 '非鸽传书' 使用 RESP协议则展示如下:
"\r\n非鸽传书\r\n"
// 空串
" "$0\r\n\r\n"\r\n\r\n"
// redis客户端请求命令均是存放在数组类型中
// 数组,[非鸽传书, RESP]使用RESP表示如下(注意最后一个换行):
*2
非鸽传书
RESP
// 命令'set name 非鸽传书'
*3
set
name
非鸽传书
不同部分分隔使用 \r\n(CRLF)。
封面图侵权删