1. Redis的特性
(1) 存储结构
Redis(Remote Dictionary Server,远程字典服务器)是以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。Redis支持的数据类型有字符串类型,散列类型,列表类型,集合类型,有序集合类型。
常见的MySQL等存储结构可能会使用额外的表来连接两个表,查询时需将该额外的表进行连接,并不直观。而Redis可以将程序中的数据直接映射到Redis中,数据在Redis中 的存储形式和其在程序中存储方式很相似。Redis的另一优势是对不同的数据类型提供了非常方便的操作方式,如使用集合类型存储文章标签,Redis可以对标签进行如交集、并集这样的集合运算。
(2) 内存存储与持久化
Redis数据库中的所有数据都存储在内存中,在普通的笔记本中,可以一秒内读写超过十万个键值。Redis也提供了持久化的支持,即将内存中的数据异步写入到硬盘中,同时不影响继续提供服务。
(3) 功能丰富
Redis适用于缓存、队列系统,其可以为每个键设置生存时间(Time To Live, TTL),生存时间到期后键会自动被删除。作为缓存系统,Redis可以限定数据占用的最大内存空间,在数据达到空间限制后可以按照一定规则自动淘汰不需要的键。
Redis的列表类型键可以用来实现队列,并且支持阻塞式读取。更高层面上,Redis还支持"发布/订阅"模式,可基于此构建聊天室系统。
(4) 简单稳定
关系数据库中获取posts表内id为1的记录的title字段的值,其命令为:
SELECT title FROM posts WHERE id = 1 LIMIT 1
Redis中读取键名为post:1的散列类型键的title字段的值,其命令为:
HGET post:1 title
Redis提供了很多种不同编程语言的客户端库,这些库很好的封装了Redis的命令,使得在程序中与Redis进行交互变得更容易。有些库还提供了可以将编程语言中的数据类型直接以相应的形式存储到Redis中。
2. 安装Redis
Redis约定版本号(小数点后的数字)为偶数的版本是稳定版,而为奇数的是非稳定版。
wget http://download.redis.io/redis-stable.tar.gz tar -xzvf redis-stable.tar.gz cd redis-stable make // 编译 make install //将可执行程序复制到/usr/local/bin目录中
(1) 启动和停止Redis
make install将如下可执行程序复制到/usr/local/bin目录下,包括:
1) redis-server:Redis服务器
2) redis-cli:redis命令行客户
3) redis-benchmark:redis性能测试工具
4) redis-check-aof:AOG文件修复工具
5) redis-check-dump:RDB文件检查工具
启动redis的方式有两种:
1) 直接启动:直接运行redis-server即可启动,Redis服务器会默认使用6379端口,通过--port参数可自定义端口号:
redis-server --port 6380
2) 通过初始化脚本启动
适用于生产环境,Redis源码目录utils中初始化脚本redis_init_script,可通过如下步骤,配置Redis的运行方式和持久化文件、日志文件的存储位置等。
① 配置初始化脚本,先将初始化脚本复制到/etc/init.d目录中,文件名为redus_端口号,其中端口号表示让Redis监听的端口号,客户端通过该端口连接Redis,然后修改脚本第6行的REDISPORT变量的值为同样的端口号。
② 建立需要的文件夹,如存放Redis配置文件的/etc/redis和存放Redis持久化文件的/var/redis/端口号。
③ 修改配置文件,将配置模板redis.conf复制到/etc/redis目录中,以端口号命名,然后对以下参数进行编辑:
使Redis以守护进行模式运行daemonize=yes; 设置Redis的PID文件位置pidfile=/var/run/redis_端口号
设置Redis监听的'端口号port=端口号 设置持久化文件存放位置dir=/var/redis/端口号
配置好后即可使用/etc/init.d/redis_端口号 start启动redis。
3) 停止Redis
强行终止Redis进程可能导致数据丢失,正确的方法为:redis-cli SHUTDOWN,Redis会先断开客户端连接,然后根据配置执行持久化,最后完成退出。
也可以使用"kill Redis进程的PID"正常结束Redis。
3. Redis命令行客户端
redis-cli(Redis Command Line Interface)
(1) 发送命令
发送命令的两种方式:① 将命令作为redis-cli的参数执行,如 连接Redisredis-cli -h 127.0.0.1 -port 6379; PING命令测试客户端与Redis的连接是否正常,正常则返回PONG.
② 不附带参数运行redis-cli,将进入交互模式。
(2) 命令返回值
1) 状态回复,如SET设置某个键的值时,Redis会回复状态OK表示设置成功。
2) 错误回复,如命令出现不存在或命令格式有错误时会返回该类型,以ERR开头。
3) 整数回复,如递增键值的INCR命令会以整数形式返回递增后的键值,或获取当前数据库中键的数量DBSIZE命令,以(integer)开头。
4) 字符串回复,如请求一个字符串类型键的值GET。当请求的键值不存在时会得到一个空结果(nil)。
5) 多行字符串回复,如请求一个非字符串类型键的元素列表KEYS *,每行都以序号开头。
(3) 配置
启用配置文件的方法:在启动时将配置文件的路径作为启动参数传递给redis-server,如:redis-server /path/to/redis.conf
通过启动参数传递同名的配置选项会覆盖配置文件中相应的参数,如:redis-server /path/to/redis.conf --loglevel warning
在Redis运行时通过CONFIG SET命令在不重启Redis情况下动态修改部分Redis配置,如:CONFIG SET loglevel waring
4. 多数据库
Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。每个数据库对外都是以一个0开始的递增数字命名,Redis默认支持16个数据库,可通过配置参数databases修改。客户端与Redis建立连接后会自动选择0号数据库。
但Redis不支持自定义数据库的名字,因此开发者必须自己记录哪些数据库存储了哪些数据,此外Redis不支持为每个数据库设置不同的密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。更为重要的,多个数据库之间并不是完全隔离的,如FLUSHALL将清空一个Redis实例中的所有数据库。
因此,不同的应用应该用不同的Redis实例存储数据,且不必担心多个Redis实例会额外占用很多内存。