Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。中文官方文档:
http://www.redis.cn/documentation.html
安装Redis
官方网站:http://redis.io/
官方下载:http://redis.io/download可以根据需要下载不同版本
windows版:https://github.com/mythz/redis-windows
安装Redis,Redis的代码遵循ANSI-C编写,可以在所有POSIX系统(如Linux, *BSD, Mac OS X, Solaris等)上安装运行。而且Redis并不依赖任何非标准库,也没有编译参数必需添加。redis的安装出奇的简单。
下载源码:wget http://redis.googlecode.com/files/redis-2.4.6.tar.gz
解压安装:
$ wget http://download.redis.io/releases/redis-2.8.19.tar.gz
$ tar xzf redis-2.8.19.tar.gz
$ cd redis-2.8.19
$ make
$ make install
如果make继续报错,信息如下:error: jemalloc/jemalloc.h: No such file or directory
执行 make MALLOC=libc 就行
注意的是,为了防止出意外,make失败后在make的话,清理一下,执行make clean
Redis 由四个可执行文件在源码包的src文件夹中:redis-benchmark、redis-cli、redis-server、redis-stat 这四个文件,加上一个redis.conf就构成了整个redis的最终可用包。它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况
(redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server)
将命令复制到/usr/local/bin目录,将配置文件redis.conf复制到/etc/目录
现在就可以启动了,redis只有一个启动参数,就是他的配置文件路径。
启动命令如下: redis-server /etc/redis.conf
注意,默认复制过去的redis.conf文件的daemonize参数为no,所以redis不会在后台运行,这时要测试,我们需要重新开一个终端。修改为yes则为后台运行redis。另外配置文件中规定了pid文件,log文件和数据文件的地址,如果有需要先修改,默认log信息定向到stdout.
添加
vm.overcommit_memory=1
刷新配置使之生效
sysctl vm.overcommit_memory=1
补充介绍:
**如果内存情况比较紧张的话,需要设定内核参数:
echo 1 > /proc/sys/vm/overcommit_memory
内核参数说明如下:
overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
编辑redis.conf配置文件(/etc/redis.conf),按需求做出适当调整,比如:
daemonize yes #转为守护进程,否则启动时会每隔5秒输出一行监控信息
save 60 1000 #减小改变次数,其实这个可以根据情况进行指定
maxmemory 256000000 #分配256M内存
下面是redis.conf的主要配置参数的意义:
daemonize:是否以后台daemon(守护进程)方式运行
pidfile:pid文件位置
port:监听的端口号
timeout:请求超时时间
loglevel:log信息级别
logfile:log文件位置
databases:开启数据库的数量
save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
rdbcompression:是否使用压缩
dbfilename:数据快照文件名(只是文件名,不包括目录)
dir:数据快照的保存目录(这个是目录)
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
这时你可以打开一个终端进行测试了,配置文件中默认的监听端口是6379,没有启动先启动再测试, 命令格式如下:
redis-cli.exe -h 192.168.10.61 -p 6379
[[email protected] ~]#redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit
[[email protected] ~]# redis-server /etc/redis.conf
[[email protected] ~]# redis-cli
redis 127.0.0.1:6379> quit
redis数据结构
redis 的作者antirez曾称其为一个数据结构服务器(data structures server),这是一个非常准确的表述,redis的所有功能就是将数据以其固有的几种结构保存,并提供给用户操作这几种结构的接口。我们可以想象我们在各种语言中的那些固有数据类型及其操作。
redis目前提供四种数据类型:string,list,set及zset(sorted set)和Hash。
string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。
zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。
Hash数据类型允许用户用Redis存储对象类型,Hash数据类型的一个重要优点是,当你存储的数据对象只有很少几个key值时,数据存储的内存消耗会很小.更多关于Hash数据类型的说明请见: http://code.google.com/p/redis/wiki/Hashes
每种数据类型都提供了相应的操作方法,要使用这些方法,首先要安装redis的PHP扩展\php_redis-5.5-vc11-ts-x86我的是PHP5.5版本要对应,在PHP配置文件中添加
extension=php_igbinary.dll
extension=php_redis.dll
重新启动apache,phpinfo()查看得到结果如下即可。
编写PHP代码连接redis服务器,完成简易操作:
<?php
$redis = new Redis(); #实例化redis类
$redis->connect(‘192.168.1.251‘); #连接服务器
$redis->set(‘key‘, ‘hello ‘); #调用方法,设置string类型值
$redis->append(‘key‘, ‘world‘); #修改string类型值
echo $redis->get(‘key‘); #获取redis key的值,并输出显示
echo $redis->type(‘key‘); #获取key 的数据类型
echo $redis->echo(‘will close...‘);# 输出字符串
$redis->close(); #关闭连接
下面罗列一些Redis类的一些属性及方法
a)连接redis server:
connect :连接server
pconnect :长连接
auth :权限验证
select :选择DB
close : 关闭连接
setOption : 设置 client 选项
getOption : 获取client选项
ping : ping redis server
echo : 输出 字符串
注意,如果频繁操作redis,不停地connect 和close会很耗性能的,这个时候,建议用pconnect 建立个长连接
b)字符串读写函数
append :在值的后面追加值
decr :递减一个key的值
incr :递增一个key的值
get :获取一个值
set :设置一个值
getSet :设置值,并返回老值
mGet :批量获取值
mSet :批量设置值
strlen :获取值长度
注意:如果能用批量操作尽量用批量,减少频繁连接redis数据库性能
c)hash读写函数
hDel :删除一个多个域
hExists :判断一个hash域是否存在
hGet :获取hash域的值
hGetAll :获取所有域值
hIncrBy :自增长一个hash int域的值
hKeys :获取hash 所有域
hLen :获取域个数
hMGet :批量获取域的值
hMSet :批量设置域的值
hSet :设置域的值
hVals:得到所有域的值
d)list读写函数
lInsert:插入元素
lLen:list长度
lPop:移除并获取第一个颜色
lPush:插入一个元素
lRem:移除元素
lSet:设置元素值
e)set
sAdd:增加一个或多个成员
sIsMember:是否包含
sMembers:得到成员
sMove:移动成员
sPop:移除成员
sRandMember:得到随机成员
sRem:删除
f)sorted set
zAdd:增加一个或多个
zCard:成员个数
zIncrBy:递增成员score
zRange:返回索引范围内的成员
zRangeByScore :返回score范围内的成员
zScore:获取成员score
zRem:移除一个或多个成员
更多信息请参考:https://github.com/nicolasff/phpredis
redis.conf配置参数:
1)daemonize on|yes
redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes时,启用守护进程
2)pidfile /var/run/redis_6379.pid
redis以守护进程方式运行时,系统默认会把pid写入/var/run/redis.pid,可以通过pidfile指定pid文件
3)port 6379
redis默认监听6379端口,可以通过port指定redis要监听的端口
4)bind 127.0.0.1
绑定主机地址
5)unixsocket /tmp/redis.sock
指定redis监听的unix socket 路径
6)timeout 300
当客户端闲置多长时间,关闭连接,单位秒
7)loglevel verbose|debug|notice|warning
指定日志记录级别,默认是verbose
8)logfile /var/log/redis_6379.log
日志记录文件,默认是标准输出stdout,如果redis以守护进程方式运行,logfile 配置为stdout时,logs将要输出到/dev/null
9)syslog-enabled no|yes
当配置为yes时,日志输出到系统日志,默认是no
10)syslog-ident redis
指定syslog的标示符
11)syslog-facility local0
指定syslog设备(facility),必须是user或则local0到local7
12)databases 16
设置redis中数据库的个数,默认数据库是DB 0,可以通过select <dbid>,选择使用的数据库。dbis大于等于0,小于等于databases -1 【这里是16-1】
13)save <seconds> <changes>
指定多长时间内,有多少次更新操作时,将数据同步到数据库文件,可以多个条件配合,系统默认配置如下:
save 900 1 #900秒 1个修改
save 300 10 #300秒 10个更新
save 60 10000<span style="white-space:pre"> </span>#60秒 10000个更新
注意,如果不持久化【不把数据写入磁盘】,注释掉save即可。
14)rdbcompression yes|no
数据dump到数据文件时,系统是否压缩string对象数据,系统默认是yes。如果为了节省cpu,可以设置为no,此时数据文件比用LZF压缩时要大
15)dbfilename dump.rdb
指定数据库文件名,默认是dump.rdb
16)dir /var/lib/redis/6379
指定本地数据库存放目录
17)slaveof <masterip> <masterport>
当本机是slave服务时,设置master服务的ip和端口
18)masterauth <master-password>
当master服务设置了密码时,slave服务连接master的密码。如果配置不对,slave服务请求将被拒绝
19)slave-serve-stale-data yes|no
当slave和master之间的连接断开或slave正在于master同步时,如果有slave请求,当slave-serve-stale-data配置为yes时,slave可以相应客户端请求;当为no时,slave将要响应错误,默认是yes
20)requirepass foobared
设置redis连接密码
21)maxclients 128
设置同一时间客户端最大连接数,默认是无限制。如果设置maxclients 0 时,表示不限制
22)maxmemory <bytes>
指定redis最大内存限制,redis在启动时,会把数据加载到内存中,达到最大内存后,redis会先清除已到期或将过期的key,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读操作
23)maxmemory-policy
volatile-lru|allkeys-lru|volatile-random|allkeys->random|volatile-ttl|noeviction
当redis使用内存达到最大时,使用哪种策略移除内存中数据
24)appendonly no|yes
指定是否在每次更新操作后进行日志记录,默认配置是no,即在采用异步方式把数据写入到磁盘,如果不开启,可能会在断电时导致部分数据丢失
25)appendfilename appendonly.aof
指定更新日志文件名【aof日志】,默认为appendonly.aof
26)appendfsync everysec|no|aways
指定更新日志条件,no表示等操作系统进行数据缓存同步到磁盘的aof文件(快)always表示每次更新操作后手动调用fsync将数据写到磁盘的aof文件(慢,安全)
everysec,表示每秒同步一次(拆中,默认值)
27)slowlog-log-slower-than 10000
配置记录慢日志的条件,单位是微妙,当是负值时,关闭慢日志记录,当是0时,记录所有操作
28)slowlog-max-len 1024
配置记录慢查询的最大条数
29)hash-max-zipmap-entries 512
配置最大元素数,当超过该配置数据时,redis采用特殊hash算法
30)hash-max-zipmap-value 64
配置最大元素值,当草果配置值时,采用特殊hash算法
31)activerehashing yes
指定是否激活充值hash,默认开启
可以通过下面命令使用配置文件redis.conf启动redis服务
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf