readis数据结构服务器

本章节阅读索引:

一:redis简介

二:安装及主要配置文件简介

三:Redis常用命令及数据库操作命令简介

四:Redis文件配置段相关简介

五:Redis的持久化存储

六:Redis主从复制的实现

七:Redis之sentinel高可用集群的实现

八:分布式扩展 CLuster:集群相关配置及实现


一:Redis简介

REmote DIctionary Server:远程数据结构服务器。

Redis是一个开源的使用C语言编写、开源、支持网络、以内存作为存储的,可以作为数据库,缓存,消息(掮客)队列服务器,并提供多种语言的API。

支持的数据结构:字符串,列表(数组),hashe(关联数组),集合,有序集合(支持范围查询),bitmaps(位图),hyperloglogs,空间索引(支持辐射查询);

相关特性:内键的复制(主从复制),Lua scripting(Lua脚本引擎),支持LRU的内存淘汰机制,支持事务,基于磁盘的不同级别的持久机制,基于Sentinel实现的高可用,redis3.0支持内键集群机制。

单进程:不会因为CPU出现瓶颈。

持久化机制:

snapshotting(默认)

AOF:(Append only file)类似于mysql的二进制日志

二:安装及主要配置文件简介

           安装使用 yum install redis -y 存在于epel仓库

  1): 程序及环境:

                         主配置文件:/etc/redis.conf

                         主程序:/usr/bin/redis-server

                         命令行工具:/usr/bin/redis-cli

                         数据目录:/var/lib/redis

2):主配置文件注释内容简介:

[root@node01 ~]#grep "^###" /etc/redis.conf

################################## INCLUDES ###################################

################################## NETWORK ##################################### 网络属性

################################# GENERAL ##################################### 通用配置

################################ SNAPSHOTTING ################################ 快照持久配置

################################# REPLICATION ################################# 主从复制

################################## SECURITY ################################### 安全认证

################################### LIMITS #################################### 资源限制

############################## APPEND ONLY MODE ############################### AOF持久性

################################ LUA SCRIPTING ############################### LUA脚本

################################ REDIS CLUSTER ############################### 集群配置

################################## SLOW LOG ################################### 慢日志

################################ LATENCY MONITOR ############################## 延时监控器

############################# EVENT NOTIFICATION ############################## 事件通知

############################### ADVANCED CONFIG ############################### 高级配置


3):简单配置的实现:

[root@node01 ~]#vim /etc/redis.conf

bind 0.0.0.0 #更改为监听本机所有端口

port 6379

[root@node01 ~]#systemctl start redis

[root@node01 ~]#redis-cli -h 192.168.38.27 #连接交互式界面


三:Redis常用命令及数据库操作命令简介

1):redis-cli命令:

               -h:指定主机

              -p:指定端口

              -a:指定密码

              -n:指定数据库,0-15,(数据库格式都是按照数字编号进行定义的)

              -s:指定监听在socket文件上

2):连接数据库获取内键命令的使用帮助

[root@node01 ~]#redis-cli -h 192.168.38.27

192.168.38.27:6379> help 获取内键命令的使用帮助

redis-cli 3.2.10

To get help about Redis commands type:

    "help @" to get a list of commands in

    "help " for help on

    "help " to get a list of possible help topics

    "quit" to exit

To set redis-cli perferences:

    ":set hints" enable online hints

    ":set nohints" disable online hints

Set your preferences in ~/.redisclirc


3):Redis数据库操作命令:

支持的数据结构:字符串,列表(数组),字典(关联数组),集合,有序集合,发布/订阅

@string (字符串)

        SET          #设定指定键的值

        GET          #获取键的值

        EXISTS        #判定指定键是否存在

        INCR          #增加相关键的值

        DECR          #降值

        SETNX        #已存在就不会改变键的值

        SETEX        #设定键的过期时间

        INCRBYELOAT  #以浮点的方式自增

        MGET          #获取多个键的值

        MSET          #设定多个键的值

        STRLEN        #获取键中的字符

        APPEND        #在一个键后追加新内容

@list(列表)

        LPUSH        #左进入栈

        RPUSH        #右进入栈

        LPOP        #左出

        RPOP        #右出

        LPUSHX      #仅当列表存在时入栈

        RPUSHX      #仅当前列表存在才从右侧新增元素

        LRANGE      #取指定范围内的键

        LINDEX      #取指定范围内的值

        LSET        #修改其中一个元素的值

        LTRIM        #删除指定范围内的键

        LREM        #移除指定范围内的元素

@hash(字典)

        HSET        #设定单个键值

        HMSET        #一次设定多个键值

        HGET        #获取键的值

        HMGET        #一次获取多个键的值

        HKEYS        #获取指定键的所有字段

        HVALS        #获取指定键的所有值

        HDEL        #删除字段

        HGETALL      #获取键的所有字段和值

        HSTRLEN      #获取指定键的值的长度

@set(集合)

        SADD          #添加值

        SPOP          #弹出值

        SCARD        #列出集合中的所有元素个数

        SMEMBERS      #列出所有集合中的元素

        SMOVE        #移动指定元素

        SREN          #删除指定的元素

        SINTER        #求交集

        SUNION        #求并集

        SDIFF        #求插集

        SRANDMEMBER

@sorted_set 有序集合

      ZADD          #ZADD z1 100 tom 90 jerry 80 obama 70 trump 创建有序集合

      ZCARD

      ZCOUNT

      ZSCORE        #获取成员得分

      ZREMRANGEBYRANK #以索引范围删除指定的成员

      ZRANGEBYSCORE

      ZRANGE        #根据索引来获取指定范围内的成员信息

      ZRANK        #获取指定成员的索引信息

      ........

@pubsub 发布/订阅

      PUBLISH      #向一个频道中发布消息

      SUBSCRIBE    #订阅某个队列

      UNSUBSCRIBE  #取消订阅

      PSUBSCRIBE    #基于正则表达式去订阅某些队列

      PUNSUBSCRIBE  #基于正则表达式取消订阅

@connection 连接相关

      PING          #探测服务器是否为健康状态

      AUTH password  #认证

      SELECT index  #切换数据库

      QUIT          #退出当前客户端

      KEYS pattern  #列出数据库中的键

      FLUSHDB        #清空当前数据库

      FLUSHALL      #清空所有数据库

@server 相关的所有命令

      CLIENT GETNAME #获取客户端连接的相关连接信息

      CLIENT KILL    #关闭客户端

      CLIENT LIST    #列出所有客户端连接的信息

      CLIENT PAUSE  #暂停某个连接

      SHUTDOWN      #关闭服务器

      CLIENT SETNAME #设置当前连接名称

配置参数可运行时修改:

    CONFIG GET      #获取配置

    CONFIG RESETSTAT

    CONFIG REWRITE  #将内存中的配置覆盖文件中的配置

    CONFIG SET      #修改配置

    INFO            #获取状态信息及统计信息

四:Redis文件配置段相关简介

通用配置项:

  daemonize no                    #是否运行为守护进程

  supervised no

  pidfile /var/run/redis_6379.pid  #守护进程的PID文件

  loglevel notice                  #日志级别

  logfile /var/log/redis/redis.log #日志文件存放位置

  databases 16                    #定义最大16个数据库,-1不做限制。

网络配置项:

  bind 0.0.0.0                    #监听的地址

  protected-mode yes              #保护模式,没有定义bind指令,而且又没有配置密码时将激活保护模式

  port 6379                      #监听的端口

  tcp-backlog 511                #TCP的后援队列

  timeout 0                      #0为永不超时,设定客户端的连接空闲超时时长

  tcp-keepalive 300              #TCP连接的超时时长

安全配置项:

  requirepass           #设置密码

  rename-command   #在AOF或Replication环境中,不推荐使用

资源限制相关的配置:

  maxclients 10000    #最大并发连接数

  maxmemory     #存储内存设置,单位字节,如果不设定则使用所有的可用内存,如果内存耗尽将会被OOM(out of Memory),内核将自动杀死最”吃“内存资源的进程

  maxmemory-policy noeviction #一旦内存达到了maxmemory的淘汰机制

  volatile-lru        #只对有过期时间的键基于LRU淘汰

  allkeys-lru          #对所有的的键基于LRU进行淘汰

  volatile-random      #只对所有设置了过期时间的键进行随机淘汰

  allkeys-random      #对所有的键都基于随机淘汰机制

  volatile-ttl        #对所有设置了过期时间的键基于幂序进行淘汰

  noeviction          #不淘汰任何键,如果没有空间了则返回错误

  maxmemory-samples 5 #淘汰范围(采样范围),5个接近真实,10个无限接近真实,3个非常快但不是太精准。

SlowLog(m慢查询日志)相关的配置:

  Slowlog-log-slower-than 1000 #单位是微秒

  Slowlog-max-len 128 #SlowLog记录的日志最大条目;

ADVANCED(高级)配置:

  hash-max-ziplist-entries 512    #字典的每个键中得字段最大512个

  hash-max-ziplist-value 64      #单个字段的值最大为64字节

  client-output-buffer-limit normal 0 0 0  #面向客户端的发送缓冲,普通客户端

  client-output-buffer-limit slave 256mb 64mb 60  #从服务器客户端

  client-output-buffer-limit pubsub 32mb 8mb 60  #订阅队列客户端

          #硬限制

          #软限制

  #软限超出多少时间清空


五:Redis的持久化存储

RDB:snapshotting,二进制格式,按事先定制的策略,周期性地将数据从内存同步至磁盘,数据文件默认为dump.rdb

         客户端显示使用SAVE或BGSAVE命令来手动启动快照保存机制。

         SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;

         BGSAVE:异步;backgroud

         BGREWRITEAOF:AOF文件重写;

RDB相关的配置:

    dbfilename dump.rdb    #二进制文件名称

    dir /var/lib/redis      #文件存放路径,如需更改路径,属主数组必须为redis

    stop-writes-on-bgsave-error yes  #如果出现错误执行停止写入操作

    rdbcompression yes      #压缩存放,主要节约磁盘IO

    rdbchecksum yes        #每一次保存完是否需校验

    save 900 1      #在900秒的时间内,数据发生了一次修改,则立即触发快照

    save 300 10      #在300秒的时间内,数据发生了十次修改操作,则立即触发快照

    save 60 10000    #在60秒的时间内,数据发生了一万次修改操作,则立即触发快照

AOF:

记录每次写操作至指定的文件尾部实现的持久化,当reedis重启时,可通过重新执行文件中的命令在内存中重建出数据库;

BGREWRITEAOF:手动触发AOF文件重写,不会读取正在使用AOF文件,而是通过将内存中得数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件

AOF相关的配置:

  appendonly no

  appendfilename "appendonly.aof"  #文件名称

  auto-aof-rewrite-percentage 100  #发生变化的内容占原来数据得100%,则自动触发重写

  auto-aof-rewrite-min-size 64mb    #当数据大于64M时才执行上述自动重写操作

  appendfsync everysec              #多少次执行同步写磁盘,一秒一次。

  aof-load-truncated yes            #是否自动修剪残缺数据

注:持久机制本身不能取代备份,应该制定备份策略,对redis库定期备份;

RDB与AOF同时启用

                  1):BGSAVE和BGREWRITEAOF不会同时进行

                  2):Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;

六:Redis主从复制的实现

      1):配置主从相关选项简介

################################# REPLICATION #################################

slave-serve-stale-data yes      #如果主节点宕机,从节点是否可以将不新鲜的数据给客户端

slave-read-only yes              #将从节点设置为只读

repl-diskless-sync no            #向多个从节点同时发送

repl-diskless-sync-delay 5      #发送延时时长 5s

repl-ping-slave-period 10        #主节点每隔多久探测一次从节点的从活性

repl-timeout 60                  #主节点的超时时长

repl-disable-tcp-nodelay no      #是否需要禁用tcp-nodelay选项

slave-priority 100              #从节点的优先级

min-slaves-to-write 3

min-slaves-max-lag 10          #如果集群中有10个从节点,有3个存活才可以正常工作


2):主节点配置

[root@node01 ~]#vim /etc/redis.conf

bind 0.0.0.0

requirepass ilinux #设置密码

Disk-backed:将数据写到磁盘上,适合互联网

Diskless:直接发送到内存缓存区,适合内网


3):从节点配置

[root@node02 ~]#vim /etc/redis.conf

bind 0.0.0.0

slaveof 192.168.38.27 6379

masterauth ilinux

requirepass ilinux


4):主节点查看当前状态

[root@node01 ~]#redis-cli -a ilinux127.0.0.1:6379>INFO replication# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.38.17,port=6379,state=online,offset=183,lag=1master_repl_offset:183repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:182


5):使用命令行配置从节点二

[root@node03 ~]#vim /etc/redis.confbind 0.0.0.0requirepass ilinux[root@node03 ~]#systemctl start redis[root@node03 ~]#redis-cli -a ilinux[root@node03 ~]#redis-cli -a ilinux127.0.0.1:6379>SLAVEOF 192.168.38.27 6379127.0.0.1:6379>CONFIG SET masterauth ilinux127.0.0.1:6379>CONFIG GET masterauth1) "masterauth"2) "ilinux"127.0.0.1:6379>CONFIG REWRITE#使其配置永久有效。[root@node03 ~]#tail -3 /etc/redis.conf# Generated by CONFIG REWRITEslaveof 192.168.38.27 6379masterauth "ilinux"


注:使用命令行配置从节点为即时生效


七:Redis之sentinel高可用集群的实现

主要功能:监控,通知,故障转移。

[root@node01 ~]#vim /etc/redis-sentinel.confbind 0.0.0.0sentinel monitor mymaster 192.168.38.27 6379 2      #指定监听的地址及quorum(机制)sentinel auth-pass mymaster ilinux                  #主节点的认证sentinel down-after-milliseconds mymaster 30000      #指定多长时间联系不到主节点认为宕机,单位毫秒。sentinel parallel-syncs mymaster 5                  #指定并行复制节点sentinel failover-timeout mymaster 180000            #提升为新主复制数据时间,超过3分钟为故障转移超时logfile /var/log/redis/sentinel.log                  #日志文件路径[root@node01 ~]#scp /etc/redis-sentinel.conf 192.168.38.17:/etc/[root@node01 ~]#scp /etc/redis-sentinel.conf 192.168.38.37:/etc/[root@node01 ~]#systemctl start redis-sentinel.service[root@node01 ~]#redis-cli -p 26379127.0.0.1:26379>SENTINEL masters1) 1) "name"2) "mymaster"                  #集群名称3) "ip"4) "192.168.38.27"            #被监控IP地址127.0.0.1:26379>SENTINEL slaves mymaster#查看有几个从节点信息1) 1) "name"2) "192.168.38.37:6379"2) 1) "name"2) "192.168.38.17:6379"[root@node03 ~]#vim /etc/redis-sentinel.confsentinel myid xxx          #删除此行,由于配置文件是复制的,会造成myid一致。[root@node03 ~]#systemctl start redis-sentinel

SENTINEL failover #当主节点并未发生故障时,手动强行转移

SENTINEL get-master-addr-by-name

八:分布式扩展 CLuster:集群相关配置及实现

1):CLuster:集群相关的配置

cluster-enabled 是否开启集群配置

cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突

cluster-node-timeout 集群节点互连超时的阈值,单位毫秒

cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较 旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。

    2):配置过程

                 1):设置配置文件,启用集群功能

                 2):启动redis后为每个节点分配slots;

                注:每个slot要独立创建,可以范围是0-16383,共16384个;

                 3):设定群成员关系:CLUSTE MEET

                4):获取集群状态:GLUSTER INFO CLUSTER NODES

3):实现过程

[root@node01 ~]# vim /etc/redis.conf

bind 0.0.0.0

requirepass  ilinux

################################ REDIS CLUSTER ############################### cluster-enabled yes cluster-config-file /etc/redis-cluster.conf cluster-node-timeout 15000 cluster-slave-validity-factor 10 [root@node01 ~]# scp /etc/redis.conf 192.168.38.17:/etc/ [root@node01 ~]# scp /etc/redis.conf 192.168.38.37:/etc/ [root@node01 ~]# systemctl start redis [root@node02 ~]# systemctl start redis [root@node03 ~]# systemctl start redis [root@node01 ~]# redis-cli -a ilinux -h 192.168.38.17 -c cluster addslots {0..5499} [root@node01 ~]# redis-cli -a ilinux -h 192.168.38.27 -c cluster addslots {5500..10999} [root@node01 ~]# redis-cli -a ilinux -h 192.168.38.37 -c cluster addslots {11000..16383} [root@node01 ~]# redis-cli -a ilinux 127.0.0.1:6379>CLUSTER MEET 192.168.38.17 6379127.0.0.1:6379>CLUSTER MEET 192.168.38.37 6379127.0.0.1:6379>CLUSTER NODES2e2905d38d25706f3f78b70aa8763e4faf5d592e 192.168.38.17:6379 master - 0 1532428013117 1 connected 5500-10999 e512ceda75fecd864fa101a4be23789828d4aaac 192.168.38.37:6379 master - 0 1532428014119 0 connected 11000-16383 ce6a7525e403171d1ff02443820bda71812d10ac 192.168.38.27:6379 myself,master - 0 0 2 connected 0-5499

个人学习笔记,仅供参考。

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

推荐阅读更多精彩内容