redis安装及使用

redis安装及使用

本次安装环境:

centos6.8

redis-3.2.1

1、安装redis

下载redis-3.2.1.tar.gz

tar -xzf redis-3.2.1.tar.gz

mkdir /opt/redis

cp -rf /root/redis-3.2.1/* /opt/redis/

cd /opt/redis

make

make test #注意此时报错:"You need tcl 8.5 or newer in order to run the Redis test",处理方法:yum -y install tcl

cd src

make install

mkdir /opt/redis/bin

mkdir /opt/redis/etc

mv /opt/redis/redis.conf /opt/redis/etc/

cd /opt/redis/src

mv redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /opt/redis/bin/

至此redis的安装基本完成

2、调试

cd /opt/redis/bin

./redis-server #直接运行redis服务,测试是否可正常运行,查看端口是否正常监听,燃火ctrl-c中断

vi redis.conf #修改配置文件,常用配置信息见附录

    /opt/redis/bin/redis-server /opt/redis/etc/redis.conf #通过配置文件启动redis

3、redis客户端的基本操作

redis-cli #不加任何参数,默认连接本地redis服务

redis-cli -h host -p port -a password #用于连接远端redis服务

redis-cli -n 库号 #进入编号为n的redis库中,redis默认有16个库号

select 库号 #进入redis后切换到其他库

ping #返回pong,该命令用于检测redis是否启动

keys * #查看当前redis库中所有key

set name yinlong #name为key,yinlong为value,set命令为创建一个key并存入相应的value

get name #get命令查询name这个key中的存入的value值

mget key1 kye2... #一次返回多个key的value

getrange name 0 2 #通过范围取值key的内容,此时返回'yin'

del name #del为删除name这个key

rename name name1 #给key重新命名,rename key newkey

type name #type key,获取key的数据类型

hmset long name 'yinlong' age '26' #创建一个hash,long为key,之后为键值对,可跟多个

hgetall long #获取long这个key中的所有hash值

hget long name #获取long这个key中的name的hash值

hdel long name #删除long这个key中的name的hash值

lpush class yinlong xiale tianyuan #lpush为创建一个列表并从左部插入新元素,class为key

rpush class shuaige #rpush为在class列表的右部插入新元素

lrange class 0 100 #查看class列表中从0到100的值

lindex class 7 #以索引的方式返回class列表中的值

lpop class #从列表中移除并返回第一个元素

rpop class #从列表中移除并返回最后一个元素

sadd shu lunyu mengzi daxue #sadd可以新建一个集合(set),shu为key后跟集合内的元素

smembers shu #查看shu集合内的元素

srem shu lunyu #移除集合中一个或多个元素

zadd wangzhan 1 ali 3 baidu 4 sina #zadd可以新建一个有序集合,wangzhan为key,后跟1(score)和ali(value)

zrange wangzhan 0 10 (withscores) #查看有序集合中的元素,可选择是否显示scores

zrem wangzhan ali #移除有序集合中的元素,可跟多个

4、redis主从同步、主从切换

此时环境状态:

A主机:192.168.137.50 master

B主机:192.168.137.51 slave

主从同步配置:

修改A主机配置文件:

    bind 127.0.0.1 192.168.137.50 #使A机器redis可以监听192.168.137.50

通过配置文件启动A主机:

/opt/redis/bin/redis-server /opt/redis/etc/redis.conf

修改B主机配置文件:

    bind 127.0.0.1 192.168.137.51

    slaveof 192.168.137.50 6379 #开启slave模式,后跟master地址和端口

    masterauth wang123 #master有密码的话,输入链接密码

通过配置文件启动B主机:

/opt/redis/bin/redis-server /opt/redis/etc/redis.conf

此时可通过客户端分别连接A、B主机的redis,使用info命令查看redis状态:

A主机:

role:master

connected_slaves:1

slave0:ip=192.168.137.51,port=6379,state=online,offset=43,lag=0

B主机:

role:slave

master_host:192.168.137.50

master_port:6379

master_link_status:up

若查看主从失败优先考录防火墙原因

在B主机执行keys *发现已经将A主机上的数据通过过来,进行测试:

A主机set name erzhu ------>B主机get name ------>'yinlong'

B主机set name1 erzhu -------->(error) READONLY You can't write against a read only slave.

说明主从同步已正常工作,且B主机只有读权限

主从自动切换配置:

redis中自带了sentinel(哨兵),其特点如下:

监控:不断地检查主服务器和从服务器的运行状态

通知:当主或从服务器出问题时sentinel可通过API向管理员或其他应用发送通知

自动故障迁移:当主发生故障时sentinel可自动将一个从提升为主,并且其它的从自动将切换新主

sentinel配置:(redis安装文件中自带了sentinel运行文件和配置文件)

mkdir /opt/redis/tmp

cp /opt/redis/sentinel.conf /opt/redis/etc/

vi /opt/redis/etc/sentinel.conf #配置文件主要参数及功能见附录

    dir /opt/redis/tmp #设置工作目录

    sentinel monitor master 192.168.137.51 6379 1

    sentinel down-after-milliseconds master 10000

/opt/redis/bin/redis-sentinel /opt/redis/etc/sentinel.conf #启动sentinel服务

验证是否实现自动主从切换:

先验证A为主、B为从

杀掉A主机redis进程

观察sentinel输出信息:

+promoted-slave slave 192.168.137.51:6379 192.168.137.51 6379 @ mymaster 192.168.137.50 6379

将从晋升为主

此时查看B主机redis状态,发现以成为master,且可以插入新数据

再次开启A主机redis

观察sentinel输出信息:

+convert-to-slave slave 192.168.137.50:6379 192.168.137.50 6379 @ mymaster 192.168.137.51 6379

发现A主机redis启动,自动将A主机添加为B主机的从服务器

进入A主机redis查看状态为slave,无法插入新数据

5、redis集群

特点:无中心化,多节点共享数据。不支持处理多个key的命令,因为数据会在多个节点间移动,会导致不可预料的问题。

redis集群官方推荐最小规模为3主3从,注意集群中每台redis节点至少要有一台相应的从节点,否则当该节点故障时集群将无法正常使用。

搭建集群:本次试验采用最小规模的3主3从,环境如下:

A(主)192.168.137.50 6379

B(主)192.168.137.51 6379

C(主)192.168.137.52 6379

A(从)192.168.137.51 7000

B(从)192.168.137.52 7000

C(从)192.168.137.50 7000

集群搭建前准备:

yum -y install ruby-devel rubygems rpm-build #安装ruby环境,redis-trib.rb依赖ruby环境

安装ruby2.2.2或以上版本

gem install redis

创建redis主机:(分别在三台主机上创建redis配置文件,本次以一台为例)

cd /opt/redis/etc

vi redis_master.conf #此处只列出重要选项,可根据情况自行添加

    daemonize yes             

    pidfile /var/run/redis_6379.pid 

    port 6379

    dir /opt/redis/db

    cluster-enabled yes #开启集群

    cluster-config-file nodes_6379.conf #集群的配置文件首次启动自动生成

    cluster-node-timeout 5000 #请求超时,设置5秒即可

    appendonly yes #aof日志开启,有需要就开启,它会每次写操作都记录一条日志

    logfile "/opt/redis/log/redis.log"

    bind 192.168.137.50 #注意此IP不能绑定127.0.0.1,否则加入集群不成功

    dbfilename dump_6379.rdb

    appendfilename "appendonly_6379.aof"

vi redis_slave.conf

    daemonize yes             

    pidfile /var/run/redis_7000.pid 

    port 7000

    dir /opt/redis/db

    cluster-enabled yes

    cluster-config-file nodes_7000.conf

    cluster-node-timeout 5000

    appendonly yes

    logfile "/opt/redis/log/redis.log"

    bind 192.168.137.50

    dbfilename dump_7000.rdb

    appendfilename "appendonly_7000.aof"

启动所有redis实例:

/opt/redis/bin/redis-server /opt/redis/etc/redis_master.conf

/opt/redis/bin/redis-server /opt/redis/etc/redis_slave.conf

ps -elf|grep redis

创建集群:

/opt/redis/src/redis-trib.rb create 192.168.137.50:6379 192.168.137.51:6379 192.168.137.52:6379 #将三台主加入集群

/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.51:7000 192.168.137.50:6379 #分别将三台从按照对应关系加入

/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.52:7000 192.168.137.51:6379

/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.50:7000 192.168.137.52:6379

/opt/redis/src/redis-trib.rb check 192.168.137.50:6379 #随便指定一台redis主机即可查看集群中所有主机的状态

此时redis集群搭建完毕,该工具会自动分配槽点,连接任意一台主redis都可以对数据进行操作。但若存储该数据的槽点不在连接的主机上,该主机会返回对应的主机信息,并不会直接返回数据。

附录:

redis配置文件:

daemonize no #默认不是以守护进程的方式启动,可改成yes

pidfile /var/run/redis.pid #以守护进程的方式启动时pid文件位置

port 6379 #指定redis监听的端口,默认6379

bind 127.0.0.1 #绑定的主机ip

timeout 300 #连接redis服务的超时时间,指定为0则表示关闭此功能

loglevel verbose #指定日志级别,debug、verbose、notice、warning,默认为verbose

logfile "/redis/redis.log" #指定redis日志的存放位置,默认为标准输出

databases 16 #设置数据库的数量,默认数据库为0

save <seconds> <changes> #指定多长时间内有多少次更新则会将数据写入硬盘,可设置多个策略,默认值如下

save 900 1

save 300 10

save 60 10000

rdbcompression yes #存储至本地数据库时是否压缩数据,默认为yes,redis采用LZF压缩

dbfilename dump.rdb #指定本地数据库名,默认为dump.rdb

dir /opt/redis/db #指定本地数据库存放位置

slaveof <masterip> <masterport> #设置本机为slave服务时,指定master的ip及port

masterauth <master-password> #本机为slave,当master设置密码时连接所需密码

requirepass 密码 #设置redis的密码

maxclients 128 #同一时间最大客户连接数,默认0不限制

maxmemory <bytes> #redis最大内存限制,默认0不限制,当达到最大内存时只能读不能写

appendonly no #是否在每次更新数据后进行日志记录,默认为no

appendfilename appendonly.aof #指定更新日志文件名,默认为appendonly.aof

appendfsync everysec #日志更新条件, no:表示等操作系统进行数据缓存同步到磁盘(快)

always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)

everysec:表示每秒同步一次(折衷,默认值)

vm-enabled no #是否启动虚拟内存机制,默认no

vm-swap-file /tmp/redis.swap #虚拟文件路径,默认/tmp/redis.swap,不可多个redis实例共享

vm-max-memory 0 #所有大于该值的数据会存入虚拟内存,为0时所有数据都会存入虚拟内存

vm-page-size 32 #redis的swap文件分成很多page,这里设置page的大小,一般为32或64

vm-pages 134217728 #设置page的数量,磁盘上每8个page消耗1byte内存

vm-max-threads 4 #访问swap文件的线程数,不要超过cpu核心数,为0则为串行操作

glueoutputbuf yes #向客户端应答时是否把较小的包合并为一个包发送,默认为开启

hash-max-zipmap-entries 512 #指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法

hash-max-zipmap-value 64 #同上为一组功能

activerehashing yes #是否激活重置哈希,默认开启

include /path/to/local.conf #指定包含的其他配置文件

sentinel配置文件:

bind 0.0.0.0 #在一些云主机上屏蔽掉了IPv6,所以加上这一项可只监听IPv4

port xxxooo #端口

sentinel monitor master 127.0.0.1 6379 2 #指定要监控的主IP、端口,2表示有几个sentinel监控到主出问题时才判定down

sentinel down-after-milliseconds master 30000 #指定sentinel监控到主异常多长时间才判定down,单位毫秒

sentinel failover-timeout master 180000 #指定在该之间内未完成主从切换则认为本次failover失败

sentinel parallel-syncs master 1 #指定failover过程中同时重新配置的slave的个数,该值最好取小

sentinel notification-script #指定sentinel检测到异常时执行的脚本

sentinel auth-pass master password #password为redis有密码时添加访问密码

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容