2
3
4
5
6
7
8
理解Redis通信协议
Redis数据类型介绍
Redis键管理知识介绍
Redis开发场景简介
Redis复制、持久化、集群介绍
Redis使用相关知识介绍
Redis介绍
Redis简介:Redis是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是完全开源免费的,遵守BSD协议,是
一个高性能的key-value数据库。它通常被称为数据结构服务器,因为值(value)可以是字符串(String),哈希
(Map),列表(list),集合(sets)和有序集合(sorted sets)等类型。redis支持持久化、支持数据备份。
Redis特性
(一)存储结构
Redis是Remote Dictionary Server的缩写,它使用字典结构存储数据,并允许其他应用通过TCP协议读写字典中的
内容。同大多数脚本语言中的字典一样,Redis字典中的键值除了可以是字符串,还可以是其他数据类型。
Redis支持的数据类型有字符串、散列、列表、集合、有序集合。
(二)内存存储与持久化
Redis数据库的所有数据都存储在内存中。在一台普通的笔记本电脑上,Redis可以在1秒内读写超过十万个键值。
Redis也提供了持久化的支持,即将内存中的数据异步写入硬盘中,同时不影响继续提供服务。
(三)功能丰富
Redis在很多场合是名副其实的多面手,越来越多的人将其用作缓存、队列系统中。例如,Redis可作为缓存系
统,并且可以为每个键设置生存时间,生存时间到期后键会自动删除;Redis还支持“发布/订阅”的消息模式,
等等。
(四)简单稳定
在Redis中使用命令来读写数据,就相当于SQL语言之关系型数据库。并且Redis提供了几十种不同编程语言的客
户端库,这些库很好地封装了Redis命令,使得在程序中与Redis进行交互更加容易。Redis是开源的,良好的开发
氛围和严谨的版本发布机制使得Redis的稳定版本更加可靠。
理解Redis事件模型
Redis是一个事件驱动的内存数据库,服务器需要处理两种类型的事件。文件事件和时间事件
文件事件:
Redis服务器通过Socket实现与客户端(或其他redis服务器)的交互,文件事件就是服务器对Socket操作的抽
象。Redis服务器,通过监听这些socket产生的文件事件并发处理这些事件,实现对客户端调用的响应。
Redis基于Reactor模式开发了自己的事件处理器。
fd
fd
fd
fd
fd
fd
I/O多路复用(multiplexing)模块
事件分发器(dispatcher)
连接应答处理器
acceptTcpHandler
命令请求处理器
readQueryFromClient
命令回复处理器
sendReplyToClient
理解Redis事件模型
时间事件:Reids 有很多操作需要在给定的时间点进行处理,时间事件就是对这类定时任务的抽象。
定时事件:
指定时间后执行一次
时间处理器返回AE_NOMORE,该事件达到一次后删除
周期事件:
每隔指定时间执行一次
事件处理器返回非AE_NOMORE整数值,根据该值更新when属性,让该事件存在一段时间
后再次到达
时间事件3个属性
id:全局唯一,递增分配
when:毫秒精度UNIX时间戳,记录时间事件的到达时间
timeProc:时间事件处理器,一个函数,时间事件到达时,服务器调用相应器处理事件
实现原理
服务器将所有时间事件放在一个无序链表(when属性无序)
当时间事件执行器运行时遍历整个链表,查找所有已到达的时间事件,然后调用相应事件处理器
理解Redis通信协议
Redis是一个接受并处理来自客户端请求的非阻塞、I/O复用的TCP服务器。对于Redis来说,这种通信协议叫
做Redis Serialization Protocol(RESP,Redis序列化协议)。
RESP协议支持的数据类型
间隔符号,在Linux下是\r\n,在windows下是\n
1、简单字符串Simple Strings,以“+”加号开头
格式:+字符串 \r\n
字符串不能包含CR或者LF(不允许换行)
eg:"+OK\r\n"
注意:为了发送二进制安全的字符串,一般推荐使用后面的Bulk Strings类型。
2、错误Errors,以“-”减号开头
格式:-错误前缀 错误信息\r\n
错误信息不能包含CR或者LF(不允许换行),Errors与Simple Strings很相似,不同的是
Erros会被当作异常来看待。eg:"-Error unknow command 'foobar'\r\n"
3、整数型Integer,以“:”冒号开头
格式:数字\r\n
eg: “:1000\r\n”
理解Redis通信协议
4、大字符串类型Bluk Strings,以“$”美元符号开头,长度限制512M
格式:$字符串的长度\r\n字符串\r\n
字符串不能包含CR或者LF(不允许换行);
eg:"$6\r\nfoobar\r\n"其中字符串为foobar,而6就是foobar的字符长度
"$0\r\n\r\n" 空字符串
"$-1\r\n" null
5、大字符串类型Bluk Strings,以“$”美元符号开头,长度限制512M
数组类型Arrays,以“*”星号开头
格式:*数组元素个数\r\n其他所有类型(结尾不需要\r\n)
Redis数据类型
1 字符串类型
字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,例如存储用户的邮箱、JSON化的对象甚
至是一张图片。一个字符串类型键允许存储的数据的最大容量是512MB。字符串涉及的命令:set、get、strlen、
append、setrange。
2 列表类型
列表时应用程序开发中非常有用的数据类型之一。列表能够存储一组对象,因此它也可以被用作栈或者队列。
在redis中,与键相关联的值可以是字符串组成的列表,Redis中的列表更像是数据结构中的双向链表。列表操作
涉及的命令:LPUSH、LRANGE、RPUSH、LINSERT、LINDEX
3 哈希类型
哈希表示字段和值之间的映射关系,
HMSET "kyoto Ramen" "address" "801 Mission St,San Jose,CA" "phone" "555-123-6543" "rating" "5.0"
与哈希类型操作相关的命令:HMSET、HMGET、HEXISTS 、HGETALL 、HSET、HGET、HSCAN
4 集合类型
集合类型是由唯一、无序对象组成的集合(collection)。它经常用于测试某个成员是否在集合中、重复项删除
和集合运算(求并、交、差集)。Redis的值对象可以是字符串集合。
与集合类型操作相关的命令:SADD、SISMEMBER、SREM、SCARD、SSCAN
Redis数据类型
5 有序集合(sorted set)类型
有序集合是一个类似但更复杂的数据类型。单词“Sorted”意味着这种集合中的每个元素都拥有一个可用于
排序的权重,并且我们可以按顺序从集合中获取元素。
与有序集合操作相关的命令:ZADD、ZREVRANGE、ZINCRBY、ZREVRANK、ZSCORE
6 HyperLogLog类型
在日常的各种数据处理场景中,“唯一计数”是一项常见的任务。在Redis中,虽然我们可以使用集合来进
行唯一计数;但是,当数据量增大到上千万时,就需要考虑内存消耗和性能下降问题了。我国我们不需要
获取数据集的内容,而只是想得到不同值的个数,那么就可以使用HyperLogLog(HLL)数据类型来优化使用集
合类型时存在的内存和性能问题。
相关操作命令:PFADD PFCOUNT PFMERGE
7 GEO类型
Redis从3.2版本开始正式引入了Geo(地理位置)相关的API,用于支持存储和查询这些地理位置相关场景
中的坐标。相关操作命令:GEOADD GEOPOS GEORADIUS GEODIST 等命令
关于Key过期时间