简介
Redis 是一个开源免费高性能的 key-value
数据库,也是常见的 NoSql
数据库,和其它类似产品相比(主要是 Memcache
)相比有三个优点:
- 支持数据持久化,可以将内存中数据保存到磁盘,重启时可以再次加载到内存中
- 支持的数据类型不仅仅是
string
,还支持list
set
zset
以及hash
. - 支持 主-从(master - slave) 数据备份
优势及特性
- 性能极高,读的速度是 110000次/s, 写的速度是 81000次/s
- 丰富的数据类型
- 原子性操作,单个操作是原子性的,多个操作也支持事务,通过
MULTI
和EXEC
指令包起来 - 丰富的特性,支持
publish/subscribe
,通知,key过期等特性
数据类型
Redis支持五种数据类型,分别是 string(字符串), hash(哈希), list(列表), set(集合), zset(有序集合).
- String (字符串)
String 类型是最基本类型, Redis 的 String 类型是二进制安全的,可以包含任何数据,最大能存储512MB
- Hash (哈希)
Redis Hash 是一个键值对集合,特别适合存储对象,单条可以存储2^32 -1 键值对(40多亿).
- List (列表)
Redis List 是字符串列表,依照插入顺序排序,单条最多可存储2^32 -1 元素(40多亿).
- Set (集合)
Redis Set 是字符串无序集合,通过哈希表实现,添加|删除|查找的复杂度都是O(1),集合内元素有唯一性,第二次插入的元素会被忽略掉,单条可以存储2^32 -1 元素(40多亿).
- ZSet (Sorted Set: 有序集合)
ZSet 和 Set 大体一致,区别在于每个元素都会关联一个 double 类型的分数,Redis正是通过分数来为成员从小到大排序,并且分数(score)可以重复.
各个数据类型可以参照下图
配置
配置方法
Redis 的配置文件位于安装目录下,文件名为 redis.conf
, 可以通过 CONFIG 命令查看或设置配置项.
# 读取配置项
redis 127.0.0.1:6379> CONFIG GET [CONFIG_SETTING_NAME | *]
# 设置配置项
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
配置项
以下为常用配置项,完整配置项见 Redis配置项
- daemonize [no|yes] - 设置是否以守护进程方式运行
- pidfile [filepath] - 设置 pid 文件路径,默认是
/var/run/redis.pid
- bind [IP] - 绑定IP,多个IP之间用英文逗号分隔,默认
127.0.0.1
- port [端口] - 绑定端口,默认
6379
- timeout [second] - 超时时间,默认
0
,永不超时 - databases [num] - 数据库总数,默认
16
- slaveof [master-ip] [master-port] - 设置本机为 slave 服务时,连接 master 服务的IP和端口.
- masterauth [master-password] - master服务的连接密码
命令
事务
事务可以一次执行多个命令,并且带有以下两个重要保证:
- 事务是一个单独的隔离操作
事务中的所有命令都会序列化并按顺序执行,事务在执行过程中,不会被其它客户端发送的执行命令打断.
- 事务是一个原子操作
事务中的命令要么全部被执行,要么全部不执行
EXEC 命令负责出发并执行事务中的所有命令,如果因为其它原因导致 EXEC 没有成功执行,那么事务中的命令都不会执行.
详细文档见Redis事务 .
发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,详细文档见Redis发布订阅 .
数据备份与恢复
数据备份可以使用 save 和 bgsave 两个命令来操作
数据恢复只需将备份文件(xxx.rdb)移动到redis的安装目录下并启动服务器即可,获取redis目录可以使用 config 命令.
# 备份
127.0.0.1:6379> save
OK
# 后台备份
127.0.0.1:6379> bgsave
Background saving started
# 获取安装目录
127.0.0.1:6379> config get dir
1) "dir"
2) "/var/lib/redis"
性能测试
Redis 性能测试是通过同时执行多个命令实现的,测试命令如下
redis-benchmark [option] [option-value]
- -h 指定服务器主机名,默认值:127.0.0.1
- -p 指定服务器端口,默认值:6379
- -s 指定服务器socket
- -c 指定并发连接数,默认值:50
- -n 指定请求数,默认值:10000
- -d 以字节的形式指定 SET/GET 值的数据大小,默认值:2
- -k 1=keep alive 0=reconnect,默认值:1
- -r SET/GET/INCR 使用随机 key, SADD 使用随机值
- -P 通过管道传输
请求,默认值:1 - -q 强制退出 redis。仅显示 query/sec 值
- –csv 以 CSV 格式输出
- -l 生成循环,永久执行测试
- -t 仅运行以逗号分隔的测试命令列表。
- -I Idle 模式。仅打开 N 个 idle 连接并等待。
vagrant@homestead:~$ redis-benchmark
...
====== MSET (10 keys) ======
100000 requests completed in 0.85 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.77% <= 1 milliseconds
99.95% <= 2 milliseconds
100.00% <= 2 milliseconds
117508.81 requests per second
客户端连接
Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:
- 首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。
- 然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法
- 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送
Redis 2.4 中最大连接数是硬编码在代码里面的, Redis 2.6 后这个值可以通过配置来设定
127.0.0.1:6379> config get maxclients
1) "maxclients"
2) "10000"