美文网首页
Redis基础学习

Redis基础学习

作者: 曦夫 | 来源:发表于2018-11-06 16:56 被阅读0次

    1.redis注意点

    • redis是单进程的
    • 默认有16个数据库,编号为0-15
    • 进入相应数据库:
    select num
    
    • 查看数据库的key数量:
    dbsize 或者 keys*
    
    • 删除当前库&删除所有库:
    flushdb & flushall
    

    2.redis数据类型

    五大数据类型: String Hash List Set Zset

    2.1.key操作

    • 判断key存在操作:不存在,返回0;存在,返回1

    exists key

    • 移动key到其他库

    move key db

    • 为给定的key设置过期时间

    expire key 秒数

    • 查看还有多少秒过期,-1为永不过期,-2为已过期

    ttl key

    • 查看key的数据类型

    type key

    • 删除key

    del key


    2.2.String类型

    • 设置/获取/删除/添加/查看长度

    set/get/del/append/strlen key (value)

    • 值为数字进行加减incr/incrby/decr/decrby

    incr/decr key:每次加减1
    incrby/decrby key num:每次加减num

    • 获取一个value指定区间范围的值,(between....and),其中从零到负一代表全部

    getrange key num(start) num(end)

    • setrange key num XXX 设置key所对value值从第num位开始变为XXX

    setrange key num XXX

    • 设置某一个有效时间的key(setex:set with expire)

    setex key 有效时间 value

    • 如果不存在该key则设置为该value(setnx:set if not exist)

    setnx key value

    • 同时设置/获取N个key-value

    mset/msetnx key1 value1 key2 value2 ...
    mget key1 key2 key3 ...


    2.3.List列表操作

    • 正序插入(最后插入的放栈底)/倒序插入(最后插入的放栈顶)/获取list范围的值(其中从0到-1代表全部)

    rpush/lpush list(key) value1 value2 ...
    lrange list(key) num(start) num(end)

    • 弹出栈顶/栈底的值

    lpop/rpop list(key)

    • 按照索引下标获取元素,index范围:[0-(length-1)]

    lindex list(key) index

    • lren key 删除N个相同的value

    lren list(key) num value

    • 截取指定范围值再赋值给该key,index范围:[0-(length-1)]

    ltrim key index(start) index(end)

    • 将源列表栈底元素插入到目的列表的栈顶

    rpoplpush list1(源) list2(目的)

    • 替换list中某下标的值,index范围:[0-(length-1)]

    lset key index value

    • 将某值(value1)插入到list中某值(value)的前/后

    linsert list(key) brfore value value1
    linsert list(key) after value value1


    2.4.Set集合操作

    • 设置/获取/该value是否为该集合的值(返回结果 0:不是,1:是)

    sadd key value1 value2 ...
    smembers key
    sismember key value

    • 获取集合中元素个数

    scard key

    • 删除集合中的元素

    srem key value

    • 随机获取集合中num个元素

    srandmember key num

    • 随机出栈

    spop key

    • 将set1集合中的元素value移动到set2

    smove set1 set2 value

    • 数学结合类操作
    • 差集:获取在第一个集合(set1)中,不在第二个集合(set2)中的元素

    sdiff set1 set2

    • 交集:同时在第一个集合(set1)和第二个集合(set2)中

    sinter set1 set2

    • 并集:第一个集合(set1)和第二个集合(set2)中所有的元素(去重)

    sunion set1 set2


    2.5.Hash哈希操作(KV模式不变,但V是一个键值对)

    • 设置/获取/设置多个/获取多个/删除V hash1元素

    hset hash1 id idval
    hget hash1 id
    hmget hash1 id idval name nameval age ageval
    hmget hash1 id name age
    hgetall hash1
    hdel hash1 id(或name ...)

    • 获取hash1元素个数

    hlen hash1

    • 判读hash1中某个key是否存在(0:不存在 1:存在)

    hexists hash1 key

    • 获取hash1的所有的key/value

    hkeys hash1
    hvals hash1

    • 为hash1中的key的value增加num(整数/小数)

    增加整数:hincrby hash1 key num(int)
    增加小数:hincrbyfloat hash1 key num(float)

    • hash1中不存在该key时才会创建(0:失败,1:成功)

    hsetnx hash1 key value


    2.6.Zset有序集合操作

    在set基础上。加了一个score值
    之前set是k1 v1 v2 v3 ...
    现在zset是k1 score1 v1 score2 v2 ...

    • 设置添加

    zadd zset1 score1 v1 score2 v2

    • 根据value下标值获取值得范围:(num:value下标值;withscores:带score值输出)

    zrange zset1 0 -1
    zrange zset1 0 -1 withscores
    zrange zset1 num(start) num(end)

    • 获取score的范围

    zrevrangebyscore zset1 start end
     score范围:start <= value <= end
    zrevrangebyscore zset1(start (end
     范围:start < value < end
    zrevrangebyscore zset1 start end limit 2 3
     从结果中第二个开始截取3个返回

    • 删除zset1某个元素(该元素的score一块删除)

    zrem zset1 v1

    • 获取zset1的元素数量

    zcard zset1

    • 根据score的范围获取value对应的下标值

    zcount zset1 score1 score2

    • 根据value值获取下标

    zrank zset v1

    • 根据zset1 的value值获取对应的score值

    zscore zset1 v1

    • 逆序(倒序)获取value下标值:将值倒序排列,获取其下标值

    zrevrank zset1 v3

    • 根据范围正序/逆序获取value值

    zrange zset1 0 -1
    zrevrange zset1 0 -1

    • 逆序根据score获取value

    zrevrangebyscore zset1 score2 score1


    3.redis配置文件

    • Units单位

    1.配置文件单位,开头定义一些基本的度量单位,只支持bytes,不支持bit
    2.不区分大小写

    • includes部分

    include包含:redis.conf作为一个总闸,包含其他redis配置文件

    • general部分
    • snapshotting快照

    1.save:可以直接手动备份
    2.stop-writes-on-bgsave-error:当后台保存出错时,前台停止再写入。
    3.rdbccompression:对磁盘中的快照,是否进行压缩存储,若yes,则使用LZF算法进行压缩
    4.rdbchecksum:存储快照后,使用CRC64算法检验数据
    5.dbfilename:默认保存的文件名
    6.dir:保存路径

    • security部分

    设置密码/操作有密码权限的redis
    config set requirepass password
    auth password

    • redis启动路径

    config get dir

    • limits限制
    1. maxClients 10000:默认可连接的最大客户端数量
    2. maxmemory:最大的内存
    3. maxmemory-policy:最大内存策略
      可选值:
      volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放
      allkeys-lru:从数据集中(包括设置和未设置过期时间的),选择最近醉酒未使用的数据释放
      volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放
      allkeys-random:从数据集中(包括设置和未设置过期时间的),随机选择一个数据进行释放
      volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放
      noeviction:不删除任何数据(redis还会根据引用计算器进行释放),若内存不够时,直接返回错误
      LRU算法:
      最近最久未使用算法,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对象,释放这些对象占用的空间,LRU算法就提供了一种策略,选择最近一段时间内,最久未使用的对象将其淘汰。
    4. maxmemory-samples:设置样本的数量,进行测试。redis会默认检查这么多个key并选择其中的LRU的那个。
    • APPEND ONLY MODE

    1.appendonly:默认为no,yes开启aof的持久化
    2.appendfilename:默认保存的文件名
    3.appendfsync:储存方式(策略)
      always:数据持久化,每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好。
      everysec:默认设置,异步操作,每秒记录,如果一秒内宕机,有数据丢失
      no:不记录
    4.no-appendfsync-on-rewrite:重写时是允许appendfsync,默认no,保证数据安全性
    5.auto-aof-rewrite-percentage:当前aof文件比上次重写的增长比例大小,默认一倍
    6.auto-aof-rewrite-min-size:最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小).此变量仅初始化启动redis有效.如果是redis恢复时,则lastSize等于初始aof文件大小.


    4.redis持久化(Redis Persistence)

    • rdb(Redis DataBase)

    1.在指定时间间隔内,将内存中的数据集写入本地磁盘
    2.redis单独创建(fork)一个子进程进行持久化,会先写入到一个临时文件,待持久化结束后,再替换原来的源持久化文件。
    3.恢复Snapshot快照,将数据集从磁盘读回内存
    4.rdb保存的是dump.rdb文件
    5.当redis执行关闭shutdown或flushall时,会迅速截断,生成dump.rdb文件,但是由于内存已经清空,所以保存的dump.rdb为空文件。
    6.可以使用save命令自动备份。
    7.如何恢复:将备份文件移动到redis安装目录并启动服务即可,config get dir 获取目录

    • aof(Append Only File)

    1.以日志的形式记录每个写操作,将redis执行过的所有写指令记录下来,只许追加文件但不可以改写文件,redis启动之初会读取文件重构数据。即根据日志文件的内容将写指令全部执行一遍以完成数据恢复工作。
    2.aof保存的是appendonly.aof
    3.异常恢复:redis-check-aof --fix进行修复,之后重启
    4.rewrite:aof会采取文件追加,文件会越来越大,避免出现如此,新增重写机制,当aof文件大小超过设计阈值,redis会启用aof文件内容压缩,只保留可恢复数据的最小值指令集,可以使用命令bgrewriteaof
    5.redis会记录上次重写时aof大小,默认配置是当aof文件是上次重写后大小的一倍且文件大于64M时触发
    6.aof运行效率慢于rdb;aof村粗配置灵活

    • 总结&使用

    1.rdb持久化方式是指定的时间间隔对你的数据快照存储
    2.aof持久化是记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始数据,aof命令以redis协议追加保存每次系的操作到文件末尾。redis还能对aof文件进行后台重写,使aof文件不至于体积过大。
    3.只做缓存使用:若仅当数据在服务器运行的时候存在,可以不使用任何持久化方式。


    5.redis事务

    • 事务

    一次执行多个命令,一个事务中所有的命令都会序列化,按顺序串行的执行而不被其他命令插入。

    • 作用

    一个队列中,一次性、顺序性、排他性的执行一系列命令。

    • 使用

    1.diacard:取消事务,放弃执行事务块内的所有命令。
    2.exec:执行所有事务块内的命令。
    3.multi:标志一个事务的开始。
    4.unwatch:取消watch命令对所有key的监视。
    5.watch:监视一个(或多个)key,若执行事务前,key值被其他命令所改动,事务被打断
      乐观锁:锁每条记录,为每条记录添加版本号,当只有修改数据冲突时,才需要重新去服务器拿被修改最新版本数据重新修改。
      悲观锁:在数据被使用的时候,不允许其他人再使用。直至锁解除。
      CAS:比较和替换,基于乐观锁锁的操作
    watch指令,在事务提交时,若key值已经被改变,整个事务队列不会被执行。
    通过watch命令在事务执行之前监控多个keys,若在watch之后有任何key发生变化,exec命令执行事务都会被放弃,同时返回nullmuliti-bulk应答事务执行失败。

    • 事务创立过程

    1.监控:以watch keys 监控事务上锁,keys为即将执行的操作的数据
    2.开启:以milti开始一个事务
    3.入队:将多个命令入队事务中,接到命令后不会立即执行,而是放入等待执行的事务队列中。
    4.执行:由exec命令触发事务

    • 特性:

    不保证原子性,支持部分事务。

    6.redis消息订阅

    • 是什么

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

    7.redis的复制机制(master/stave)

    • 是什么

    即是主从复制,主机更新后根据配置和策略,自动同步到备份的master/slaver机制,master以写为主,slave以读为主。

    • 作用

    主从复制,容灾恢复

    • 怎么做

    1.配置从库不配置主库
    2.从库配置:slaveof 主库IP 主库端口
    3.每次与master断开之后,都需要重新连接,除非配置redis.conf
    4.修改配置文件
     拷贝多个配置文件redis.conf
     info replication:查看配置
     slaveof no one:当前数据库停止与其他数据库的同步,转成主数据库

    • 用法

    一主二仆:
    1.主机可写,从机不可写,只读(读写分离)。
    2.主机挂掉,从机待命
    3.主机恢复,从机照旧
    4.从机挂掉,需要重连主机
    薪火相传:
    主机接从机,从机后继续连接从机
    反客为主:
    主机挂掉,使用命令slaveof no one,变从机为主机(从机后接有从机)

    • 复制原理

    1.slave启动成功连接到master后,会发送一个sync命令。
    2.master接到命令后启动后台的存盘进程,同时手机所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以便完成一次完全同步。
    3.全量复制:当slave服务在接受到数据库文件数据后,将其存盘并加载到内存中。
    4.增量复制:master继续将新的所有手机到的修改命令依次传给slave,完成同步。
    5.但只要重新连接master,一次完全同步(全量复制)将自动执行。

    • 哨兵模式(反客为主的自动版)
    • 是什么

    在后台监控主机是否故障,如果故障了根据投票数自动将从库转换成主库。

    • 操作步骤:

    1.调整结构为一主二仆
    2.自定义的/myredis目录下新建文件:sentinel.conf,名字不能错
    3.配置哨兵,在sentinel.conf文件中添加:
     ①:sentinel moniter 被监控主机名(自定义) 主机IP 端口号 1
     ②:数字1表示当主机挂掉后,salve投票,看谁的票数多,谁接替主机。
    4.启动哨兵:redis-sentinel /usr/local/myredis/sentinel.conf(全路径地址)
    5.当主机A挂掉,从机中选出从机B为主机B,当原主机A再次启动后,哨兵将其加为主机B的从机。

    6.一组sentinel能同时监控多个master

    • 复制缺点

    1.复制延迟:由于所有的写操作都在master上,然后同步到slave,所以从master同步到slave机器有一定延迟,当系统很繁忙的时候,延迟更严重。

    相关文章

      网友评论

          本文标题:Redis基础学习

          本文链接:https://www.haomeiwen.com/subject/jxwuxqtx.html