Redis学习总结

一,Redis的作用

    1.内存存储和持久化

     Redis支持异步将内存中的数据些到磁盘上,同时不影响继续服务取最新N个数据的操作。

    2.模拟类似HttpSession这种需要设置过期时间的功能

    3.发布、订阅消息系统

    4.定时器、计数器

二,Redis的安装

    1.下载Redis

     wget http://download.redis.io/releases/redis-2.8.3.tar.gz

    2.解压Redis

     tar -zxvf redis文件

    3.进入解压后Redis目录

    4.输入make命令进行安装

     如果安装出现gcc错误,请安装gcc。

     能上网:输入yum install gcc-c++。

     不能上网:https://jingyan.baidu.com/article/d2b1d102af38ab5c7e37d4e3.html参考

    5.安装成功后会出现一句It's a good idea to run ‘make test’。这个可以不用管。

     因为会安装TCL一些东西,费时间。

     安装好后,文件在usr/local/bin下

    482527c4e8f6183dd6ecfe552cd78fffa09.jpg

三,Redis启动

    1.创建一个myredis文件夹

    2.将/opt/redis-4.0.6目录下的redis.conf文件复制到myredis文件夹中

    3.使用vim命令修改复制过来的redis配置文件

    将daemonize 修改为yes

    6f80b940827d2935bcb3ba47a5c9879e85f.jpg

    4.启动redis(使用myredis中的配置文件)

    5686d4af500cc72b7b3ac9d1ba876ff09a5.jpg

    在使用远程连接的时候可以使用redis-cli -h ip地址(记的在配置文件中将bind 127.0.0.1注释,同时将protected-mode yes改为protected-mode no)

    默认端口是6379,当然也可以在配置文件中修改。

    5.判断redis服务是否启动使用ping命令

    94225d5db5b60399360f15e9a66e3bc02a9.jpg

    出现pong则OK。

    6.简单键值对

    faca27334e0c30a40090e9271581cd9e7e1.jpg

    7.关闭使用shutdown

    abdaa530a863ba776fd94c4eb964c46d135.jpg

四,数据类型常用命令

   1.key

   1).keys * :查看所有的key

    e717552d9cfd59651f30ae917b0c0a2fcf2.jpg

    2).exists key :查看某个key是否存在

    58917f453bdac625c5e6e8921c6c370be85.jpg

    3).move key db :将key移动到db,当前库移除

    ad35ac27afb2166ff412c92affd9fd3546e.jpg

    4).expire key 秒 :为给定的key设置过期时间

    5).ttl key :查看还有多少秒过期,-1表示永不过期,-2表示已经过期(过期后无法获取)

    0fd1ffd426456cfaf9da2a24ef11ce33b25.jpg

    6).type key :查看key的类型

    8240cc66a1d2d14d09ad9cb5bdbd9df897d.jpg

    2.String

    string是Redis最基本的类型,一个key对应一个value。也是二进制安全的,一个Redis中字符串value最多可以是512M。

    1).set key value :添加一个string类型

    2).get key :获得key对应的value

    f6579afc5834ee73218342165f9468afb91.jpg

    3).append key string :key对应的value后添加string

   c72ad3f74cd044d5f6af209b0a99d29802f.jpg

    4).strlen key :获取key对应value的长度

    3fbd9a403c038ae14eaa703f65adc75a1d6.jpg

    5).incr/decr/incrby/decrby :一定要是数字才行

    9a55be7475c6aa859c4ce9df8cdf52a5835.jpg

    8bbffebc4f8f266e703d700237142775070.jpg

    6).getrange key start end :获取指定区间的值

    0到-1表示全部

    2c8b1e2fb3907dad721dddd5c03ba6111c3.jpg

    7).setrange key offset value :从offset位置覆盖value的值

    c47db039942c3bfb1cf397e6711923615c9.jpg

    8).setex key 秒 value :设置key-value并设置key的过期时间

    a736b99e1b3a62e8431d0a9a87f38153392.jpg

    9).setnx key value :如果不存在key,则添加key-value,反之不添加。

    298da39cca3d5bc4e5d52aa2560ff7d6351.jpg

    10).mset/mget/msetnx:m代表more的意思,这里就是批量添加

    9c30b547a956cc3cd1db0a9a9cb5b906928.jpg

    如果使用msetnx时只有部分的key在Redis中不存在,那么这个语句将执行失败

   3.List

    1).lpush/rpush/lrange

    lpush从左边插入数据,rpush从右边插入数据,lrange查看list元素(用下标)。

    fa4653a8f2c0f009f3cf470a37c90a4ef15.jpg

    2).lpop/rpop

    lpop从左边弹出数据,rpop从右边弹出数据。

    d49c9e84f6b71623f936a7661c797f3a064.jpg

    3).lindex

    按照索引下标获得元素

    f569130af8776f0e965138bef152c36dbce.jpg

    4).llen 获取list的长度

    5).lrem key count value 删除count个value

    9c0e1cc8fbe4b594c276a3755c6bee59e13.jpg

    94cbde0d77609f3dd80ddb4ee468a95e480.jpg

    6).ltrim key start end 截取下标的元素覆盖key的数据

    3263b7a3f8511da5b667e68aeb7a2608810.jpg

    7).rpoplpush key1 key2 key1右出key2左进

    92225a6546895f1ad0839cfce7ecdcc7e3c.jpg

    8).lset key index value 修改key的index下标值为value

    9).linsert key before/after value1 value2 在value1的前面或者后面插入value2

    d1905586c393107919b204d9a2e4cfe1f97.jpg

    4.set

    1).sadd/smembers/sismember 添加元素/查询所有元素/查询是否存在某元素

    302ee7fbf95e024f7a388f1e6a3294d4c2c.jpg

    添加重复的会被删除

    2).scard 获取set中有多少个元素

    3).srem key value 删除set中的元素

    4).srandmember key count 从key的集合中随机出count个数

    个数不够就出集合的所有元素

    52ce14dc674c0bf0ed31003571f1cc7912e.jpg

    5).spop key 随机出栈

    6).smove key1 key2 key1中的值

     将key1中的值移到key2的集合中

    bd815dc61425e39aaeaf7f7182241afd061.jpg

    7).数学集合:sdiff(差集)sinter(交集)sunion(并集)

    807c38401a22a5e447df03b7518498af435.jpg

    940e865f5d227600ab93af55bd64f0c07a5.jpg

    5.Hash

    1)hset/hget/hmset/hmget/hgetall/hdel

    hset:添加元素。

    hget:获取元素。

    hmset:添加多个元素。

    hmget:获取多个元素。

    hgetall:获取全部元素。

    hdel:删除元素。

    a27d3a2c1634bfd19cd71314d5ee3582f7d.jpg

    450a1b7564f4a447cd663c2e2e81adc29b5.jpg

    2)hlen 获得长度

    6b2b55ab5cbdc2f4b7b5f955dd6a19e392d.jpg

    3)hexists key 判断key是否存在

    338431f66f0b3c549b7262b1ba79684a5cd.jpg

    4)hkeys/hvals hkeys获取所有key/kval获取所有values

    288a040acd379ea8072d66ce1540dff215d.jpg

    5)hincrby/hincrbyfloat 递增

    bbbbc5794687635c2a50b34efec9500130c.jpg

    6)hsetnx 不存在则添加

    a17a59366ffeeebf0ad9c131eea3073ba6f.jpg

    6.Zset

    在set的基础上加了一个score值

    1)zadd/zrange

    1224f3ac092c411600411c86dabfd12f2a0.jpg

    2)zrangebyscore(其中可以是用(表示不等,limit来实现分页)

    c0c781819ebc58adbfc0cc3892ffedba10c.jpg

    dd8c59cb07293969c3ec75dd4299286b175.jpg

    3)zrem 移除元素

    e152a56f521710508ed979d2f9a9f81c786.jpg

    4)zcard/zcount/zrank/zscore

    zrank获取下标

    zscore获取分数

    47e0bc762650546a0a73f25ba1f2744c86b.jpg

    5)zrevrank 逆序获得下标

    4a007d2b91c48114c2119227c07e16a98d0.jpg

    6)zrevrange 逆序获得元素

    ba42824e269c563f10fd64fcab07671f1fb.jpg

    7)zrevrangebyscore 与zrangebyscore相反

    241f0d5c238c8888f8fe42ea7ae361b7647.jpg

五,Redis的配置文件

    1.Redis的单位:1k与1kb是有区别的

    de1e72bb81abbaa64ffc558f3308e0fdc11.jpg

    2.include包含

    Redis配置文件也可以通过配置包含其他的Redis文件

    5c1eaffe350743d2dbc3c9518b29182dd49.jpg

    3.general通用

    daemonize yes: 开启守护进程,默认情况下是no

    pidfile: 进程管道id文件

    port 6379: 端口,默认是6379

    tcp-backlog 511: 默认是511,backlog是一个连接队列,队列的总和=未完成三次握手队列+已完成三次握手队列

    bind: ip绑定

    timeout N: 客户端空闲N秒后断开连接(0表示不关闭)

    tcp-keepalive 0: 单位为秒,如果设置为0,则不进行keepalive检测,建议设置撑60

    loglevel notice: 日志级别,包括debug,verbos,notice,warning级别依次增高

    logfile "" :日志文件,可以设置文件的路径

    syslog-enable no:系统日志是否开启,默认是被注释的

    syslog-ident reids:开启系统日志,输出信息以reids开头,默认是被注释的

    syslog-facility local0:输出日志的设备,值可以是USER或者(LOCAL0到LOCAL7),默认是被注释的

    database 16:数据库个数,默认是16

    4.SNAPSHOTTION快照(RDB)

    save 秒 写操作次数

        默认情况下:

        15分钟以内key值发生1次改变

        5分钟以内key值发生10次变化

        1分钟以内key发生10000次变化

        禁用的话设置save “”

        可以使用save,bgsave,flushall命令手动进行保存

        save:只管保存,其他不管,全部阻塞。

        gesave:redis会在后台异步进行快照操作。

        flushall:会产生dump.rdb,但是里面是空的,无意义。

    stop-writes-on-bgsave-error:当保存出错的时候,前台禁止写操作。默认是yes

    rdbcompressio:对于存储到磁盘的快照是否使用LZF算法进行压缩,默认是yes。

    rdbchecksum:在存储快照后,redis是否使用CRC64算法进行数据校验,默认是yes。这样做会增加大约10%的性能消耗(无关紧要,一般晚上进行备份)。

    dbfilemane:存储的文件名。默认dump.rdb。

    dir:文件保存位置。

    5.REPLICATION复制

    6.SECURITY安全

    访问密码的查看,设置,取消。默认是不需要的密码的,redis认为在Linux系统中已经是一个通过安全的环境下。

    config dir 查看当前运行路径

    config set requirepass设置密码

    config get requirepass获取密码

    7.LIMITS限制

    maxclients:最大连接数,默认10000

    maxmemory:最大内存

    maxmemory-policy:当达到最大内存时选择过期策略,包括volatile-lru,allkeys-lru,volatile-random,allkeys-random,volatile-ttl,noeviction。默认是noeviction

    注:LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的             数据淘汰。

  • volatile-lru:使用lru算法移除key,只对设置了过期时间的key。
  • allkeys-lru:使用lru算法移除key。
  • volatile-random:在过期集合中随机移除key,只对设置了过期时间的key。
  • allkeys-random:随机移除key。
  • volatile-ttl:移除ttl值最小的key,即最近要过期的key。
  • noeviction:不移除key,针对写操作只是返回错误信息。    

    maxmemory-samples:设置模板的数量,LRU算法和最小TTL算法都不是精确的算法,而是估算值,所以你可以设置模板的大小。

    8.APPEND ONLY MODE追加

    appendonly:是否开启aof,默认是no,开启是yes。

    appendfilename:保存的文件名,默认是appendonly.aof。

    appendfsync:   有以下三个值选择

  • always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差,但是数据完整性比较好。
  • everysec:默认推荐,异步操作,每秒记录,如果一秒内宕机有数据丢失。
  •  

    no-appendfsync-on-rewrite:重写时是否可以运行appendfsync,默认是no即可,保证数据安全性。

    auto-aof-rewrite-min-size:设置重写的基准值。

    auto-aof-rewrite-percentage:设置重写的基准值。

六,持久化

    Redis持久化的两种方式:RDB(redis database)和AOF(append only file)。

    1.RDB

    在指定的时间间隔内将内存中的数据集快照写入磁盘。(也就是snapshot快照)

    Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化结束后,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

    注意:如果rdb文件损坏出错,那么Redis将启动不起来,此时可以使用命令redis-check-rdb来修复aof文件。

    1)默认文件名:dump.rdb

    a94d90ed3d99495a874b79f2994381108c9.jpg

    2)配置RDB

    962c4b9b21e568779f6803ffb8a60b457c1.jpg

    默认情况下:

    15分钟以内key值发生1次改变

    5分钟以内key值发生10次变化

    1分钟以内key发生10000次变化

    禁用的话设置save “”

    可以使用save,bgsave,flushall命令手动进行保存

    save:只管保存,其他不管,全部阻塞。

    gesave:redis会在后台异步进行快照操作。

    flushall:会产生dump.rdb,但是里面是空的,无意义。

    3)恢复数据

    将dump.rdb文件移动到redis的安装目录并启动redis即可。

    4)优点

    适合大规模的数据恢复,对数据的完整性和一致性要求不高。

    5)缺点

    在一定时间间隔做一次备份,所以如果redis意外挂掉,就会丢失掉最后一次快照后的所有修改。(dump.rdb还没来得及记录你的操作)

    fork的时候,内存中的数据被克隆一份,大致2倍的膨胀性需要考虑。

    2.AOF

    以日志的形式记录每一个操作,将Redis所有执行过的写操作记录下来(读操作不记录),只许追加文件不允许改写文件,Redis启动的时候会读取该文件重新构建数据。

默认是关闭状态。

    注意:aof和rdb是可以共存的,优先使用aof。如果aof文件损坏出错,那么Redis将启动不起来,此时可以使用命令redis-check-aof --fix 文件名来修复aof文件。

    2fc16fb9be451ad3bdc9796a1fc246aa227.jpg

    1)默认文件名:appendonly.aof

    efa8c90eb83b2450a14a7e81438b2f17b62.jpg

    2)rewrite

    因为AOF采用文件追加的形式,文件会变得越来越大,为了避免这种情况增加了重写的机制。当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof。

    重写的原理:aof文件持续增长而过大时,会fork出一条新进程来将文件重写(先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的set语句。重写aof文件的操作并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写一个新的aof文件。

    触发的机制:Redis会记录上次重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64M时触发。

七,事务

    可以一次性执行多个命令。在一个事务中的所有命令都会序列化,按照顺序的串行执行而不会被其他命令插入,不许加塞。

    1.关于事务的命令

  1. DISCARD:取消事务,放弃执行事务块内的所有命令
  2. EXEC:执行所有事务块的命令
  3. MULTI:标记一个事务块的开始
  4. UNWATCH:取消WATCH命令对所有key的监视
  5. WATCH key[key...]:监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所修改,那么事务将被打断。

    2.正常执行事务

    4050cfeeab7e2dd7c35d06d47c3d8b1cfb3.jpg

    3.放弃事务

    6b0f845fbb3778cc3ec5f6dd2c358020d21.jpg

    4.全体一致

    b3bd3a1b78330722a9cde4aa4b6045740f5.jpg

    5.谁错找谁

    b26f28439ae54729e198b7097cd9daab684.jpg

    与上面4的区别在于,incr k1的时候是加入队列了,而getse k2在加入队列的时候就已经错误

    6.WATCH监控

    无人修改的情况

    6facda89b2275c469512f58dedd9f32745b.jpg

    有人修改的情况

    在使用WATCH命令后在新终端中修改k1

    4f198368c9397fffd3f40f513e5429104ec.jpg

    44620c81f46d3ab530bf826c367f45a45ab.jpg

    7.Redis事务的特性

  1. 单独的隔离操作:事务中所有命令都会按顺序执行,事务在执行的过程中不会被其他客户端发来的命令请求所打断。
  2. 没有隔离级别的概念:事务中的命令在没有提交(EXEC)前是不会实际运行的。因为事务提交前不会被实际执行,所有也就不存在“事务内的查询要看到事务里的更新,事务外的查询不能看到”。
  3. 不保证原子性:Redis的一个事务中,如果其中一条命令执行失败,其后的命令仍然会执行,不会回滚。

八,消息订阅

    Redis的发布订阅是进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。

    1.命令

  1. psubscribe pattern[pattern...]:订阅一个或多个频道(可以使用通配符*)
  2. pubsub subcommand[argument[argument...]]:查看订阅与发布系统状态
  3. publish channel message:将消息发布到频道上
  4. punsubscribe [pattern[pattern...]]:退订所有给定模式的频道
  5. subscribe channel[channel...]:订阅给定的一个或多个频道的消息
  6. unsubscribe [channel[channel...]]:退订给定频道

九,主从复制

    主机(master)数据更新后根据配置和策略自动同步到备机(slaver)。

    1.配置方法    

    1).命令方式: slaveof 主机ip 主机端口

    2).配置文件方式

    在配置文件中把slaveof 主机ip 主机端口添加进去。

    有一个selave no one命令可以是挡墙数据库停止与其他数据库的同步,转成主库

    2.原理

    slave启动成功连接到master后悔发送一个sync命令,master接到命令启动后台存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以完成一次完全的同步。

    全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中

    增量复制:master继续将新的所有收集到的修改命令依次传给slave,完成同步。只要是重新连接master,一次全量复制将被自动执行。

    3.主从复制的模式

    1).中心化结构

    9c8b1694d00386beaa09083ac996a2a6693.jpg

    配置3个端口

    914f6f1bf74194d3b1fd4f0d4aeed713e79.jpg

    6379端口先添加几个key,之后6380和6381设置为从机

    db0752cd5a8e30ae38149a1c6e8d568cfa7.jpg

    6379端口再添加1个key后在从机中试着查看key

    c6cc4773aadb73100dd49538d74cd26cc2f.jpg

    注意:
    1.从机中是不能写操作的。

    dafbeff8f4d71415086cd08c5daffe05e71.jpg

2.主机如果宕机,那么从机依然会保留key,但是依然是slaver的角色。

    18fc4bffa2e5448c19f5e422b08971eb1be.jpg

    3.如果主机宕机后恢复,那么依然是主机,和没有宕机一样

    4.如果从机宕机,那么使用slaveof命令将不能是其恢复成从机。如果是在配置文件中配置从机的属性,那么宕机后仍然是从机。

    2).链式结构

    592faca47efaaf3a55ea1474977797dfe6d.jpg

    86bff3cdd260218d844e20dcc79d55dcb67.jpg

    81c10b19c93415563ca27189a1ff0ec3be0.jpg

    3).哨兵模式

    如果主机宕机,那么哨兵会监控出来,那么在剩下的从机中投票选择出一个主机。
    配置哨兵模式:sentinel monitor 被监控数据库名字 ip 端口 票数

    3e7516656c2b83be04af02a8f583a7dc868.jpg

    使用redis-sentinel命令启动哨兵

    3af4a3cb43b55ad6e3736f73ba79d7c1bdc.jpg

    配置主从机

    8d8d489e59e105089400eaf8f289928c201.jpg

    接下来,主机宕机。哨兵会监控到主机宕机,并选出新的主机。

    c0aab419470156831b6224bfcbf1998a33f.jpg

    37ab6fd07e60028f6cf7de93dca402842b6.jpg

    如果此时主机重新上线,那么将会成为新主机的从机。

    106ce76166f1ed4173f866d0a7ce04959d9.jpg

转载于:https://my.oschina.net/u/2411763/blog/1941743

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值