Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。
redis相关指令
exits key—-检测指定 key 是否存在,返回 1 表示存在,0 不存在
del key1 key2 …… keyN—-删除给定 key,返回删除 key 的数目,0 表示给定 key 都不存在
type key—-返回给定 key 值的类型。返回 none 表示 key 不存在。
keys pattern—-返回匹配指定模式的所有 key
randomkey—-返回从当前数据库中随机选择的一个 key,如果当前数据库是空的,返回空串
rename oldkey newkey—-重命名一个 key,如果 newkey 存在,将会被覆盖,返回 1 表示成功,0 失败。可能是 oldkey 不存在或者和 newkey 相同。
renamenx oldkey newkey—-同上,但是如果 newkey 存在返回失败。
expire key seconds—-为 key 指定过期时间,单位是秒。返回 1 成功,0 表示 key 已经设置过过期时间或者不存在。
ttl key—-返回设置过过期时间 key 的剩余过期秒数。-1 表示 key 不存在或者未设置过期时间。
select db-index—-通过索引选择数据库,默认连接的数据库是 0,默认数据库数是 16 个。返回 1表示成功,0 失败。
move key db-index—-将 key 从当前数据库移动到指定数据库。返回 1 表示成功。0 表示 key不存在或者已经在指定数据库中
DBSIZE—-返回当前数据库 key 的数量。
INFO—-返回当前 redis 服务器状态和一些统计信息。
MONITOR—-实时监听并返回redis服务器接收到的所有请求信息。
SHUTDOWN—-把数据同步保存到磁盘上,并关闭redis服务。
CONFIG GET parameter—-获取一个 redis 配置参数信息。(个别参数可能无法获取)
CONFIG SET parameter value—-设置一个 redis 配置参数信息。(个别参数可能无法获取)
CONFIG RESETSTAT—-重置 INFO 命令的统计信息。(重置包括:Keyspace 命中数、Keyspace 错误数、 处理命令数,接收连接数、过期 key 数)
DEBUG OBJECT key—-获取一个 key 的调试信息。
DEBUG SEGFAULT—-制造一次服务器当机。
FLUSHDB—-删除当前数据库中所有 key,此方法不会失败。小心慎用
FLUSHALL—-删除全部数据库中所有 key,此方法不会失败。小心慎用
cluster replicate nodeid—-集群添加一个节点后,把节点设为子节点
redis参数配置
- Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程(后台运行)
daemonize no - 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid - 指定Redis监听端口,默认端口为6379
port 6379 - 绑定的主机地址
bind 127.0.0.1
5.当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300 - 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose - 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout - 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
databases 16 - 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。 - 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb - 指定本地数据库存放目录
dir ./ - 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步(这时只能读数据,不能写数据)
slaveof - 当master服务设置了密码保护时,slav服务连接master的密码
masterauth - 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
requirepass foobared - 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no - 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof - 指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec - 集群配置,默认no
cluster-enable yes
cluster-config-file node-xxxx.conf
redis持久化
快照方式:(默认持久化方式)
这种方式就是将内存中数据以快照的方式写入到二进制文件中 ,默认的文件名为dump.rdb。
客户端也可以使用 save 或者 bgsave 命令通知 redis 做一次快照持久化。save 操作是在主线程中保存快照的,由于 redis 是用一个主线程来处理所有客户端的请求,这种方式会阻塞所有客户端请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较多,必然会引起大量的磁盘 IO 操作,可能会严重影响性能。
注意:由于快照方式是在一定间隔时间做一次的,所以如果 redis 意外当机的话,就会丢失最后一次快照后的所有数据修改。
日志追加方式:
这种方式 redis 会将每一个收到的写命令都通过 write 函数追加到文件中 (默认appendonly.aof)。当 redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于操作系统会在内核中缓存 write 做的修改,所以可能不是立即写到磁盘上。这样的持久化还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis 我们想要通过 fsync 函数强制操作系统写入到磁盘的时机。有三种方式如下(默认是:每秒 fsync 一次)
appendonly yes //启用日志追加持久化方式
appendfsync always//每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec//每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
appendfsync no//完全依赖操作系统,性能最好,持久化没保证
日志追加方式同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用 incrtest 命令 100 次,文件中必须保存全部 100 条命令,其实有 99 条都是多余的。因为要恢复数据库状态其实文件中保存一条 set test 100 就够了。为了压缩这种持久化方式的日志文件。redis 提供了 bgrewriteaof 命令。收到此命令 redis 将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的持久化日志文件。
redis主从复制
主从复制简介
Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。
1. master 可以有多个 slave,slave只能读数据。
2. 除了多个 slave 连到相同的 master 外,slave 也可以连接其它 slave 形成图状结构。
3. 主从复制不会阻塞 master。也就是说当一个或多个 slave 与 master 进行初次同步数据时,master 可以继续处理客户端发来的请求。相反 slave 在初次同步数据时则会阻塞不能处理客户端的请求。
4. 主从复制可以用来提高系统的可伸缩性,我们可以用多个 slave 专门用于客户端的读请求,比如 sort 操作可以使用 slave 来处理。也可以用来做简单的数据冗余。
5. 可以在 master 禁用数据持久化,只需要注释掉 master 配置文件中的所有 save 配置,然后只在 slave 上配置数据持久化。
主从复制过程
当设置好 slave 服务器后,slave 会建立和 master 的连接,然后发送 sync 命令。无论是第一次同步建立的连接还是连接断开后的重新连接,master 都会启动一个后台进程,将数据库快照保存到文件中,同master 主进程会开始收集新的写命令并缓存起来。后台进程完成写文件后,master 就发送文件给 slave,slave 将文件保存到磁盘上,然后加载到内存恢复数据库快照到 slave 上。接着 master 就会把缓存的命令转发给 slave。而且后续 master 收到的写命令都会通过开始建立的连接发送给 slave。从 master 到 slave 的同步数据的命令和从客户端发送的命令使用相同的协议格式。当 master 和 slave 的连接断开时 slave 可以自动重新建立连接。如果 master 同时收到多个 slave 发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有 slave。
配置 slave 服务器
只需要在配置文件中加入如下配置
slaveof 192.168.1.1 6379//指定 master 的 ip 和端口
redis集群
集群以后数据存放会根据算法选择存放到哪那一台服务器,集群最好主节点服务器多于3台。
步骤
- redis基础配置,端口、绑定IP、文件存放位置、开启日志追加方式
- 打开集群服务
cluster-enable yes
cluster-config-file node-xxxx.conf
cluster-node-timeout xxxx //失效时间 - redis集群需要ruby命令,安装ruby
ubuntu为例 sudo apt-get install ruby sudo apt-get install rubygems - 安装redis和ruby的接口 gem install redis
- 到redis的目录下执行redis-trib.rb命令
./redis-trib.rb create –replicas 1(主节点数/从节点数) ip1:port1 ip2:port2……. - 进行验证,连接任意一个客户端 redis-cli -c(表示集群模式) -h -p,cluseter info—-查看集群信息,cluseter nodes—-查看节点信息
关闭集群需要逐个关闭
在安装目录src下输入./redis-trib.rb可以看相关的指令
create—-创建集群
info host:port—-查看信息
add-node newhost:port existinghost:port—-添加节点(添加的节点默认是主节点,用cluster replicate nodeid可将此节点设为子节点,noteid 是父节点的id,在集群信息里面能够看到。新添加的节点是没有存放数据的位置的,要用分片指令重新分片给他槽)
reshard host:port(任意一个主节点)—-重新分片,按照提示进行就可以了,最后设置从哪里把片取出来分配all表示平均抽取,done表示从一个节点抽取。
del-node host:port node_id—-删除节点