Redis(入门)
官方文档:http://redis.io/documentation
redis是一个开源的key-value数据库。它又经常被认为是一个数据结构服务器。因为它的value不仅包括基本的string类型还有 list,set ,sorted set和hash类型。当然这些类型的元素也都是string类型。也就是说list,set这些集合类型也只能包含
string 类型。你可以在这些类型上做很多原子性的操作。比如对一个字符value追加字符串(APPEND命令)。加加或者减减一个数字字符串(INCR命令,当 然是按整数处理的).可以对list类型进行push,或者pop元素操作(可以模拟栈和队列)。对于set类型可以进行一些集合相关操作 (intersection union difference)。memcache也有类似与++,--的命令。
不过memcache的 value只包括string类型。远没有redis的value类型丰富。和memcahe一样为了性能。redis的数据通常都是放到内存中的。当然 redis可以每间隔一定时间将内存中数据写入到磁盘以防止数据丢失。redis也支持主从复制机制(master-slave replication)。redis的其他特性包括简单的事务支持和 发布订阅(pub/sub)通道功能,而且redis配置管理非常简单。还有各种语言版本的开源客户端类库。
这是一篇关于Redis的入门文章
1.安装Redis
Part I. 直接启动
安装
- tar zxvf redis-2.8.9.tar.gz
- cd redis-2.8.9
- #直接make 编译
- make
- #可使用root用户执行`make install`,将可执行文件拷贝到/usr/local/bin目录下。这样就可以直接敲名字运行程序了。
- make install
启动
- #加上`&`号使redis以后台程序方式运行
- ./redis-server &
检测
- #检测后台进程是否存在
- ps -ef |grep redis
- #检测6379端口是否在监听
- netstat -lntp | grep 6379
- #使用`redis-cli`客户端检测连接是否正常
- ./redis-cli
- 127.0.0.1:6379> keys *
- (empty list or set)
- 127.0.0.1:6379> set key "hello world"
- OK
- 127.0.0.1:6379> get key
- "hello world"
停止
- #使用客户端
- redis-cli shutdown
- #因为Redis可以妥善处理SIGTERM信号,所以直接kill -9也是可以的
- kill -9 PID
Part II. 通过指定配置文件启动
配置文件
可为redis服务启动指定配置文件,配置文件redis.conf在Redis根目录下。
- #修改daemonize为yes,即默认以后台程序方式运行(还记得前面手动使用&号强制后台运行吗)。
- daemonize no
- #可修改默认监听端口
- port 6379
- #修改生成默认日志文件位置
- logfile "/home/futeng/logs/redis.log"
- #配置持久化文件存放位置
- dir /home/futeng/data/redisData
启动时指定配置文件
- redis-server ./redis.conf
- #如果更改了端口,使用`redis-cli`客户端连接时,也需要指定端口,例如:
- redis-cli -p 6380
其他启停同直接启动方式。配置文件是非常重要的配置工具,随着使用的逐渐深入将显得尤为重要,推荐在一开始就使用配置文件。
Part III. 使用Redis启动脚本设置开机自启动
启动脚本
推荐在生产环境中使用启动脚本方式启动redis服务。启动脚本redis_init_script位于位于Redis的/utils/目录下。
- #大致浏览下该启动脚本,发现redis习惯性用监听的端口名作为配置文件等命名,我们后面也遵循这个约定。
- #redis服务器监听的端口
- REDISPORT=6379
- #服务端所处位置,在make install后默认存放与`/usr/local/bin/redis-server`,如果未make install则需要修改该路径,下同。
- EXEC=/usr/local/bin/redis-server
- #客户端位置
- CLIEXEC=/usr/local/bin/redis-cli
- #Redis的PID文件位置
- PIDFILE=/var/run/redis_${REDISPORT}.pid
- #配置文件位置,需要修改
- CONF="/etc/redis/${REDISPORT}.conf"
配置环境
1. 根据启动脚本要求,将修改好的配置文件以端口为名复制一份到指定目录。需使用root用户。
- mkdir /etc/redis
- cp redis.conf /etc/redis/6379.conf
2. 将启动脚本复制到/etc/init.d目录下,本例将启动脚本命名为redisd(通常都以d结尾表示是后台自启动服务)。
- cp redis_init_script /etc/init.d/redisd
3. 设置为开机自启动
此处直接配置开启自启动chkconfig redisd on将报错误:service redisd does not support chkconfig
参照此篇文章,在启动脚本开头添加如下两行注释以修改其运行级别:
- #!/bin/sh
- # chkconfig: 2345 90 10
- # description: Redis is a persistent key-value database
- #
再设置即可成功。
- #设置为开机自启动服务器
- chkconfig redisd on
- #打开服务
- service redisd start
- #关闭服务
- service redisd stop
2.redis数据结构
redis 的作者antirez曾笑称其为一个数据结构服务器(data structures server),我认为这是一个非常准确的表述,redis的所有功能就是将数据以其固有的几种结构保存,并提供给用户操作这几种结构的接口。我们可以想象我们在各种语言中的那些固有数据类型及其操作。
redis目前提供四种数据类型:string,list,set及zset(sorted set)。
- string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
- list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
- set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。
- zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。
另外,作者还提供了一个非常贴心的web命令行模拟页面,供初学者试用redis,地址:
3.redis数据存储
redis的快速是业内闻名的,但是我想说,这个速度还是有一定水分的,且看下文。
redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。
4.redis主从配置
redis支持master-slave的主从配置,配置方法是在从机的配置文件中指定slaveof参数为主机的ip和port即可,原理上来说,是从机请求主机的方式,按照tokyotyrant的做法,是可以实现主-主,主-从等灵活形式的,而redis只能支持主从,不能支持主-主,可能是其同步原理的差异所致。(本人还没有试过将两台机器的slaveof参数互指的情况是否可实现主-主。)