Redis是什么?
redis
是一个 高性能的key-value
数据库。
特点:
- 数据都是缓存在内存中,读写快速,并周期性的把更新的数据写入磁盘
- 支持丰富的数据类型:
string
、list
、set
、zset
、hash
- 所有 Redis 的操作都是原子性的,从而确保当多个客户得到的都是最新的值
- Redis支持主从同步,可以将数据复制到任意数量的从服务器中
- Redis是一个多功能实用工具
redis的官网:http://www.redis.io/
安装Redis
wget http://download.redis.io/releases/redis-2.8.24.tar.gz
tar -xzf redis-2.8.24.tar.gz
cd redis-2.8.24
make
cd ..
mv redis-2.8.24 /usr/local/redis
安装成功后,在redis/src下,会有以下文件
redis-benchmark
: 性能测试工具redis-check-aof
:更新日志检查redis-check-dump
: 检查本地数据文件redis-cli
: 命令行操作工具redis-server
: 服务器程序
运行Redis
redis-server /etc/redis.conf
#查看是否成功启动
ps -x | grep redis
配置文件的配置项解释
配置项 | 描述 |
---|---|
daemonize <yes | no> |
是否以后台daemon方式打开 |
pidfile <*.pid> |
pid文件位置,daemonize为yes时才有效 |
port <port> |
监听的端口,默认6379 |
timeout <seconds> |
请求超时时间,单位秒 |
loglevel <debug | verbose | notice | warning> |
log信息级别 |
logfile <filename> |
log文件位置 |
databases <number> |
开启数据库的数量 |
save <seconds> <changes> |
报存快照的频率,在一定时间内执行一定数量的写操作时,自动保存快照,可设置多个条件 |
slaveof <master-ip> <master-port> |
当本机为从服务器时,设置主服务的ip及端口 |
masterauth <master-password> |
当本机为从服务时,设置主服务的连接密码 |
requirepass |
连接密码 |
maxclients <number> |
最大客户端连接数,0为不限制 |
maxmemory <bytes> |
设置最大内存,达到该值后,redis会尝试清除已到期或者即将到期的key,处理后,仍然达到最大内存设置,将无法再进行写入操作 |
rdbcompression <yes | no> |
是否使用压缩 |
dbfilename <*.rdb> |
数据快照的文件名(不包含目录) |
dir <directory> |
数据快照的保存目录 |
appendonly |
是否开启appendonly log,若开启,每次写操作都记录一条log,会提高数据的抗风险能力,但会影响效率 |
appendfilename <*.aof> |
更新日志文件名 |
appendfsync <always | everysec | no> |
appendonly log如何同步到磁盘,always:每次写都会调用fsync,everysec:每秒启用一次fsync,no:不嗲用fsync等待系统自己同步 |
vm-enabled <yes | no> |
是否启用虚拟内存 |
vm-swap-file <*.swap> |
交换分区文件(启用虚拟内存时使用) |
vm-max-memory <number> |
把所有大于该值的数据写入虚拟内存,无论该值多小,所有索引数据(即key)都是内存存储的,也就是说当该值为0时,其实所有value都存在于磁盘上 |
vm-page-size <bytes> |
swap文件页大小 |
vm-pages <number> |
交换分区文件中内存页的数量 |
vm-max-threads <number> |
对swap文件操作的最大线程数,最好是cpu的数量 |
使用Resdis
key相关命令
key 的命名中,不能出现 空格、\n
exits key
: 测试指定key是否存在,1:存在,0:不存在del key1 key2 ...keyN
:删除指定key,返回删除的数目,0表示给定可以都不存在type key
: 返回给定key的value类型,none表示不存在keykeys pattern
:返回匹配指定模式的所有keyexpire key seconds
设置给定key的过期时间randomkey
:返回当前数据库中随机选择的一个key,如果数据库为空,则返回空字符串rename oldkey newkey
:重命名key,如果新key存在,将被覆盖,1:成功,0:失败(旧key不存在或者和新key同名)renamenx oldkey newkey
: 同上,如果新key存在,返回失败ttl key
: 返回设置过期时间key的剩余描述,-1表示key不存在或者没有设置过期时间move key db-index
:将key从当前数据库移动到指定数据库。1:成功,0:key不存在或者已经在指定数据库中了
Redis的数据类型
String
String类型是二进制安全的,处了可以保存字符串、数字外还可以保存图片、视频文件。实际应用:统计访问次数、缓存css文件等
List
List类型是一个双向链表结构。实际应用:存放微博中‘我关注的列表’、论坛中所有回帖id、实现消息队列等
Set
Set类型是一种无序集合,优点是能快速查找元素是否存,用于记录一些不能重复的数据,或者记录做过某些事情。实际应用:注册账号时检查是否重复、投票系统(例如:一个用于在一天内只能投一次,那么就可以使用日期作为key,用户id作为member即可,查看时只需要以某天的日期作为key去查找此用户id是否存在)
Sorted Set类型
Sorted Set类型是有序集合,通过一个double类型的整数score来进行排序,Set能做的事情,Sorted Set都能做。实际使用:实现具有优先级的队列、应用排行榜(按顶贴次数排序,实现方法:把排序的值设置成Sorted Set的score值,把具体数据设置成相应的value,用户每次顶贴后,执行zadd修改score值)
Hash
Hash类型是每个key对应一个HashTable,试用于存储对象,例如用户信息对象
Redis事务
multi
:开启命令队列(开启事务)exec
: 依次执行队列中的命令(提交事务)discard
: 清空队列(回滚事务)
一般情况下,redis每收到一条命令就里面执行并返回结果,可以通过命令:multi
来改变这种执行流程,一但发出multi命令后,会把后续收到的命令放入一个队列中,直到执行exec
后才把队列中的命令按照顺序全部执行一次,或者遇到discard
,清空队列中的命令。
不同于Mysql的事务,redis的事务只能保证每个命令能够连续执行,而不能保证命令的执行结果,即使执行失败,也不进行回滚操作
Redis持久化
内存快照
内存快照方式是把内存中的数据以快照方式写入二进制文件中,默认文件名为dump.rdb
,内存快照每次都把内存数据完整写入硬盘,而不是只是写入增量数据,因此数据量大的时候会很影响性能。
配置控制:
# 以下配置中任和一个条件成立,都会进行快照操作
save 800 1 #经过800秒或者数据更改1次就进行一次快照
save 200 10 #经过200秒或者数据更改10次就进行一次快照
也可以通过客户端使用命令手动进行一次快照 :
save
或者bgsave
日志追加
日志追加是把操作增加、修改的命令通过write
函数追加到文件尾部(默认appendonly.aof),redis重启时会读取该文件中的所有命令并执行。虽然能降低数据丢失的风险,但是会导致持久化文件不断增大,因为可能存在很多多余的更新命令,因为最终的数据取决于最后一条更新命名。
配置控制:
appendonly yes #启动日志追加法术持久化
#appendfsync always #一有修改或者增加就强制写入磁盘
appendfsync everysec #默认,每秒强制写入磁盘
#appendfsync no #不强制写入,而依赖于操作系统
Redis主从同步
原理
具体实现
只需要在Slave服务器配置文件中加入以下配置项:
slaveof 192.168.33.12 6379 #指定Master的IP和端口
参考:《PHP核心技术与最佳实践》