Redis 使用与实践

RedisKey-Value 类型的内存数据库,支持 String、List、Set、Sorted Set、Hash 等数据类型,支持 Snapshottiong(快照)和 Append-Only file(追加)两种数据持久化方式,支持主从复制。

1. Redis 安装步骤

// 下载 Redis 的稳定版本
$ wget http://download.redis.io/releases/redis-4.0.2.tar.gz 
// 解压缩
$ tar zvxf redis-4.0.2.tar.gz
// 编译 Redis
$ make
// 安装 Redis,Redis 没有提供 make install 命令,需要手动安装
$ sudo cp redis.conf /etc/
$ sudo cp redis-benchmark redis-cli redis-server /usr/bin/

2. 运行 Redis 服务器

// 启动 Redis 服务器,并指定配置文件 
$ /usr/bin/redis-server /etc/redis.conf
// 启动一个客户端
$ /usr/bin/redis-cli -a 'password'

3. Redis 支持的数据类型

3.1 String 类型

占位图

String 类型支持 incr 操作,可以用做统计计算,如统计网站访问次数、博客访问次数等。

3.2 List 类型

占位图

List 数据类型 key 对应的 value 是一个双向链表结构。

3.3 Set 类型

占位图

Set 数据类型是一种无序集合,在 Redis 内部通过 HashTable 实现。优点是快速查找元素是否存在,用于记录一些不能重复的数据。

Set 类型通常用于记录做过某些事情。例如在某些投票系统中,每个用户一天只能投票一次,那么可以使用 Set 来记录某个用户的投票情况,只需要以日期作为 Set 的 key,则将用户 ID 作为 member 即可。要查看某个用户今天是否投过票,只需要以今天的日期作为 key 去查询此用户 ID 是否存在。

3.4 Sorted Set 类型

// 添加元素 member 到集合,元素在集合中存在则更新对应 score
zadd key score member
// 增加对应 member 的 score 值,并且重新排序,返回更新后的 score 值
zincrby key incr member

占位图

Sorted Set 类型是排序的 Set 类型,属于有序集合。

Sorted Set 类型在 Web 应用中非常有用。例如排行榜应用中的按 “顶贴” 次数排序,方法是:将排序的值设置成 Sorted Set 的 score 值,将具体数据设置成相应的 value,用户每次按 “顶贴” 按钮时,只需执行 zadd 命令修改 score 值。

3.5 Hash 类型

占位图

Hash 类型是每个 key 对应一个 HashTable。Hash 类型适合应用于存储对象,例如用户信息对象。把用户 ID 作为 key,可把用户信息保存到 Hash 类型中。

4. 持久化

Redis 是基于内存的数据库,内存数据库有一个严重的弊端:突然宕机或者断电时,内存的数据不会保存。为了解决这个问题,Redis 提供两种持久化方式:内存快照(Snapshotting)和 日志追加(Append-only file)。

4.1 内存快照

内存快照方式是将内存中的数据以快照方式写入二进制文件中,默认文件名为 dump.rdb。

Redis 每隔一段时间进行一次内存快照操作,客户端使用 save 或者 bgsave 命令告诉 Redis 需要做一次内存快照操作。save 命令在主线程中保存内存快照,Redis 由单线程处理所有请求,执行 save 命令可能阻塞其他客户端请求,从而导致不能快速响应请求,所以建议不要使用 save 命令。另外要注意,内存快照每次都把内存数据完整地写入硬盘,而不是只写入增量数据。所以如果数据量大,写入操作比较频繁,从而严重影响性能。

与内存快照相关的配置选项如下:

// 经过 900 秒或数据更改 1 次就进行一次内存快照操作
save 900 1
// 设置多个这样的条件实现不同内存快照方案,这样其中一个条件成立,Redis 都进行一次内存快照操作
save 900 1
save 300 10
save 60 10000

4.2 日志追加

日志追加(aof)方式是把增加、修改数据的命令通过 write 函数追加到文件尾部(默认是 appendonly.aof)。Redis 重启时读取 appendonly.aof 文件中的所有命令并且执行,从而把数据写入内存中。

另外,操作系统内核的 I/O 接口可能存在缓存,所以日志追加方式不可能立即写入文件中,这样就有可能丢失部分数据。幸运的是 Redis 提供了解决方法,通过修改配置文件告诉 Redis 应该在什么时候用 fsync 函数强制操作系统把缓存写入磁盘。有以下三种写法:

appendonly yes           # 启动日志追加持久化方式
# appendfsync always     # 每次收到增加或者修改命令就立刻强制写入磁盘
appendfsync everysec     # 每秒强制写入磁盘一次
# appendfsync no         # 是否写入磁盘完全依赖操作系统

日志追加方式有效降低数据丢失的风险,同时也带来另一个问题,即持久化文件(appendonly.aof)不断膨胀。例如调用 incr nums 命令 100 次,文件就会保存 100 条 incr nums 命令,其实 99 条都是多余的,因为要恢复数据只需要 set nums 100

为了压缩日志文件,Redis 提供 bgrewriteaof 命令。当 Redis 收到此命令,就使用类似于内存快照方式将内存的数据以命令的方式保存到临时文件中,最好替换原来的日志文件。

5. 扩展库 phpredis 安装及使用

// 下载 phpredis 源码
$ wget https://github.com/phpredis/phpredis/archive/3.1.4.tar.gz
// 解压
$ tar -xzvf 3.1.4.tar.gz
// 编译安装
$ cd phpredis-3.1.4
$ /usr/local/php/bin/phpize
$ ./configure -with -php -config = /usr/local/php/bin/php -config
$ make
$ make install
// 修改 php.ini
添加 extension = redis.so,重启 Web 服务器

扩展资料

  1. Redis 未授权访问漏洞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *