十分钟了解Redis

Redis入门、安装、配置、命令、数据类型、集群模式
Redis 是一个高性能的key-value内存数据库。

1、yum安装
yum install -y redis 2、编译安装(建议) yum install -y gcc
wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -xvf redis-5.0.3.tar.gz
cd redis-5.0.3 make && make install PREFIX=PWD Redis的启动和关闭 1、常用配置项 只能使用bind列表中的地址连接redis bind 0.0.0.0 没有设置bind和requirepass时才能启用,启用后只有本机可以连接。在设置bind或requirepass后此选项失效 protected-mode yes 端口 port 6379 是否以守护进程启动 daemonize yes 客户端连接密码,注释则不需要密码 requirepass foobared 2、常用命令 以配置文件启动redis服务 redis-server redis.conf
在特定端口上启动redis服务
redis-server --prot <port> 查看redis集群命令帮助 redis-cli --cluster help
客户端带参数连接
redis-cli -h <host> -p <port> -a <pass> 客户端直接执行redis指令 redis-cli [command] 例如:redis-cli shutdown 或者 redis-cli info
杀死全部带有redis关键字的进程
$ pkill redis
Redis的数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。

1、string
string是最常用的数据类型

设置一个键值对

SET key value
获取一个键的值
GET key
使一个键的值自增1,若键不存在新增键值为1
INCR key
使一个键的值自减1,若键不存在新增键值为-1
DECR key
使一个键的值自增value,若键不存在新增键值为value
INCRBY key value
使一个键的值自减value,若键不存在新增键值为-value
DECRBY key value
设置多个键值对
MSET key1 value1 key2 value2 ...
获取多个键的值
MGET key1 key2 ...
2、hash
指令前缀H-

向哈希表中加入一个属性值

HSET key field value
获取哈希表中一个属性的值
HGET key field
向哈希表中加入多个属性值
HMSET key field1 value1 field2 value2 ...
获取哈希表中多个属性的值
HMGET key field1 field2 ...
3、 list
指令前缀L-或R-,事实上它是个阻塞双端队列

从列表的头部插入一个或多个值,批量插入时每一个都从头部插入会得到[... value2] value1

LPUSH key value1 [value2 ...]
从列表的头部插入一个或多个值
RPUSH key value1 [value2 ...]
立即从列表头部弹出一个元素,不存在则返回nil
LPOP key
立即从列表尾部弹出一个元素,不存在则返回nil
RPOP key
阻塞弹出列表头部一个元素,直到有元素可弹出或等待超时,超时设置为0则一直阻塞
BLPOP key timeout
阻塞弹出列表尾部一个元素
BRPOP key timeout
获取列表指定范围内的元素
LRANGE key start stop
裁剪列表保留指定范围的元素
LTRIM key start stop
4、set
指令前缀S-

向集合中添加一个或多个成员

SADD key member1 [menber2 ...]
返回集合中的全部成员
SMEMBERS key
从集合中移除一个或多个成员
SREM key member1 [menber2 ...]
返回两个集合的差集
SDIFF key1 key2
返回两个集合的交集
SINTER key1 key2
返回两个集合的并集
SUNION key1 key2
判断menber是否为集合中的成员
SISMEMBER key member
5、zset
指令前缀Z-

向有序集合中添加成员,若成员存在则更新score

ZADD key score1 member1 [score2 member2 ...]
按score从小到大的顺序返回score排名在[start,stop]区间集合成员[返回score]
ZRANGE key start stop [WITHSCORES]
按score从大到小的顺序返回score排名在[start,stop]区间集合成员[返回score]
ZREVRANGE key start stop [WITHSCORES]
从集合中移除一个成员
ZREM key member
使集合中一个成员score自增incrment,若成员不存在则新增成员score为increment
ZINCRBY key incrment member
EX 秒为单位的过期时间;PX毫秒为单位的过期时间;NX键不存在时;XX键存在时

Redis的应用场景
缓存

将数据库的查询结果放入redis,最常用

阻塞队列

list的BLPOP(操作简单,但ack需要自己实现)

新闻列表

list的LPUSH放入新数据,LTRIM或者RPOP将旧数据移除,LRANGE查询指定范围

计数器

string的INCR可实现计数器,加入过期时间还可以让计数定期清零

TOP N

zset的ZINCRBY可实现热点排名

Redis高可用
redis主从复制
redis.conf中写入slaveof <masterip> <masterport> 即可,redis在启动时即可作为从服务器去同步主服务器的数据

Sentinel 集群
在主从复制的基础上增加哨兵进程来监控master状态并实现主从自动切换,启动多个哨兵来监控同一个redis的master进程就构成了一个哨兵集群。
redis-sentinel.conf的配置

sentinel monitor mymaster 127.0.0.1 6379 2
master-name ip port quorum
*quorum干掉一个master需要的票数

Sentinel的工作原理
每个Sentinel以每秒钟一次的频率向它所知的Master、Slave以及其他Sentinel实例发送一个PING命令。
如果一个实例距离最后一次有效回复PING命令的时间超过down-after-milliseconds选项所指定的值,则这个实例会被Sentinel标记为主观下线。
如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒一次的频率确认Master的确进入了主观下线状态。
当有足够数量(quorum)的Sentinel在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线。
在一般情况下,每个Sentinel会以每10秒一次的频率向它已知的所有Master,Slave发送INFO命令。
当Master被Sentinel标记为客观下线时,Sentinel向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次。
若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。若Master重新向Sentinel的PING命令返回有效回复,Master的主观下线状态就会被移除。
Cluster 集群
redis cluster集群启动要求至少有6个节点(3主3从)

cluster集群搭建
早期版本
$ redis-trib.rb create --replicas <num> host1:port1 ... hostN:portN

最新版本
redis-cli --cluster create --cluster-replicas <num> host1:port1 ... hostN:portN 集群测试 echo "redis-server --port $1 --daemonize yes --cluster-enabled yes --cluster-config-file nodes-$1.conf" > redis-with-port
chmod a+x redis-with-port ./redis-with-port 6379 && ./redis-with-port 6378 && ./redis-with-port 6377 && ./redis-with-port 6376 && ./redis-with-port 6375 && ./redis-with-port 6374
./redis-cli --cluster create --cluster-replicas 1 \ 127.0.0.1:6379 \ 127.0.0.1:6378 \ 127.0.0.1:6377 \ 127.0.0.1:6376 \ 127.0.0.1:6375 \ 127.0.0.1:6374 如果只是用于测试的话,redis源码文件REDIS_HOME/utils/create-cluster中有一个create-cluster的脚本,这个脚本会在30001-30006端口上启动6个redis实例,并将他们创建为3主3从的集群模式。

cdREDIS_HOME/utils/create-cluster
$ ./create-cluster start && ./create-cluster create
当然自己动手写的话更容易理解到底执行了些什么。

集群
redis cluster采用无中心结构,节点间使用gossip协议进行通信。每个节点保存数据和所有节点和槽的映射关系。
哈希槽slot
在redis cluster中使用16834个slots来存储一定范围内的数据集。每个redis节点上有一定数量的槽。当客户端提交数据时,要先计算出数据要落到哪个虚拟槽内。
故障检测
集群中的每一个节点每经过一段时间都会向其他节点发送PING消息,如果没有在规定时间内收到回复,则将该节点标记为疑似下线。当集群中过半数的节点将某节点标记为疑似下线,则该节点会被标记为下线,做出此裁定的节点或发送一条广播,任何收到广播的节点也将此节点标记为下线。
选举机制
当从节点收到自己跟随的主节点故障的广播后,该从节点会根据rank和offset加上一个随机数来计算一个短暂延时,之后该节点会将自己的epoch+1,并发送一条广播要求其他主节点进行投票,投票者判断会比较自身与投票发起者的epoch来决定是否投票,若投票则在同一个选举周期内投票者不会在为相同的epoch投票。当发起投票的从节点收到大于master半数时,自身成为master。
故障恢复
当一个从节点升级为主节点后,接管前任管理的slots,接管前任的其他从节点,发送一条广播通知集群自己已经接管前任,将集群的epoch设置为自己的epoch。
注意:Cluster对于同时处理多个键的命令,如果所有键在同一个slot则能够执行,否则将不能执行。

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

推荐阅读更多精彩内容