WenJunjie Blog

sysadmin

Redis

| Comments

wget http://redis.googlecode.com/files/redis-2.4.15.tar.gz tar zxf redis-2.4.15.tar.gz cd redis-2.4.15 ? make && make install cp redis.conf /etc/ /usr/local/bin/redis-server /etc/redis.conf

https://github.com/owlient/phpredis/downloads

wget –no-check-certificate http://github.com/owlient/phpredis/tarball/master -O phpredis.tar.gz

redis-server /etc/redis/redis.conf

download wget http://redis.googlecode.com/files/redis-2.6.7.tar.gz

install tar xzf redis-2.6.7.tar.gz cd redis-2.6.7 make make PREFIX=/usr/local/redis install

mkdir -p /usr/local/redis/etc mkdir -p /usr/local/redis/var cp redis.conf /usr/local/redis/etc/ vim /usr/local/redis/etc/redis.conf daemonize yes dir /usr/local/redis/var

start redis-server /usr/local/redis/etc/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

test redis-cli -h 192.168.1.26 info telnet 192.168.1.26 6379 redis-cli redis 127.0.0.1:6379>set Key Value OK redis 127.0.0.1:6379>get Key “Value”

config start vim /etc/init.d/redis

#!/bin/bash
#
# Init file for redis
#
# chkconfig: - 80 12
# description: redis daemon
#
# processname: redis
# config: /etc/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
#这里要填写你的redis目录
BIN="/usr/local/redis/bin"
CONFIG="/usr/local/redis/etc/redis.conf"
PIDFILE="/var/run/redis.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="Redis Server"
start() {
        if [ -e $PIDFILE ];then
             echo "$desc already running...."
             exit 1
        fi
        echo -n $"Starting $desc: "
        daemon $BIN/$prog $CONFIG
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}
stop() {
        echo -n $"Stop $desc: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
        return $RETVAL
}
restart() {
        stop
        start
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  condrestart)
        [ -e /var/lock/subsys/$prog ] && restart
        RETVAL=$?
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
   *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        RETVAL=1
esac
exit $RETVAL

chmod 755 /etc/init.d/redis
chkconfig redis on
chkconfig –level 345 redis on
chkconfig –list redis

install phpredis unzip phpredis-master.zip cd phpredis-master/ /usr/local/php-5.3.10/bin/phpize ./configure –with-php-config=/usr/local/php-5.3.10/bin/php-config make && make install vim /usr/local/php-5.3.10/etc/php.ini extension = “redis.so” /etc/init.d/php-fpm reload /usr/local/php-5.3.10/bin/php -m |grep redis

git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git

redis.conf参数说明 redis.conf配置文件:

#是否作为守护进程运行,默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。

daemonize yes

#配置pid的存放路径及文件名,当Redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis服务时,需要指定不同的pid文件和端口。

pidfile redis.pid

#Redis默认监听端口,指定Redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项。

port 6379

#客户端闲置多少秒后,断开连接。设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。

timeout 300

#日志显示级别,log等级分为4级,debug, verbose, notice, 和warning。生产环境下一般开启notice。

loglevel verbose

#指定日志输出的文件名,也可指定到标准输出端口。配置log文件地址,默认使用标准输出,即打印在命令行终端的窗口上。

logfile stdout

#设置数据库的数量,默认连接的数据库是0,可以通过select N来连接不同的数据库。设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0。

databases 16

#设置Redis进行数据库镜像的频率。保存数据到disk的策略。

#当有一条Keys数据被改变是,900秒刷新到disk一次

save 900 1

#当有10条Keys数据被改变时,300秒刷新到disk一次

save 300 10

#当有1w条keys数据被改变时,60秒刷新到disk一次

save 60 10000

#当dump .rdb数据库的时候是否压缩数据对象。

rdbcompression yes

#dump数据库的数据保存的文件名

dbfilename dump.rdb

#Redis的工作目录,数据库镜像备份的文件放置的路径。这里的路径跟文件名要分开配置是因为Redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。

dir /home/backup/redis

#Redis的复制配置

#设置该数据库为其他数据库的从数据库。

# slaveof

#当主数据库连接需要密码验证时,在这里指定。

# masterauth

#设置客户端连接后进行任何其他指定前需要使用的密码。警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。

# requirepass foobared

#最大客户端连接数,限制同时连接的客户数量。当连接数超过这个值时,redis将不再接收其他连接请求,客户端尝试连接时将收到error信息。

# maxclients 128

#最大内存使用率,设置redis能够使用的最大内存。当内存满了的时候,如果还接收到set命令,redis将先尝试剔除设置过expire信息的key,而不管该key的过期时间还没有到达。在删除时,将按照过期时间进行删除,最早将要被过期的key将最先被删除。如果带有expire信息的key都删光了,那么将返回错误。这样,redis将不再接收写请求,只接收get请求。maxmemory的设置比较适合于把redis当作于类似memcached的缓存来使用。

# maxmemory

#是否开启日志功能,默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。开启append only模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof 进行重新整理。所以我认为推荐生产环境下的做法为关闭镜像,开启appendonly.aof,同时可以选择在访问较少的时间每天对 appendonly.aof进行重写一次。

appendonly no

# 刷新日志到disk的规则,设置对appendonly.aof文件进行同步的频率。always表示每次有写操作都进行同步,everysec表示对写操作进行累积,每秒同步一次。这个需要根据实际业务场景进行配置。

# appendfsync always

appendfsync everysec

# appendfsync no

#是否开启虚拟内存支持。因为redis是一个内存数据库,而且当内存满的时候,无法接收新的写请求,所以在redis 2.0中,提供了虚拟内存的支持。但是需要注意的是,redis中,所有的key都会放在内存中,在内存不够时,只会把value值放入交换区。这样保证了虽然使用虚拟内存,但性能基本不受影响,同时,你需要注意的是你要把vm-max-memory设置到足够来放下你的所有的key。

vm-enabled no

# vm-enabled yes

#设置虚拟内存的交换文件路径。

vm-swap-file logs/redis.swap

#这里设置开启虚拟内存之后,redis将使用的最大物理内存的大小。默认为0,redis将把他所有的能放到交换文件的都放到交换文件中,以尽量少的使用物理内存。在生产环境下,需要根据实际情况设置该值,最好不要使用默认的0。

vm-max-memory 0

#设置虚拟内存的页大小,如果你的value值比较大,比如说你要在value中放置博客、新闻之类的所有文章内容,就设大一点,如果要放置的都是很小的内容,那就设小一点。

vm-page-size 32

#设置交换文件的总的page数量,需要注意的是,page table信息会放在物理内存中,每8个page就会占据RAM中的1个byte。总的虚拟内存大小 = vm-page-size * vm-pages。

vm-pages 134217728

#设置VM IO同时使用的线程数量。因为在进行内存交换时,对数据有编码和解码的过程,所以尽管IO设备在硬件上本上不能支持很多的并发读写,但是还是如果你所保存的vlaue值比较大,将该值设大一些,还是能够提升性能的。

vm-max-threads 4

#把小的输出缓存放在一起,以便能够在一个TCP packet中为客户端发送多个响应,具体原理和真实效果我不是很清楚。所以根据注释,你不是很确定的时候就设置成yes。

glueoutputbuf yes

#在redis 2.0中引入了hash数据结构。当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值。

hash-max-zipmap-entries 64

#开启之后,redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。

hash-max-zipmap-value 512

#是否重置Hash表

activerehashing yes

Redis官方文档对VM的使用提出了一些建议:当你的key很小而value很大时,使用VM的效果会比较好,因为这样节约的内存比较大。当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value。最好使用linux ext3等对稀疏文件支持比较好的文件系统保存你的swap文件。vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0。那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟,但是对数据完整性有很好的保证。

   redis-cli命令

连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证

持久化 save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsave:返回上次成功将数据保存到磁盘的Unix时戳 shundown:将数据同步保存到磁盘,然后关闭服务

远程服务控制 info:提供服务器的信息和统计 monitor:实时转储收到的请求 slaveof:改变复制策略设置 config:在运行时配置Redis服务器

对value操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key type(key):返回值的类型 keys(pattern):返回满足给定pattern的所有key randomkey:随机返回key空间的一个key rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key dbsize:返回当前数据库中key的数目 expire:设定一个key的活动时间(s) ttl:获得一个key的活动时间 select(index):按索引查询 move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库 flushdb:删除当前选择数据库中的所有key flushall:删除所有数据库中的所有key

   简述 redis 基于key-value nosql数据库 存在memory中,定期把数据snapshot刷到硬盘或AOF定期写入保证可以redo 支持多种数据结构 key: string, hashe, list, set, sorted set or message queue来使用 Master 非阻塞 写 -同步-> Slave 阻塞 读 无partition功能,数据必须放在内存中,若数据过大,需增加服务器并自己设置partition策略(consitence hash),把数据写到不同redis server. redis是纯c开发,性能可达到11w写每秒,读8w。

常见问题

redis maxmemory : 最大使用内存 默认情况下,redis会占用可用的所有内存。 maxmemory-policy volatile-lru: 过期策略,提供六种策略
volatile-lru:删除过期和lru 的key(默认值) allkeys-lru : 删除lru算法的key
volatile-random:随机删除即将过期key
allkeys->random:随机删除(这个真傻)
volatile-ttl : 删除即将过期的
noeviction : 永不过期,返回错误(也比较傻)

# maxmemory maxmemory 610241024*1024 ###6Gb maxmemory-policy volatile-lru # 当内存达到最大值的时候 Redis 会选择删除哪些数据?有五种方式可供选择 # volatile-lru -> 利用 LRU 算法移除设置过过期时间的 key (LRU: 最近使用 Least RecentlyUsed ) maxmemory-samples 3 # LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法 ( 为了节省内存 ) ,随意你可以选择样本大小进行检测。 # Redis 默认的灰选择 3 个样本进行检测,你可以通过 maxmemory-samples 进行设置 # maxmemory-samples 3

基于2.8版本redis配置文件中文解释

Redis 命令参考

AWS Choosing an EC2 Instance Disable Swapping Use these settings, along with Redis’ maxmemory and maxmemory-policy directives, to prevent Redis from denying writes or the kernel’s out of memory manager (OOM) from terminating Redis. vim /etc/sysctl.conf: vm.swappiness=0 vm.overcommit_memory=1 Redis Persistence with Elastic Block Store Use Sharding to Properly Utilize Multi-Core EC2 Instances

运维 redis-dump Redis-Dump:将Redis数据dump成json格式

command#server Redis高可用部署及监控

备份恢复 redis-cli 127.0.0.1:6379> SAVE OK A$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb B$ sudo service redis-server stop B$ sudo cp /tmp/dump.rdb /var/lib/redis/dump.rdb B$ sudo chown redis: /var/lib/redis/dump.rdb B$ sudo service redis-server start

监控报警 redis-cli -h 10.162.69.7 ping PONG

Migration from one Redis server to another redis database dumper (rdd) 0.3

  

Comments