Redis学习笔记

Monday, January 15, 2018

简介

Redis 是一个开源免费高性能的 key-value 数据库,也是常见的 NoSql 数据库,和其它类似产品相比(主要是 Memcache )相比有三个优点:

  • 支持数据持久化,可以将内存中数据保存到磁盘,重启时可以再次加载到内存中
  • 支持的数据类型不仅仅是 string,还支持list set zset 以及 hash.
  • 支持 主-从(master - slave) 数据备份

优势及特性

  • 性能极高,读的速度是 110000次/s, 写的速度是 81000次/s
  • 丰富的数据类型
  • 原子性操作,单个操作是原子性的,多个操作也支持事务,通过 MULTIEXEC 指令包起来
  • 丰富的特性,支持 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发布订阅 .

数据备份与恢复

数据备份可以使用 savebgsave 两个命令来操作

数据恢复只需将备份文件(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"
Redis Redis

Redis配置项CentOS release 6.5 (Final) 和 Ubuntu 16.04.2 LTS 安装ffmpeg