一、redis介绍

redis的功能特性
    1、高速读写
    2、数据类型丰富
    3、支持持久化
    4、多种内存分配及回收策略
    5、支持事务
    6、消息队列、redis用的多的还是发布-订阅模式
    7、支持高可用
    8、支持分布式分片集群
linux操作系统是怎么分配内存的?
    答:吧内存分三大块。
        RSS :
        page cache:
        anno page: 程序之间进行交互的时候.....#匿名页 
    linux操作系统以page进行分配内存,page大小默认4kb
    slab allocator 内存页的划分
    buddy system :LRU最近最少使用的原则
怎么保证使用连续的内存,
    slab allocator 

redis优势
1、redis在单用户(单线程)多并发读写的性能高
2、在多用户(多线程)少读写时memache更优
3、redis是一个单核的管理机制,生产中一般是,单机多实例的框架。

 

二、redis的使用

下载
安装
解压 tar -zxvf redis-3.2.6.tar.gz 
cd redis-2.6.0
make #编译安装
yum install gcc*


cd /application/redis-3.2.6/src
./redis-server & #启动redis服务端 ,&后台运行,不然一直占用端口
ps -ef |grep redis #查看是否启动
./redis-cli  #连接服务器

三、使用redis

  set foo bar 
    get foo 


    基本的配置文件
    vim /etc/redis.conf  #去编辑redis.conf文件

    #添加配置
    daemonize  yes
    port 6379
    dbfilename dump.rdb
    dir "/application/data/6379" 
    logfile /var/log/redis.log
    ######
     mkdir -p /application/data/6379
     ps -ef |grep redis
     ./redis-server /etc/redis.conf 
    /application/redis-3.2.6/src/redis-server /etc/redis.conf

     
    #为了不用每次都切进去,在环境变量里面设置一下
    cd /root 
    vim .bash_profile 
    PATh 添加 :/application/redis-3.2.6/src
    :wq保存

    配置生效
    source .bash_profile
    redis-cli 

    配置完成之后,可以直接在命令行调用redis命令
    例如:
    redis-cli shutdown
    或者
    redis-server /etc/redis.conf



    #安全控制(也在配置文件里面设置)
    bind 10.0.0.200   #绑定ip10字段
    requirepass root  #没有用户只有密码,密码为root
    redis-cli 
    shutdown
    redis-server /etc/redis.conf
    设置完成之后需要换种方式打开:
    redis-cli -h 10.0.0.200 -a root 


    #改完配置文件每次都需要重启,不用每次都重启,在线变更配置:
    获取当前配置
    CONFIG GET *
    变更运行配置
    CONFIG  SET loglevel 'notice'
    修改密码
    CONFIG SET requirepass  "123"
    CONFIG GET requirepass

    在线修改的配置,下次登录生效,但是重启之后配置会丢失

    #Python链接redis 
    import redis 
    ....

四、redis的数据持久化

  RDB持久化:快照,只记录一个时刻内存数据状态(快照记录某一时刻的数据)
    AOF持久化:只追加日志文件的方式,记录了redis里面所有的修改命令

    RDB记录某一时刻的,还可以用做备份
    AOF比较安全,但是比较啰嗦,每次都把所有的搜保存下来了


    #如果配置持久化功能
    方式一:
    RDB 持久化配置:还是修改配置文件
    dbfilename dump.rbd 
    dir '/application/data/6379'
    save 900 1  900秒内有一个更改
    save 300 10  300秒内有10个更改
    save 60 10000  60秒内有10000个更改
    #也可以设置配置做持久化
    方式二:
    set foo bar 
    save 或者 bgsave  #手工触发持久化


    #配置扩展

    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes

    #AOF 配置
    appendonly yes 
    applendfsync every

五、redis数据类型

  计数器
       incr fensi ##你点击一下增加一下,刷点击量
       incrby fensi 10000
       DECR fensi #递减
       DECRBY fensi 20  
    set foo bar 
    set foo ex 10
    
    
    hset stu(表) id(列) 100
    hmset stu id 100 name  zhangsna 



    lpush pengyouquan 'today is nice day'
    lpush pengyouquan 'today is bad day'
    lpush pengyouquan 'today is a day'
    lpop pengyouquan  #删除最后一条
    lrange pengyouquan 0 -1 #查看所有
    
    有序集合:像是排行榜

六、发布订阅模式

  发布订阅模式(中间桥梁:频道):朋友圈是很好的证明。先关注你就能看到
    开两个端口 
    PUBLISH weibo hello 先订阅某个频道
    SUBSCRIBE weibo  订阅weibo一个频道,subscribe 
    
    PSUBSCRIBE * 一次性订阅多个频道(广告类)
    PSUBSCRIBE it.* 一次性订阅多个和it相关的频道
    退出就取消订阅了

七、redis的事务管理

redis使用multi开启事物
    discard  撤销
    exec UI出
    redis 中的锁机制
        mysql的悲观锁:我在做操作的时候,你别和我抢,
        redis的乐观锁:查看一下,

八、redis的一些管理命令

  Info
    Clinet list 客户端连接的状况以及对系统的使用情况
    Client kill ip:port
    config get *
    CONFIG RESETSTAT 重置统计
    CONFIG GET/SET 动态修改
    Dbsize
    FLUSHALL 清空所有数据
    select 1
    FLUSHDB 清空当前库
    MONITOR 监控实时指令

九、主从复制 

假如说你访问redis呢,访问不了呢,数据查看不了了,怎么办?    
        我们要做到一个恢复的功能,所以就有了主从复制的功能
        假如说一个机器废了,还有另一个机器能提供数据
        至少要有两台服务器
    主从复制的两种功能
        1、可以实现故障的转移 failover 
        2、可以分担多节点的压力 blance
    底层原理依赖于
        同步传输rbd存储的机制
    怎么搭建主从?
        准备2台或以上的redis实例
            1、多配置文件(端口、数据路径、日志路径、pid)
               端口、:6380(主),6381(从)
               数据路径:
                    /application/data/6380
                    /application/data/6381
               日志路径
                    /var/log/redis6380.log
                    /var/log/redis6381.log
               pid :记录一个程序进程号的id    
                    /application/data/6380/redis.pid
                    /application/data/6381/redis.pid
            2、主从复制的配置过程
                1、创建目录
                    mkdir -p /application/data/6380
                    mkdir -p /application/data/6381
                2、配置文件准备
                    vim  /application/data/6380/redis.conf
                    port 6380
                    daemonize yes
                    pidfile /application/data/6380/redis.pid
                    logfile "/var/log/redis6380.log"
                    dbfilename dump.rdb
                    dir /application/data/6380

                    vim /application/data/6381/redis.conf
                    port 6381
                    daemonize yes
                    pidfile /application/data/6381/redis.pid
                    logfile "/var/log/redis6381.log"
                    dbfilename dump.rdb
                    dir /application/data/6381
            3、启动两个实例
                redis-server /application/data/6380/redis.conf
                redis-server /application/data/6381/redis.conf

            4、构建主从
                redis-cli -p 6381
                slaveof 127.0.0.1 6380
            5、验证主从
                登录主库:
                redis-cli -p 6380

                set foo bar
                登录主库:
                redis-cli -p 6381
                get

            6、主从复制状态查看。
                role
                info replication

            7、主从复制,手工切换
                slaveof no one
        
传统主从的缺陷
1、没有自动监控机制
2、没有自动切换的功能
3、对于应用不透明

sentinel 功能
1、自动监控redis所有节点状态
2、发现主库故障,自动选主切换
3、自动通知应用端


准备,1主2从结构比较合适。
添加6382节点:
mkdir -p /application/data/6382

vim  /application/data/6382/redis.conf

port 6382
daemonize yes
pidfile /application/data/6382/redis.pid
logfile "/var/log/redis6382.log"
dbfilename dump.rdb
dir /application/data/6382

redis-server /application/data/6382/redis.conf


redis-cli -p 6382

slaveof 127.0.0.1 6380




sentinel配置

mkdir -p /application/data/26380

vim /application/data/26380/sentinel.conf
port 26380
dir "/application/data/26380"
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 60000
sentinel config-epoch mymaster 0
启动
redis-sentinel /application/data/26380/sentinel.conf

十、Python sentinel

>>> from redis.sentinel import Sentinel  
>>> sentinel = Sentinel([('127.0.0.1', 26380)], socket_timeout=0.1)  
>>> sentinel.discover_master('mymaster')  
('127.0.0.1', 6379)  
>>> sentinel.discover_slaves('mymaster')  
[('127.0.0.1', 6380)]  
>>> master = sentinel.master_for('mymaster', socket_timeout=0.1)  
>>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1)  
>>> master.set('foo', 'bar')  
>>> slave.get('foo')  
'bar'

 

posted on 2018-03-17 23:25  海燕。  阅读(882)  评论(0编辑  收藏  举报