本文是因为在做API接口开发的时候,要数据每次都需要从数据读取而写,那样太耗性能了,其实类型iOS中的Cache或者NSUserDefault,用法都和NSUserDefault类似….
Redis
安装
下载安装包 redis-3.2.8.tar.gz
官网地址:http://redis.io/download
解压:
tar -zvxf redis-3.2.8.tar.gz 将解压后的文件夹放到 /Users/local目录下
编译测试:接下来在终端中切换到/Users/local/redis目录下,输入:sudo make test
编译安装:在终端中输入命令:sudo make install
启动Redis,输入命令redis-server
redis-server
78407:C 18 Apr 21:32:31.361 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
78407:M 18 Apr 21:32:31.362 * Increased maximum number of open files to 10032 (it was originally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 78407
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
78407:M 18 Apr 21:32:31.363 # Server started, Redis version 3.2.8
78407:M 18 Apr 21:32:31.364 * DB loaded from disk: 0.001 seconds
78407:M 18 Apr 21:32:31.364 * The server is now ready to accept connections on port 6379
看到这个界面表示我们已经成功的安装Redis。
二配置
1、在 /Users/local/redis目录下建立bin,etc,db三个目录
2、把/Users/local/redis/src目录下的mkreleasehdr.sh,redis-benchmark, redis-cli, redis-server拷贝到bin目录
3、在etc下,参考原/Users/local/redis目录下的redis.conf,新建一个redis.conf
修改redis.conf,具体如下:
#修改为守护模式
daemonize yes
#设置进程锁文件
pidfile /Users/local/redis/redis.pid
#端口
port 6379
#客户端超时时间
timeout 300
#日志级别
loglevel debug
#日志文件位置
logfile /Users/local/redis/log-redis.log
#设置数据库的数量,默认数据库为16,可以使用SELECT 命令在连接上指定数据库id
databases 16
##指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
#save
#Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
#指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,
#可以关闭该#选项,但会导致数据库文件变的巨大
rdbcompression yes
#指定本地数据库文件名
dbfilename dump.rdb
#指定本地数据库路径
dir /Users/local/redis/db/
#指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能
#会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有
#的数据会在一段时间内只存在于内存中
appendonly no
#指定更新日志条件,共有3个可选值:
#no:表示等操作系统进行数据缓存同步到磁盘(快)
#always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
#everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
其实只需要拷贝,然后修改对应的值就可以
4、保存后,启动redis:./bin/redis-server etc/redis.conf
注意这里log-redis.log文件需要我自己创建
iCocosdeMacBook-Pro:redis icocos$ redis-server etc/redis.conf回车之后没有输出说明成功了
5、查看日志文件:tail -f log-redis.log
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
78584:M 18 Apr 21:48:02.777 # Server started, Redis version 3.2.8
78584:M 18 Apr 21:48:02.777 * The server is now ready to accept connections on port 6379
78584:M 18 Apr 21:48:02.779 - 0 clients connected (0 slaves), 957072 bytes in use
到这里,我们已经完成redis安装和配置。
三使用
1、检查是否启动:redis-cli ping
2、redis-cli
3、ping
4、redis-cli 跟上命令会将参数发送到本地redis 6379 的端口,下面来看看基本操作:
使用方式
iCocosdeMacBook-Pro:redis icocos$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set key1 name
OK
127.0.0.1:6379> get key1
"name"
5、关闭命令:redis-cli shutdown
上面我们演示了redis安装与配置,接下来后面的工作在真实上线之前只需要熟练redis的使用就差不多了,注意细节,并应用到实战,没错就这么简单!
四.服务器配置
上面只是基本的安装,如果要用到生产环境,得配置一些文件
1.首先把redis-cli 移动到/Users/local/bin 目录,方便执行,和JAVA_HOME 类似
默认install 的时候已经有了
2.创建你存放配置文件和数据文件的目录
sudomkdir /etc/redissudo mkdir /var/redis
3.复制初始化脚本到/etc/init.d 目录,建议默认只有这个端口,作开机启动
$ sudocp utils/redis_init_script /etc/init.d/redis_6379
4.进入脚本,确保你的REDISPORT 是你正在使用的
sudovi /etc/init.d/redis_6379
5.复制redis.conf ,和脚本保持一致
sudocp redis.conf /etc/redis/6379.conf
6.创建一个存放工作数据的目录
sudomkdir /var/redis/6379
同时可以对redis.conf配置其他属性
# 来源:http://www.cnblogs.com/shanyou/archive/2012/01/28/2330451.htmldaemonize:是否以后台daemon方式运行pidfile:pid文件位置port:监听的端口号timeout:请求超时时间loglevel:log信息级别logfile:log文件位置databases:开启数据库的数量save **:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。rdbcompression:是否使用压缩dbfilename:数据快照文件名(只是文件名,不包括目录)dir:数据快照的保存目录(这个是目录)appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
7.最后将脚本设置默认启动
sudoupdate-rc.d redis_6379 defaults
8.现在可以执行脚本了
/etc/init.d/redis_6379start
五.MAC 版本差异
一个不幸的事实是:mac 上是没有init.d 目录的,mac启动脚本是 以.plist 结尾了,
好吧,我在 ~/Library/LaunchAgents 目录下自己建立一个 redis.plist
参考:http://www.js2node.com/redis-io/install-redis-io-2-4-17-on-mac-osx-as-service
$ sudovi redis.plist
然后输入以下内容
Labelio.redis.redis-serverProgramArguments/Users/local/bin/redis-server/Users/local/etc/redis.confRunAtLoad
执行命令
$ sudo launchctlload/Library/LaunchDaemons/io.redis.redis-server.plist
打开关闭:
$ sudo launchctlstartio.redis.redis-server$ sudo launchctl stop io.redis.redis-server
六.brew 进行安装
下面我用brew来操作,关于brew 的安装我看的:http://my.oschina.net/liygheart/blog/284668
安装好了,然后 参考:https://gist.github.com/tonypujals/9631143
$brew info redis
会有提示,然后输入
$ln -nfs /Users/local/opt/redis/*.plist ~/Library/LaunchAgents
和
$load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
网上还找到一种方式,貌似可以成功
1.获取github中的redis-php扩展代码:
git clone https://github.com/phpredis/phpredis.git
2.cd phpredis/
3.phpize mac os 如果这里有
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.的问题,那么:
执行:brew install autoconf
4.之后执行phpize
5../configure
6.make && sudo make install 输入密码就会提示成功
Password:
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20131226/
7.之后在php.ini中加一句 extension=redis.so 就ok了
路径:/etc/php.ini
然后重启 apache/nginx 和 php-fpm ,输入命令:php -m |grep redis 或者通过 phpinfo() 输出php信息查看redis是否安装成功。
期间我在执行install的时候出现这样的问题
装不了PHP的扩展,make install失败
RudonMacBook:igbinary-master rudon$ make install
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20131226/
cp: /usr/lib/php/extensions/no-debug-non-zts-20131226/#INST@12567#: Operation not permitted
make: *** [install-modules] Error 1
cp: /usr/lib/php/extensions/no-debug-non-zts-20121212/#INST@17000#: Operation not permitted
原因是
原来是OSX 10.11 El Capitan(或更高)新添加了一个新的安全机制叫系统完整性保护System Integrity Protection (SIP),所以对于目录
/System
/sbin
/usr
不包含(/usr/local/)
仅仅供系统使用,其它用户或者程序无法直接使用,而我们的/usr/lib/php/extensions/刚好在受保护范围内
所以解决方法就是禁掉SIP保护机制,步骤是:
重启系统
按住Command + R (重新亮屏之后就开始按,象征地按几秒再松开,出现苹果标志,ok)
菜单“实用工具” ==>> “终端” ==>> 输入csrutil disable;执行后会输出:Successfully disabled System Integrity Protection. Please restart the machine for the changes to take effect.
再次重启系统
禁止掉SIP后,就可以顺利的安装了,当然装完了以后你可以重新打开SIP,方法同上,只是命令是csrutil enable
平时使用
iCocosdeMacBook-Pro:redis icocos$ cd /Users/local/redis
iCocosdeMacBook-Pro:redis icocos$ redis-server
78728:C 18 Apr 22:00:25.105 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
78728:M 18 Apr 22:00:25.107 * Increased maximum number of open files to 10032 (it was originally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 78728
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
78728:M 18 Apr 22:00:25.108 # Server started, Redis version 3.2.8
78728:M 18 Apr 22:00:25.108 * DB loaded from disk: 0.000 seconds
78728:M 18 Apr 22:00:25.108 * The server is now ready to accept connections on port 6379
^C78728:signal-handler (1492524027) Received SIGINT scheduling shutdown...
78728:M 18 Apr 22:00:27.286 # User requested shutdown...
78728:M 18 Apr 22:00:27.286 * Saving the final RDB snapshot before exiting.
78728:M 18 Apr 22:00:27.288 * DB saved on disk
78728:M 18 Apr 22:00:27.288 # Redis is now ready to exit, bye bye...
iCocosdeMacBook-Pro:redis icocos$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set key1 name
OK
127.0.0.1:6379> get key1
"name"
127.0.0.1:6379>
PHP中使用的话
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('iCocos',1234);
$redis->get('iCocos');
执行PHP文件,可以直接网页执行,也可以直接命令执行,方法基本上类似.
Redis基本命令
Redis数据类型及操作:
String:
指令:{
set
setnx :如果key已经存在, 返回0
setex :指定键值对的有效期, setex [key] [expire] [value] /类似于:set [key] [value] [EX expire]
setrange :设置key-value值的子字符串,下标从0开始到第i位置,不包含i
mset
msetnx
get
getset
getrange
mget
incr
incrby
decr
decrby
append
strlen
}
Hash:是一个string类型的field-value的映射表,它的添加删除平均都是O(1)的效率
指令:{
hset
hsetnx
hmset
hget
hmget
hincrby
hexists
hlen
hdel
hkeys
hvals
hgetall
}
List:是一个链表结构, 主要功能是pop,push,获取一个范围的所有值等,key理解为链表的名字
list类型其实就是每一个子元素都是string类型的双向链表.
指令:{
lpush
rpush
linsert : linsert key [BEFORE|AFTER] [pivot] [value]
在list的特定的值的位置之前或之后添加字符串元素
lset : lset key [index] [value] 设置list中指定下标的元素值
lrem : lrem key [count] [value] 从list中删除count个和value相同的元素
count>0,从头删除;
count=0,全部删除;
count<0,从尾删除;
ltrim : ltrim key [start] [stop] 保留key的值中指定范围内的数据
lpop : 从list的头部删除元素
rpop : 从list的尾部删除元素
rpoplpush : rpoplpush [source] [destination], 整个操作是原子的
从source的尾部移除元素,并添加到destination的头部,返回被移除的元素值
lindex : lindex key [index] 取list中index位置的元素
llen : 返回key对应list的长度
}
Set: 指令:{}
键值指令:
[
keys :返回给定pattern的所有key
exists: 确认一个key是否存在
del : 删除一个key
expire : 设置一个key的过期时间(秒为单位)
ttl : 用于获取key的有效时长
persist : 移除给定key的过期时间
move : 把当前数据库中的key移动到其它库中
rename : 重命名key
]
服务指令:
[
select :选择数据库存取, redis数据库编号从 0~15 默认16个库
dbsize :获取当前数据库的key
info : 获取服务器的信息和统计,用于说明服务器的基础信息,包括版本启动时间等;
config get: 获取服务器配置信息
flushdb : 删除当前选择数据库中的所有key
flushall : 删除所有库中的所有key
]
主从复制基本配置:
Redis主从复制中一个主服务可以有多个服务, 一个从服务可以有多个从服务;
对应配置,只需要修改redis.conf中的slaveof参数
#slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
启动master
#redis-server /usr/local/redis/conf/redis_6379.conf
#redis-cli
启动slave(假设端口3689)
#redis-server /usr/local/redis/conf/slave.conf
#redis-cli -p 6389
如果master服务设置有密码,则需要配置masterauth参数
masterauth <master-password>
查看redis连接数
redis-cli info | grep connected
如果客户端的idle空闲时间太长,连接池维持了太多的连接,则需要把不用的连接及时释放掉;
redis 127.0.0.1:6379> client list
redis 127.0.0.1:6379> CONFIG SET timeout 30
Cluster集群配置
cluster-enabled yes 开启
每一个集群节点有一个集群配置文件;它不是手工创建的,是redis节点创建和更新的;
确保同一系统上运行的redis集群节点的配置文件名不重叠
redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,
并且在此基础上实现了master-slave(主从)同步
pipeline 压缩请求数量
pipeline机制将多个命令汇聚到一个请求中,可以有效减少请求数量,减少网络延时。
script 压缩复杂请求
script核心思想是在redis命令里嵌入Lua脚本,来实现一些复杂操作。
cluster
Redis 集群不像单机版本的 Redis 那样支持多个数据库,集群只有数据库 0,而且也不支持 SELECT 命令。
学习Redis命令请参考
http://www.redis.cn/
http://www.cnblogs.com/woshimrf/p/5198361.html