redis基础和配置

来源:互联网 发布:galgame汉化软件 编辑:程序博客网 时间:2024/06/05 04:55

redis基础和配置

Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。

key相关指令

redis 的 key 是字符串类型,但是 key 中不能包括边界字符,由于 key 不是 binary safe的字符串,所以像”my key”和”mykey\n”这样包含空格和换行的 key 是不允许的。
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,此方法不会失败。

配置文件

daemonize:是否以后台守护方式进行,默认是no,一般为yes
bind:绑定IP地址,哪些可以访问
pidfile:当Redis以守护进程方式运行时,redis默认会把pid写入/var/run/redis_6379.pid文件
port:监听的端口号
timeout:当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
loglevel:log 信息级别,总共支持四个级别:debug、verbose、notice、warning,默认为 verbose
logfile:默认为标准输出(stdout),如果配置为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
databases:设置数据库的数量,默认为16,可以使用SELECT 命令在连接上指定数据库id
save * *: 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
rdbcompression:指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
dbfilename:数据快照文件名(只是文件名,不包括目录)。默认值为 dump.rdb
dir:数据快照的保存目录(这个是目录)
requirepass:设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH 命令提供密码,默认关闭。
appendonly.:指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendfilename:指定更新日志文件名,默认为appendonly.aof
appendfsync:指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)

持久化

通常 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 上配置数据持久化。

Redis 主从复制的过程介绍

当设置好 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台主节点以上集群

配置过程

  1. redis的基础配置,对redis.conf进行更改,daemonize yes,appendonly yes,指定数据文件存放位置
  2. 开启集群,在redis.conf中更改,cluster-enabled yes,cluster-config-file nodexxxx.conf,cluster-node-timeout xxxx
  3. redis集群需要ruby命令,安装ruby,以ubuntu为例:sudo apt-get install ruby,sudo apt-get install rubygems,gem install redis(安装redis和ruby接口)
  4. 启动redis,在redis的安装目录下执行redis-trib.rb命令
    ./redis-trib.rb create –replicas 1(主节点数/从节点数) host1:port1 host2:port2 ………
  5. 验证,redis-cli -c(以集群模式) -h -p 登录客户端,cluster info(集群信息),cluster nodes(节点信息)
  6. 集群建立后也可以增加删除节点,执行./redis-trib.rb可以看到帮助信息
    1. add-node new_host:port existing_host:port—-添加节点,默认添加的节点是master,但是没有槽用来存数据,要用分片来给他槽才能存数据。若要换成子节点,在客户端运行命令cluster replicate nodeid就可以将它变为nodeid的子节点
    2. reshard host:port—-改变槽的分配情况。host:port是任意一个主节点,跟着提示走就行了
    3. del-node host:port nodeid—-删除节点,若是主节点,先将槽分配给其他主节点再删除

遇到的问题

当不是本机连接redis时,要将bind相应的设置为链接的IP地址或0.0.0.0(所有都能连),有防火墙的要打开相应端口,有安全组的也要开放相应端口。
1. 创建是报不能连接到redis服务器
建立集群时要保证所有的服务器都运行着
2. 创建集群时一直处于”Waiting for the cluster to join………………………………”的状态
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口集群总线端口为redis客户端连接的端口 + 10000,如redis端口为7010,则集群总线端口为17010,可以用netstat -ap | grep xxxx查看,所以所有服务器的点需要开通redis的客户端连接端口和集群总线端口。
3. 创建集群时报某个err slot 0 is already busy (redis::commanderror)
这是集群没有创建成功,停掉所有的redis服务,把nodes.conf和dir路径中相关里面的文件全部删除,再重新试,不要删除了redis.conf

原创粉丝点击