圣泉山人 后端开发工程师

Redis

2016-02-11

Redis是什么?

redis是一个 高性能的key-value数据库。

特点:

  • 数据都是缓存在内存中,读写快速,并周期性的把更新的数据写入磁盘
  • 支持丰富的数据类型:stringlistsetzsethash
  • 所有 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表示不存在key
  • keys pattern :返回匹配指定模式的所有key
  • expire 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主从同步

原理

image

具体实现

只需要在Slave服务器配置文件中加入以下配置项:

slaveof 192.168.33.12 6379 #指定Master的IP和端口

参考:《PHP核心技术与最佳实践》


下一篇 PHPDocumentor

Comments

Content