zoukankan      html  css  js  c++  java
  • Redis基础

    1、Redis功能介绍

    数据类型丰富    
    支持持久化      
    多种内存分配及回收策略
    支持弱事务			  
    支持高可用                     
    支持分布式分片集群   
    

    2、企业缓存产品介绍

    Memcached:
    优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash
    多核结构、多线程读写性能高。
    缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高
    Redis:	优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
    缺点:多线程读写较Memcached慢
    新浪、京东、直播类平台、网页游戏
    
    memcache  与redis在读写性能的对比
    memcached 适合,多用户访问,每个用户少量的rw
    redis     适合,少用户访问,每个用户大量rw	
    			
    Tair:
    优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存。
    	缺点:单机情况下,读写性能较其他两种产品较慢
    

    3、Redis使用场景介绍

    Memcached:多核的缓存服务,更加适合于多用户并发访问次数较少的应用场景
    Redis:单核的缓存服务,单节点情况下,更加适合于少量用户,多次访问的应用场景。
    Redis一般是单机多实例架构,配合redis集群出现。
    

    4、Redis安装部署:

    下载:
    wget http://download.redis.io/releases/redis-3.2.12.tar.gz
    解压:
    上传至 /data
    tar xzf redis-3.2.12.tar.gz
    mv redis-3.2.12 redis
    
    安装:
    yum -y install gcc automake autoconf libtool make
    cd redis
    make
    
    环境变量:
    vim /etc/profile 
    export PATH=/data/redis/src:$PATH
    source /etc/profile 
    
    启动:
    redis-server & 
    
    连接测试:
    redis-cli 
    127.0.0.1:6379> set num 10
    OK
    127.0.0.1:6379> get num
    10
    

    5、Redis基本管理操作

    5.1基础配置文件介绍

    mkdir /data/6379
    cat > /data/6379/redis.conf<<EOF
    daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    dbfilename dump.rdb
    EOF
    
    redis-cli shutdown 
    redis-server /data/6379/redis.conf 
    netstat -lnp|grep 63
    
    +++++++++++配置文件说明++++++++++++++
    redis.conf
    是否后台运行:
    daemonize yes
    默认端口:
    port 6379
    日志文件位置
    logfile /var/log/redis.log
    持久化文件存储位置
    dir /data/6379
    RDB持久化数据文件:
    dbfilename dump.rdb
    ++++++++++++++++++++++++++++++++++++++
    redis-cli
    127.0.0.1:6379> set name zhangsan 
    OK
    127.0.0.1:6379> get name
    "zhangsan"
    

    5.2 redis安全配置

    redis默认开启了保护模式,只允许本地回环地址登录并访问数据库。
    禁止protected-mode
    protected-mode yes/no (保护模式,是否只允许本地访问)
    
    (1)Bind :指定IP进行监听
    vim /data/6379/redis.conf
    bind 10.0.0.51  127.0.0.1
    
    (2)增加requirepass  {password}
    vim /data/6379/redis.conf
    requirepass 123456
    
    
    ----------验证-----
    方法一:
    [root@db03 ~]# redis-cli -a 123456
    127.0.0.1:6379> set name zhangsan 
    OK
    127.0.0.1:6379> exit
    方法二:
    [root@db03 ~]# redis-cli
    127.0.0.1:6379> auth 123456
    OK
    127.0.0.1:6379> set a b
    [root@db01 src]# redis-cli -a 123 -h 10.0.0.51 -p 6379
    10.0.0.51:6379> set b 2
    OK
    

    5.3 在线查看和修改配置

    CONFIG GET *
    CONFIG GET requirepass
    CONFIG GET r*
    CONFIG SET requirepass 123
    

    5.4 redis持久化(内存数据保存到磁盘)

    RDB、AOF
    
    RDB 持久化
    	可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot)。
        优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。
        缺点:会有数据丢失
    rdb持久化核心配置参数:
    vim /data/6379/redis.conf
    dir /data/6379
    dbfilename dump.rdb
    save 900 1
    save 300 10
    save 60 10000
    
    配置分别表示:
    900秒(15分钟)内有1个更改
    300秒(5分钟)内有10个更改
    60秒内有10000个更改
      
    AOF 持久化(append-only log file)
    	记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 
        AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
        优点:可以最大程度保证数据不丢
        缺点:日志记录量级比较大
    
    AOF持久化配置
    appendonly yes
    appendfsync always		#每次修改都持久化
    appendfsync everysec	#每秒持久化
    appendfsync no
    
    是否打开aof日志功能
    每1个命令,都立即同步到aof 
    每秒写1次
    写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.
    
    vim /data/6379/redis.conf
    appendonly yes
    appendfsync everysec 
    
    redis 持久化方式有哪些?有什么区别?
    rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
    aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog
    
    
    

    6、Redis数据类型:

    ## 6.1 介绍
    String :      字符类型
    Hash:         字典类型
    List:         列表     
    Set:          集合 
    Sorted set:   有序集合
    

    6.2 KEY的通用操作

    KEYS * 	 ‘keys a  keys a*’	查看已存在所有键的名字   ****
    TYPE						返回键所存储值的类型     ****
    EXPIRE PEXPIRE 			以秒毫秒设定生存时间    ***
    TTL PTTL 					以秒毫秒为单位返回生存时间 ***
    PERSIST 					取消生存时间设置            ***
    DEL							删除一个key
    EXISTS 				        检查是否存在
    RENAME 				        变更KEY名
    
    ---例子:
    127.0.0.1:6379> set name zhangsan 
    127.0.0.1:6379> EXPIRE name 60
    (integer) 1
    127.0.0.1:6379> ttl name
    (integer) 57
    127.0.0.1:6379> set a b ex 60
    OK
    127.0.0.1:6379> ttl a
    127.0.0.1:6379> PERSIST a
    (integer) 1
    127.0.0.1:6379> ttl a
    (integer) -1
    

    6.3 Strings

    应用场景
    session 共享
    常规计数:微博数,粉丝数,订阅、礼物
    key:value
    (1)
     set name zhangsan 	
    (2)
     MSET id 101 name zhangsan age 20 gender m
     等价于以下操作:
     SET id 101 
     set name zhangsan 
     set age 20 
     set gender m
    (3)计数器
    每点一次关注,都执行以下命令一次
    127.0.0.1:6379> incr num
    显示粉丝数量:
    127.0.0.1:6379> get num
    取消关注一次
    127.0.0.1:6379> decr num
    
    
    暗箱操作:
    127.0.0.1:6379> INCRBY num 10000
    (integer) 10006
    127.0.0.1:6379> get num
    "10006"
    127.0.0.1:6379> DECRBY num 10000
    (integer) 6
    127.0.0.1:6379> get num
    "6"
    
    

    6.4 hash类型(字典类型)

    应用场景:
    存储部分变更的数据,如用户信息等。
    最接近mysql表结构的一种类型
    主要是可以做数据库缓存。
    
    存数据:
    hmset stu  id 101 name zhangsan age 20 gender m
    hmset stu1 id 102 name zhangsan1 age 21 gender f
    
    127.0.0.1:6379> hgetall stu		#查看stu所有的数据
    
    
    取数据:
    HMGET stu id name age gender
    HMGET stu1 id name age gender
    
    MySQL数据导入到Redis中存储
    select concat("hmset city_",id," id ",id," name ",name) from world.city limit 10 into outfile '/tmp/hmset.txt'
    
    

    6.5 LIST(列表)

    应用场景
    消息队列系统
    比如sina微博
    在Redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。
    但是做了限制不能超过5000个ID,因此获取ID的函数会一直询问Redis。
    只有在start/count参数超出了这个范围的时候,才需要去访问数据库。
    系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。
    SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发,
    而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
    
    微信朋友圈:
     LPUSH wechat "today is 1 !"
     LPUSH wechat "today is 2 !"
     LPUSH wechat "today is 3 !"
     LPUSH wechat "today is 4 !"
     LPUSH wechat "today is 5 !"
    
    [5,4,3,2,1]
     0 1 2 3 4 
    
    [e,d,c,b,a]
    0 1 2 3  4
    
    127.0.0.1:6379> lrange wechat  0 0
    1) "today is friday !"
    127.0.0.1:6379> lrange wechat  0 1
    1) "today is friday !"
    2) "today is rainy  day !"
    127.0.0.1:6379> lrange wechat  0 2
    1) "today is friday !"
    2) "today is rainy  day !"
    3) "today is good  day !"
    127.0.0.1:6379> lrange wechat  0 3
    127.0.0.1:6379> lrange wechat  -2 -1
    1) "today is bad day !"
    2) "today is nice day !"
    
    

    6.6 SET 集合类型(join union)

    应用场景:
    案例:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
    Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,
    对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
    
    127.0.0.1:6379> sadd lxl pg1 jnl baoqiang gsy alexsb
    (integer) 5
    127.0.0.1:6379> sadd jnl baoqiang ms bbh yf wxg
    (integer) 5
    ....
    #并集
    127.0.0.1:6379> SUNION lxl jnl
    1) "baoqiang"
    2) "yf"
    3) "bbh"
    4) "ms"
    5) "wxg"
    127.0.0.1:6379> SUNION lxl  jnl
    1) "gsy"
    2) "yf"
    3) "alexsb"
    4) "bbh"
    5) "jnl"
    6) "pg1"
    7) "baoqiang"
    8) "ms"
    9) "wxg"
    127.0.0.1:6379> 
    	
    ......
    #交集
    127.0.0.1:6379> SINTER lxl jnl
    1) "baoqiang"
    
    ........
    
    #差集
    127.0.0.1:6379> SDIFF jnl lxl
    1) "wxg"
    2) "yf"
    3) "bbh"
    4) "ms"
    127.0.0.1:6379> 
    127.0.0.1:6379> SDIFF lxl jnl
    1) "jnl"
    2) "pg1"
    3) "gsy"
    4) "alexsb"
    .....
    
    

    6.7 SortedSet(有序集合)

    应用场景:
    排行榜应用,取TOP N操作
    这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,
    这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
    
    127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg 
    (integer) 6
    127.0.0.1:6379> ZINCRBY topN 100000 smlt
    "100000"
    127.0.0.1:6379> ZINCRBY topN 10000 fskl
    "10000"
    127.0.0.1:6379> ZINCRBY topN 1000000 fshkl
    "1000000"
    127.0.0.1:6379> ZINCRBY topN 100 lzlsfs
    "100"
    127.0.0.1:6379> ZINCRBY topN 10 wdhbx
    "10"
    127.0.0.1:6379> ZINCRBY topN 100000000 wxg
    "100000000"
    
    127.0.0.1:6379> ZREVRANGE topN 0 2 
    1) "wxg"
    2) "fshkl"
    3) "smlt"
    127.0.0.1:6379> ZREVRANGE topN 0 2 withscores
    1) "wxg"
    2) "100000000"
    3) "fshkl"
    4) "1000000"
    5) "smlt"
    6) "100000"
    
    
    

    7、Redis事务

    redis的事务是基于队列实现的。
    mysql的事务是基于事务日志和锁机制实现的。
    redis是乐观锁机制。
    
    开启事务功能时(multi)
    multi 
    command1      
    command2
    command3
    command4
    exec 
    discard
    
    4条语句作为一个组,并没有真正执行,而是被放入同一队列中。
    如果,这是执行discard,会直接丢弃队列中所有的命令,而不是做回滚。
    exec
    当执行exec时,对列中所有操作,要么全成功要么全失败
    
    127.0.0.1:6379> set a b
    OK
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> set a b
    QUEUED
    127.0.0.1:6379> set c d
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) OK
    

    8、redis(Master-Replicaset)

    8.1 原理:

    1. 副本库通过slaveof 10.0.0.51 6379命令,连接主库,并发送SYNC给主库 
    2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库
    3. 副本库接收后会应用RDB快照
    4. 主库会陆续将中间产生的新的操作,保存并发送给副本库
    5. 到此,我们主复制集就正常工作了
    6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.
    7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在.
    8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库
    9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的
    

    8.2 主从数据一致性保证

    min-slaves-to-write 1
    min-slaves-max-lag  3
    

    8.3 主库是否要开启持久化?

    如果不开有可能,主库重启操作,造成所有主从数据丢失!
    
    

    9. 主从复制实现

    1、环境:
    准备两个或两个以上redis实例
    
    mkdir /data/638{0..2}
    
    配置文件示例:
    cat >> /data/6380/redis.conf <<EOF
    port 6380
    daemonize yes
    pidfile /data/6380/redis.pid
    loglevel notice
    logfile "/data/6380/redis.log"
    dbfilename dump.rdb
    dir /data/6380
    requirepass 123
    masterauth 123
    EOF
    
    
    cat >>   /data/6381/redis.conf <<EOF
    port 6381
    daemonize yes
    pidfile /data/6381/redis.pid
    loglevel notice
    logfile "/data/6381/redis.log"
    dbfilename dump.rdb
    dir /data/6381
    requirepass 123
    masterauth 123
    EOF
    
    
    cat >>   /data/6382/redis.conf <<EOF
    port 6382
    daemonize yes
    pidfile /data/6382/redis.pid
    loglevel notice
    logfile "/data/6382/redis.log"
    dbfilename dump.rdb
    dir /data/6382
    requirepass 123
    masterauth 123
    EOF
    
    
    启动:
    redis-server /data/6380/redis.conf
    redis-server /data/6381/redis.conf
    redis-server /data/6382/redis.conf
    
    主节点:6380
    从节点:6381、6382
    
    2、开启主从:
    6381/6382命令行:
    
    redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
    redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380
    
    
    3、查询主从状态
     redis-cli -p 6380 -a 123 info replication
    
    
    
    

    10 redis-sentinel(哨兵)

    1、监控
    2、自动选主,切换(6381 slaveof no one)
       采用的是raft分布式一致性协议进行选主:数据节接近主,可以和大部分节点联系,少数服从多数。
    3、重构主从管理
    4、应用透明 
    5、自动处理故障节点
    
    
    sentinel搭建过程
    mkdir /data/26380
    
    cd /data/26380
    
    vim sentinel.conf
    port 26380
    dir "/data/26380"
    sentinel monitor mymaster 127.0.0.1 6380 1
    sentinel down-after-milliseconds mymaster 5000
    sentinel auth-pass mymaster 123 
    
    启动:
    [root@db01 26380]# redis-sentinel /data/26380/sentinel.conf  &>/tmp/sentinel.log &
    
    ==============================	
    
  • 相关阅读:
    点击链接,取得href的值,但是不转向
    启动和停止MySQL服务
    QuickText for Notepad++
    otepad++ 配置 支持jquery、html、css、javascript、php代码提示
    windows 2008+IIS7+Mysql+PHP5.5 + FastCGI环境配置
    Jquery异步请求数据实例代码
    JS读取本地文件及目录的方法
    c#.net从ftp下载文件到本地
    怎样才能充分利用SQL索引
    jQuery EasyUI Datagrid性能优化专题
  • 原文地址:https://www.cnblogs.com/remixnameless/p/13503822.html
Copyright © 2011-2022 走看看