您的位置:首页 > 数据库 > Redis

Redis基本概念、常用命令、主从复制

2020-04-01 19:07 661 查看

Redis基本理念

传统的ACID:

  1. A:原子性
  2. C:一致性
  3. I:独立性
  4. D:持久性

Redis中的CAP:

  1. C:强一致性
  2. A:可用性
  3. P:分区容错性

CAP的三进二原则

  • AP:大多数网站架构的选择
  • CP:Redis Mongodb
  • CA:传统Oracle数据库

BASE:

  • BA:基本可用
  • S:软状态
  • E:最终一致

Redis的特点

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候再次加载
  • Redis支持简单的key-value类型,还提供list,set,zset,hash等数据结构的储存
  • Redis支持数据的备份

Redis的五大数据类型

  • Sting 字符串 String类型是二进制安全的,可以保存任何数据,包括jpg或者序列化的对象
  • redis中的字符串value最大可以512m
  • Hash 哈希 类似java中的map
      redis hash是一个键值对集合
    • redis hash是一个string类型的field和value的映射表,hash特别适合用于储存对象
  • List 列表
  • Set 集合
  • Zset 有序集合
  • Redis常用命令

    Redis字符串(String):

    • exists [key]:判断某个key是否存在,如果存在则返回数量.不存在则返回0
    • move [key] [数据库序号]:将当前库中的某个key移动到目标数据库中
    • expire [key]:给指定的key设置过期时间
    • ttl [key]:查看目标key还有多长时间过期,-1表示永不过期,-2表示已经过期.单位为秒
    • keys * :查看当前库中的所有key,可以使用通配符
    • type [key]:查看目标key是什么数据类型
    • strlen [key]:查看目标key的长度
    • append [key] [string]: 向key中追加内容
    • incr [key]:使目标key的值+1 (incrby [key] [num]增加指定数量)
    • decr [key]:使目标key的值-1 (decrby [key] [num]减少指定数量)
    • getrange [key] [start] [end]:获取key中指定区间中的值
    • setrange [key] [start] [end]:覆盖key中指定区间中的值
    • setex [key] [time] [value]:添加key-value时并指定过期时间
    • setnx [key] [value]:如果目标key不存在则添加,存在则添加失败

    Redis列表(LIst):

    • lpush [列表名] [值1 值2 值3 …]:从列表左边添加元素(右边rpush)
    • lpop [列表名]:弹出最坐边的一个元素(右边rpop)
    • lrange [列表名] [起始位置] [结束位置]:列出列表中从起始位置到结束位置的元素(全部元素为0 -1)
    • lindex [列表名] [索引号]:找出列表中指定位置的元素
    • llen [列表名]:返回值为列表的长度
    • lrem [列表名]
      [value]:从列表中删除n个value
    • ltrim [list] [start] [end]:从list中截取start-end的值并附给list
    • linsert [list] [before/after] [value1] [value2]:在value1后面插入value2

    Redis集合(Set):

    • sadd [set] [value1] [value2] …:向set中添加value1,value2,…元素(非重复)
    • smembers [set]:查看set中的所有元素
    • sismember [set] [value]:查看set中是否含有value,若有则返回1,无则返回0
    • scard [set]:查看set中的元素个数
    • srem [set] [value]:删除set中的value
    • srandmember [set] [num]:在set中随机取出num个元素
    • spop [set]:在set中随机pop一个元素,并在set中删除
    • smove [set1] [set2] [value]:将set1中的value移动到set2中(移动后set1中不含value)
    • sdiff [set1] [set2]:求set1对set2的差集
    • sinter [set1] [set2]:求set1和set2的交集
    • sunion [set1] [set2]:求set1和set2的并集

    Redis哈希(Hash):

    • hset [key] [k1] [v1] [k2] [v2] …:向key中添加k1-v1,k2-v2键值对
    • hget [key] [k]:取出key中的k的v值
    • hmset [key] [k1] [v1] [k2] [v2]…:批量设置key的键值对
    • hmget [key] [][][k1] [k2]…:批量取出key中k1,k2…的值
    • hgetall [key]:将key中所有键值对全部取出(取出的格式为key,value,key,value…)
    • hdel [key] [k1] [k2]…:将key中健为k1,k2…的键值对删除
    • hexists [key] [k]:查看key中是否有键为k的键值对,有则返回1,没有则返回0
    • hkeys [key]:查看key中所有的健
    • hvals [key]:查看key中所有的值
    • hincrby [key] [k] [num]:将key中的键为k的值自增num(如果为float类型数据使用incrbyfloat)
    • hsetnx [key] [k1] [v1]:如果key中不存在k1则插入并返回1,否则返回0

    Redis有序集合(Zset):

    • zadd [set] [score1] [value1] [score2] [value2]…:向set中添加score1,value1,score2,value2
    • zrange [set] [start] [end]:取出set中从start到end之间的元素(withscores可以将分数也显示出来)
    • zrangebyscore [key] [score1] [score2]:将key中score1和score2之间的元素显示出来(默认为闭区间,如果在分数前加(则表示为开区间)(如果最后加limit则可类比mysql中的分页查询,如limit 2 2表示将结果中从第二个开始截取两个显示出来)
    • zrem [set] [value1] [value2] [value3]… :将set中的value1,value2,value3…移除
    • zcount [set] [score1] [score2]:查询在score1和score2之间的元素个数
    • zcard [set]:查询set中所有元素个数
    • zrank [set] [value]:查询目标value在set中的位置下标
    • zscore [set] [value]:查询value对应的score值
    • zrev前缀用来查询逆序集合,可用:zrevrank,zrevrange,zrevrangebyscore

    RedisRDB

    触发方式

    • Redis数据持久化方式之一

    • 自动触发:

      可在配置文件中配置持久化方式,如15分钟改动1次,5分钟改动20次,1分钟改动10000次.sava 900 1.sava 300 20.save 60 10000.( save m n ,m为秒数,n为变化次数)
  • 手动触发:

      1.当在redis命令行中执行save命令时(阻塞redis服务器,不能执行其他命令)
    • 2.当执行flushall时(此时dump.rdb为空,无意义)
    • 3.当执行bgsave时(异步操作,此时会fork一个子进程,redis此时可以执行其他命令,阻塞只发生在fork时)
  • stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了

  • rdbcompression ;默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。

  • **rdbchecksum :**默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

  • dbfilename :设置快照的文件名,默认是 dump.rdb

  • **dir:**设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。

    也就是说通过在配置文件中配置的 save 方式,当实际操作满足该配置形式时就会进行 RDB 持久化,将当前的内存快照保存在 dir 配置的目录中,文件名由配置的 dbfilename 决定。

  • 恢复方式

    当Redis重新启动时会自动读取目录下的dump.rdb文件(加载文件期间Redis为阻塞状态,直到文件加载完成)

    Redis AOF

    基本介绍

    • aof有三种追加操作指令的方式,分别是appendfsync always/everysec/no.分别表示一致同步,每秒同步(推荐使用)和不同步
    • aof文件若不能读取,可以使用redis的修复aof文件工具
    • 在数据量相同的情况下,aof文件的体积要大于rdb文件体积,且恢复效率低于rdb文件
    • aof运行效率也低于rdb文件,每秒同步策略效率较好,不同步效率和rdb相同
    • 如果与rdb同时启用的话,默认先加载aof文件
    • aof保存的数据要比rdb文件更加完整
    • 不推荐只是用aof方式

    开启方式

    • 在redis-conf文件中开启appendonly yes
    • 需要恢复数据时加入参数aof文件的地址
    • 默认文件名为appendonly.aof

    关于rewrite

    • 默认触发规则为当aof文件为上次重写的两倍且大于64m时进行重写
    • 重写可以减小aof文件的体积

    Redis事务

    命令

    • multi:标志一个事务块的开始
    • exec:执行事务块内的所有命令
    • discard:放弃事务块内所有命令的执行
    • unwatch:取消watch命令对所有key的监视
    • watch key [key…]:监视一个或者多个key,如果其中任意一个key有所改动,则事务将被打断

    Redis消息订阅/发布

    • publish [channel] [msg]:向channel中发布msg消息
    • subscribe [channel]:订阅channel中的消息(支持通配符的方式)

    Redis主从复制

    1.一主二从

    • 一个主机,两个从机
    • 从机上使用命令 slaveof [ipaddress] [port] 来复制主机内容
    • 使用info replication来查看当前是主机还是从机
    • 主机宕机后,从机待命; 从机宕机后,与主机断开连接,若无配置则重新上线后默认为主机.

    2.薪火相传

    • 主机从机的关系类似于链表节点关系
    • 任意一个节点宕机以后都会影响后续节点

    3.反客为主

    • 当主机宕机以后,从机可以使用slaveof no one命令来重新成为主机

    4.哨兵模式

    • 在linux使用redis-sentinel [sentinel.conf文件路径]开启哨兵模式
    • 在配置文件中加入 sentinel monitor [主机别名] [ip地址] [端口号] [投票数] 来配置主机及主机宕机后从机的选举票数
    • 主机宕机后,redis-sentinel会根据投票结果在从机中选取一个当作主机,其他从机归属到选举出的主机下,若选举完成后主机上线,则主机默认当作新选举的主机的从机.
    • 可以配置多个哨兵进行监控
    • 点赞
    • 收藏
    • 分享
    • 文章举报
    微特程序员 发布了15 篇原创文章 · 获赞 5 · 访问量 315 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: