非关系型的数据库NoSQL
Memcached
memcached
是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。官方站点http://memcached.org/
memcached运行流程图
memcached特点
•基于C/S架构,协议简单
•基于libevent 的事件处理
•自主内存存储处理
存储方式为slab allocation
Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。
Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。其结构图如下:
Growth Factor
memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制slab之间的差异,chunk大小的差异。默认值为1.25。
通过memcached-tool查看指定memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25
Slab Allocation的缺点
Slab Allocation可以有效的解决内存碎片问题,但是在如下情况下,会导致内存的浪费:
每个slab的chunk大小是固定的,当item的占用空间实际小于chunk大小时,会出现内存浪费
每个slab的大小是固定的(因为page是固定的),当slab不能被他所拥有的chunk整除时,会出现内存浪费
按照Growth Factor因子生成指定大小的slab,而某slab id根本未被使用时,会出现内存浪费
通过memcache添加tem的时候
1.Memcache计算item的大小(key+value+flags),选取合适的slab(刚好能放下该item的slab)
2.如果这个item对应的slab未出现过,则申请1个page(注意,这1M空间不论是否达到memcached使用内存都可以申请成功)并加该item存入slab中的chunk
3.如果item对应的slab出现过,则在该slab中优先选择expired(free_chunks)和delete(在1.2.2中delete的chunk存在着不能被重复利用的问题)的chunk进行存储,其次将选择未使用过的chunk(free_chunks_end)进行存储。
4.如果item对应的slab出现过,但是对应的slab已经存储满了,那么会申请一个新的page,这个page被分为对应大小的chunk,继续存储。
5. 如果item对应的slab出现过,但是对应的slab已经存储满了并且memcache也达到了最大内存使用。将使用lru算法,清除item(可能将未过期的item清除)此时会有eviction++
数据过期方式
• Lazy Expiration
memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
• LRU
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
memcached安装和使用
yum install -y libevent memcached libmemcached
启动命令:
/etc/init.d/memcached start
查看进程
ps aux |grep memcached
默认监听127.0.0.1:11211,默认使用内存64M,这个数值可以调节
vim /etc/sysconfig/memcached
调整CACHESIZE
-d选项是启动一个守护进程
-m是分配给Memcache使用的内存数量,单位是MB,这里是200MB
-u是运行Memcache的用户,如果当前为 root 的话,需要使用此参数指定用户。
-l是监听的服务器IP地址
-p是设置Memcache监听的端口,默认是11211
-c选项是最大运行的并发连接数,默认是1024
-P是设置保存Memcache的pid文件
查看memcached运行状态
memcached-tool 127.0.0.1:11211 stats
或者echo stats |nc 127.0.0.1 11211 需要安装nc工具 yum install -y nc
若安装libmemcached后,可以使用命令
memstat --servers=127.0.0.1:11211 查看memcached服务状态
命令行用法:
telnet 127.0.0.1 11211
set key2 0 60 3
abc
STORED
get key2
VALUE key2 0 3
abc
END
语法规则
\r\n \r\n
注:\r\n在windows下是Enter键
a) 可以是”set”, “add”, “replace”。
“set”表示按照相应的存储该数据,没有的时候增加,有的覆盖。
“add”表示按照相应的添加该数据,但是如果该已经存在则会操作失败。
“replace”表示按照相应的替换数据,但是如果该不存在则操作失败。
有时“add”,“replace”也会存储不上。
b) 客户端需要保存数据的key。
c) 是一个16位的无符号的整数(以十进制的方式表示)。
该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
d) 过期的时间。
若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
e) 需要存储的字节数,当用户希望存储空数据时可以为0
f) 需要存储的内容,输入完成后,最后客户端需要加上”\r\n”(windows直接点击Enter)作为”命令头”的结束标志。
set key3 1 100 4
abcd
STORED
get key3
VALUE key3 1 4
abcd
END
replace key3 1 200 5
abcdx
STORED
get key3
VALUE key3 1 5
abcdx
END
delete key3
DELETED
get key3
END
参考资料
memcached常用命令 http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html
php连接使用memcached
首先需要安装php的memcache扩展,注意是memcache不是memcached
可以使用php自带的pecl安装程序
# /usr/local/php/bin/pecl install memcache
也可以从源码安装
# wget http://www.lishiming.net/data/attachment/forum/memcache-2.2.3.tgz
# tar zxf memcache-2.2.3.tgz
# cd memcache-2.2.3
# /usr/local/php/bin/phpize 这步是为了生成./configure
# ../configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
make时出错,make clean 之后重新make正常
安装完后会有类似这样的提示:
Installing shared extensions: /usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20060922/
把这个记住,然后修改php.ini,把
extension_dir = "./"
修改为
extension_dir = "/usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20060922/"
并添加一行
extension="memcache.so"
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/" 没有定义是默认就在这个目录下,自定义路径也可以要把模块拷贝到自定义目录下
检验
# /usr/local/php/bin/php -m |grep memcache 看有没加载
测试php脚本
wget www.apelearn.com/study_v2/.memcache.txt
mv .memcache.txt test.php
/usr/local/php/bin/php test.php
[root@ASU memcache-2.2.3]# /usr/local/php/bin/php 1.php

session共享 在 vim /usr/local/php/etc/php.ini
session.save_handler = "memcache"
session.save_path = "tcp://127.0.0.1:11211" #(ip即memcache服务器的ip)
或者在虚拟主机配置

结果如图所示,成功记录session


扩展学习
maget搭建memcached集群 http://blog.snsgou.com/post-800.html
memcached get all keys方法 http://www.aikaiyuan.com/6433.html
redis
参考资料:
http://gaoce19871026.blog.163.co ... 262013012115644827/
http://www.jb51.net/article/56448.htm
http://www.yiibai.com/redis/redis_quick_guide.html
http://blog.nosqlfan.com/html/3202.html
官网
http://redis.io/
Redis 安装
1. 下载、安装
wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21
mv 2.8.21 redis-2.8.21.tar.gz
tar zxvf redis-2.8.21.tar.gz
cd redis-2.8.21
make
make PREFIX=/usr/local/redis install
2. 配置
mkdir /usr/local/redis/etc/
vim /usr/local/redis/etc/redis.conf //写入如下内容
daemonize yes
pidfile /usr/local/redis/var/redis.pid
port 6379
timeout 300
loglevel debug
logfile /usr/local/redis/var/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /usr/local/redis/var/
appendonly no
appendfsync always
#requirepass asulinux 配置密码
下面是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等待系统自己同步)
mkdir /usr/local/redis/var/
chmod 777 /usr/local/redis/var/
启动redis的命令是:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
我们也可以编写一个redis启动脚本。
vi /etc/init.d/redis //加入如下内容:
#!/bin/sh
#
# redis init file for starting up the redis daemon
#
# chkconfig: - 20 80
# description: Starts and stops the redis daemon.
# Source function library.
. /etc/rc.d/init.d/functions
name="redis-server"
basedir="/usr/local/redis"
exec="$basedir/bin/$name"
pidfile="$basedir/var/redis.pid"
REDIS_CONFIG="$basedir/etc/redis.conf"
[ -e /etc/sysconfig/redis ] && . /etc/sysconfig/redis
lockfile=/var/lock/subsys/redis
start() {
[ -f $REDIS_CONFIG ] || exit 6
[ -x $exec ] || exit 5
echo -n $"Starting $name: "
daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG"
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $name: "
killproc -p $pidfile $name
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
stop
start
}
reload() {
false
}
rh_status() {
status -p $pidfile $name
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}"
exit 2
esac
exit $?
############到此结束
因为脚本启动时以redis用户启动的,所以需要增加redis用户
useradd -s /sbin/nologin redis
mkdir /usr/local/redis/var
chmod 777 /usr/local/redis/var
chmod 755 /etc/init.d/redis
和Memcached类似,但是解决了断电后数据完全丢失的情况,也就是数据的持久性。而且支持更多value类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合)几种数据类型。存储结构和存储格式
redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。
redis目前提供五种数据类型
第一种类型:”string是最简单的类型,你可以理解成与Memcached一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
示例:
usr/local/redis/bin/redis-cli 启动redis的小终端
root@ASU ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> get key1
"asulinux"
# redis-cli set key1 "aminglinux.com"
OK
# redis-cli get key1
"aminglinux.com"
第二种类型:list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列,可以利用 List 的 *PUSH 操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。Redis 还提供了操作 List 中某一段元素的 API,你可以直接查询,删除 List 中某一段的元素。
示例:
127.0.0.1:6379> LPUSH list 123 从左边插入
(integer) 1
127.0.0.1:6379> LPUSH list bbb
(integer) 2
127.0.0.1:6379> LPUSH list "221 sdas"
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 查看所有的队列
1) "221 sdas"
2) "bbb"
3) "123"
127.0.0.1:6379> RPOP list 从右边取出
"123"
127.0.0.1:6379> LRANGE list 0 -1 0代表最左侧,-1 代表最右侧
1) "221 sdas"
2) "bbb"
127.0.0.1:6379> LPOP list 从左侧取出
"221 sdas"
127.0.0.1:6379> LRANGE list 0 -1
1) "bbb"
也可以
[root@172-7-15-101 ~]# redis-cli rpush mylist "aaaa bbb."
(integer) 1
[root@172-7-15-101 ~]# redis-cli rpush mylist "1 2 3."
(integer) 2
[root@172-7-15-101 ~]# redis-cli rpush mylist "aminglinux."
(integer) 3
[root@172-7-15-101 ~]# redis-cli lrange mylist
(error) ERR wrong number of arguments for 'lrange' command
[root@172-7-15-101 ~]# redis-cli lrange mylist 0 2
1) "aaaa bbb."
2) "1 2 3."
3) "aminglinux."
[root@172-7-15-101 ~]# redis-cli lrange mylist 0 1
1) "aaaa bbb."
2) "1 2 3."
第三个类型是set,set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
[root@ASU ~]# redis-cli sadd set1 asu
(integer) 1
[root@ASU ~]# redis-cli sadd set1 asu.linux
(integer) 1
[root@ASU ~]# redis-cli sadd set1 abc
[root@ASU ~]# redis-cli smembers set1 列出所有的元素,特点是随机排序的
1) "abc"
2) "asu.linux"
3) "asu"
sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行
另外一种就是在第一种集合基础上加了分值score,分值最的排在最前,最大的排在最后
root@ASU ~]# redis-cli zadd myset 12 "cde 123"
(integer) 1
[root@ASU ~]# redis-cli zadd myset 2 avc
(integer) 1
[root@ASU ~]# redis-cli zadd myset 24 "123-bbb"
(integer) 1
[root@ASU ~]# redis-cli zadd myset 4 "jkl"
(integer) 1
[root@ASU ~]# redis-cli zrange myset 0 -1 正序显示
1) "avc"
2) "jkl"
3) "cde 123"
4) "123-bbb"
倒序
[root@ASU ~]# redis-cli zrevrange myset 0 -1
1) "123-bbb"
2) "cde 123"
3) "jkl"
4) "avc"
第五种类型,Hash数据类型,在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。
127.0.0.1:6379> hset hash1 name aaa
(integer) 1
127.0.0.1:6379> HSET hash1 age 10
(integer) 1
127.0.0.1:6379> HSET hash1 sex nan
(integer) 1
127.0.0.1:6379> HGETall hash1
1) "name"
2) "aaa"
3) "age"
4) "10"
5) "sex"
6) "nan"
127.0.0.1:6379> HGET hash1 age
"10"
Redis持久化,什么是持久化:数据虽然说正常实在内存里,但是重启服务之后数据还在,通过一种手段能让redis启动时把之前的数据加载过来
Redis提供了两种持久化的方式,分别是RDB(Redis Datebase)和AOF(Append Only File)
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并储存到磁盘等介质上
AOF,则是换了一个角度来实现持久化,只要把这些指令从前到后再重复执行一遍,就可以实现数据恢复了
其实RDB和AOF两种也可以同时使用,在这种情况下redis重启的话则会优先采用AOF来进行数据恢复,这是因为AOF方式的数据恢复完整度更高,如果不小心断电,这时候内存的数据还没有及时拷贝快照到磁盘上去,就会丢失一部分数据,AOF每次更新都会记录日志,日志是存到磁盘里了,及时断电丢失的程度是极小的
当然,如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话redis将变成一个纯内存数据库,就像memcache一样
Redis配置讲解
通用配置
daemonize no # 默认情况下,redis并不是以daemon形式来运行的。通过daemonize配
置项可以控制redis的运行形式
pidfile /path/to/redis.pid #当以daemon形式运行时,redis会生成一个pid文件>,默认会生成在/var/run/redis.pid
bind 192.168.1.2 10.8.4.2 # 指定绑定的ip,可以有多个
port 6379 #指定监听端口
unixsocket /tmp/redis.sock #也可以监听socket
unixsocketperm 755 #当监听socket时可以指定权限为755
timeout 0 #当一个redis-client一直没有请求发向server端,那么server端有权主动>关闭这个连接,可以通过timeout来设置“空闲超时时限”,0表示永不关闭。
tcp-keepalive 0 #TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单
位为秒,假如设置为60秒,则server端会每60秒向连接空闲的客户端发起一次ACK请求>,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,>则不会进行保活检测。
loglevel notice # 日志级别,有四种debug, verbose, notice, warning
logfile “” #定义日志路径,
syslog-ident redis #如果希望日志打印到syslog中,通过syslog-enabled来控制。>另外,syslog-ident还可以让你指定syslog里的日志标志。
syslog-facility local0 # 指定syslog的设备,可以是USER或者local0-local7
databases 16 #设置数据库的总数量
Redis快照配置(rdb持久化)
save 900 1 #表示每15分钟且至少有1个key改变,就触发一次持久化
save 300 10 #表示每5分钟且至少有10个key改变,就触发一次持久化
save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久
save “” #这样可以禁用rdb持久化
stop-writes-on-bgsave-error yes #rdb持久化写入磁盘避免不了会出现失败的情况,
默认一旦出现失败,redis会马上停止写操作。如果你觉得无所谓,那就可以使用该选>项关闭这个功能。
rdbcompression yes #是否要压缩
rdbchecksum yes #是否进行数据校验
dbfilename dump.rdb #定义快照文件的名字
dir ./ #定义快照文件储存路径
Redis安全相关配置
requirepass aminglinux (需要编辑配置文件加上配置 vim /usr/local/redis/etc/redis.conf)
#设置redis-server的密码
[root@ASU ~]# redis-cli
127.0.0.1:6379> get ket1
(error) NOAUTH Authentication required.
[root@ASU ~]# redis-cli -a asulinux
127.0.0.1:6379> get key1
"asulinux"
rename-command CONFIG aminglinux.config
#将CONFIG命令更名为aminglinux.config,这样可以避免误操作,但如果使用了AOF持久化,建议不要启用该功能
rename-command CONFIG “”
#也可以后面定义为空,这样就禁掉了该CONFIG命令
127.0.0.1:6379> config get timeout
1) "timeout"
2) "300"
127.0.0.1:6379> config set timeout 200
OK
127.0.0.1:6379> config get timeout
1) "timeout"
2) "200"
Redis限制相关配置
maxclients 10000 #限制最大客户端连接数
maxmemory <bytes> #设定最大内存使用数,单位是byte
maxmemory-policy volatile-lru #指定内存移除规则
maxmemory-samples 3 #LRU算法和最小TTL算法都并非是精确的算法,而是估算值。所>以你可以设置样本的大小。假如redis默认会检查三个key并选择其中LRU的那个,那么>你可以改变这个key样本的数量。
Redis AOF持久化相关配置
appendonly yes #如果是yes,则开启aof持久化
appendfilename “appendonly.aof” # 指定aof文件名字
appendfsync everysec #指定fsync()调用模式,有三种no(不调用fsync),always(每次
写都会调用fsync),everysec(每秒钟调用一次fsync)。第一种最快,第二种数据最安全
,但性能会差一些,第三种为这种方案,默认为第三种。
no-appendfsync-on-rewrite no # 设置yes,可避免当写入量非常大时的磁盘io阻塞
auto-aof-rewrite-percentage 10 #规定什么情况下会触发aof重写。该值为一个比例>,10表示当aof文件增幅达到10%时则会触发重写机制。
uto-aof-rewrite-min-size 64mb #重写会有一个条件,就是不能低于64Mb
(这里最小是64M,这里是当增加到128M时就触发重写。这让我想起了mysql的二进制日志,就拿现在我们的一台mysql来说,每天有好几个G的二进制日志,如果这个auto-aof-rewrite-percentage设置低了会不会有什么影响呢?可不可以设置为200、300或者更高呢?根据你们业务的数据量吧。如果有的业务比较闲,跑了1天还没有64M,你觉得要是设置为200M合适吗? 但有的业务可能几秒钟就写100M,这个就可以适当增大一些,给磁盘留有一定的缓冲时间。但太大,一旦因为掉电内存数据丢失,那丢掉的数据也就越多。)
Redis 慢日志相关配置
针对慢日志,你可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢日志>的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。
slowlog-log-slower-than 10000 #慢于10000微秒则记录日志,1毫秒=1000微秒
slowlog-max-len 128 #日志长度
Redis安装配置主从
两台服务器: master (192.168.31.105) 和 slave (192.168.31.112)
slave 配置文件上加一行
slaveof 192.168.31.105 6379
masterauth passwd //如果主上设置了密码,要加这行
分别启动master和slave
测试成功
[root@master ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> keys *
1) "list1"
2) "hash1"
3) "12"
4) "24"
5) "list"
6) "set2"
7) "myset"
8) "set1"
9) "hash2"
10) "2"
11) "key1"
Redis主从其他相关配置
slave-read-only yes //让从只读
repl-ping-slave-period 10 //设置slave向master发起ping的频率,每10s发起一次
repl-timeout 60 //设置slave ping不通master多少s后就超时
repl-disable-tcp-nodelay no //是否开启tcp_nodelay,开启后将会使用更少的带宽>,但会有延迟,所以建议关闭
repl-backlog-size 1mb //同步队列的长度,backuplog是master的一个缓冲区,主从
断开后,master会先把数据写到缓冲区,slave再次连接会从缓冲区中同步数据
repl-backlog-ttl 3600 //主从断开后,缓冲区的有效期,默认1小时
slave-priority 100 //多个slave是可以设置优先级的,数值越小优先级越高,应用>于集群中,支持slave切换为master,优先级最高的才会切换
min-slaves-to-write 3 //和下面的一起使用,它的意思是master发现有超过3个slave的延迟高于10s,那么master就会暂时停止写操作,缓解从上的压力。这两个数值任何一个为0,则关>闭该功能,默认第一数值是0。
min-slaves-max-lag 10
string常用操作
set key1 aminglinux
get key1
set key1 aming //一个key对应一个value,多次赋值,会覆盖前面的value
setnx key2 aaa //返回1
get key2
setnx key2 bbb //返回0
说明:setnx 如果key存在,则返回0,不存在会直接创建这个key
setex key3 10 1 //这个是用来给key设定过期时间的
mset key1 1 key2 2 key3 3 //同时设置多个key
mget key1 key2 key3
Hash数据常用操作
hset user1 name aming //建立hash
hset user1 age 30
hset user1 job it
hgetall user1
hmset user2 name aming age 30 job it //批量建立键值对
hmget user2
hmget user2 name age job
hdel user2 job //删除指定filed
hkeys user2 //打印所有的key
hvals user2 //打印所有的values
hlen user2 //查看hash有几个filed
list数据常用操作
lpush lista a //从左侧压入一个元素
lpush lista b
lrange lista 0 -1 //0 为头,-1为尾
lpop lista //从左侧取出
rpush lista 1 //从右侧压入一个元素
rpush lista 2
lrange lista 0 -1
rpop lista //从右侧取第一个元素
linsert lista before 2 3 //在2的前面插入一个元素为3
lset lista 4 bbb //把第5个元素修改为bbb
lindex lista 0 //查看第1个元素
lindex lista 3 //查看第4个元素
llen lista //查看链表中有几个元素
set数据常用操作
sadd seta aaa //向集合seta中放入元素
smembers seta //查看集合中的所有元素
srem seta aaa //删除元素
spop seta //随机取出一个元素,删除
sdiff seta setb //求差集,以seta为标准
sdiffstore setc seta setb //求差集并且存储,存储到了setc里
sinter seta setb //求交集
sinterstore setd seta setb //将交集存储setd
sunion seta setb //求并集
sunionstore sete seta setb //求并集并存储到sete
sismember seta aaa //判断一个元素是否属于一个集合
srandmember seta //随机取出一个元素,但不删除
zset数据常用操作
zrange zseta 0 -1 //显示所有元素,按顺序显示
zrange zseta 0 -1 withscores //可以带上分值
zrem zseta 222 //删除指定元素
zrank zseta 222 //返回元素的索引值,索引值从0开始,按score正向排序
zrevrank zseta 222 //同上,不同的是,按score反序排序
zrevrange zseta 0 -1 反序显示所有元素,并带分值
zcard zseta //返回集合中所有元素的个数
zcount zseta 1 10 // 返回分值范围1-10的元素个数
zrangebyscore zseta 1 10 // 返回分值范围1-10的元素
zremrangebyrank zseta 0 2 //删除索引范围0-2的元素,按score正向排序
zremrangebyscore zseta 1 10 //删除分值范围1-10的元素
键值相关操作
keys * //取出所有key
keys my* //模糊匹配
exists name //有name键 返回1 ,否则返回0;
del key1 // 删除一个key //成功返回1 ,否则返回0;
EXPIRE key1 100 //设置key1 100s后过期
ttl key // 查看键 还有多长时间过期,单位是s,当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,返回 key 的剩余生存时间>。
select 0 //代表选择当前数据库,默认进入0 数据库
move age 1 // 把age 移动到1 数据库
persist key1 //取消key1的过期时间
randomkey //随机返回一个key
rename oldname newname //重命名key
type key1 //返回键的类型
服务相关操作
dbsize //返回当前数据库中key的数目
info //返回redis数据库状态信息
flushdb //清空当前数据库中所有的键
flushall //清空所有数据库中的所有的key
php使用Redis存储
Redis扩展模块安装
wget https://codeload.github.com/phpredis/phpredis/zip/develop
mv develop phpredis.zip
unzip phpredis.zip
cd phpredis-develop
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
vim /usr/local/php/php.ini // 增加一行extension = redis.so
/usr/local/php/bin/php -m |grep redis 检查是否成功
php redis中文文档 http://www.cnblogs.com/weafer/archive/2011/09/21/2184059.html
Redis实现session共享,把之前php.ini 中 memcache的配置注释掉
php.ini中加入 /usr/local/php/etc/php.ini
session.save_handler = "redis"
session.save_path = "tcp://127.0.0.1:6379"
或者apache虚拟主机加入,写到最后
php_value session.save_handler " redis"
php_value session.save_path " tcp://127.0.0.1:6379"
或者php-fpm.conf对应的pool中加入
php_value[session.save_handler] = redis
php_value[session.save_path] = " tcp://127.0.0.1:6379 "
/usr/local/apache2/bin/apachectl -t 检查有没有错误
Redis存储session测试
wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt /usr/local/apache2/htdocs/session.php
root@ASU phpredis-develop]# curl -x127.0.0.1:80 www.asu.com/session.php
1497158297<br><br>1497158297<br><br>c0h9ntnd3civu6d5gvtdcaets5
输出类似于 1443710814<br><br>1443710814<br><br>9jm6nom9ogojedj3pth0iscv22
连接redis:
127.0.0.1:6379> keys PHP*
1) "PHPREDIS_SESSION:c0h9ntnd3civu6d5gvtdcaets5"
2) "PHPREDIS_SESSION:d7b70ssbamd5jt405l927dk1j0"
(curl出现500错误,vim /usr/local/php/etc/php.ini 把display_errors = Off打开,查完错误信息要记得关掉,原因是redis有设置密码,去掉即可或者可以再php脚本中写一下,重启即可)

如果你在编译之前就把 gcc epel-release jemalloc jemalloc-devel 这三个包安装好,你会发现非常顺利,一次错也不报!
主从配置的时候,如果主没有设置 密码的话,
在从上 配置 slaveof
之后从启 服务, 发现并不能同步
只需在主上配置
protected-mode no
保护模式关掉即可。

浙公网安备 33010602011771号