redis

Redis

Redis是一款基于c语言编写的高性能nosql,可基于内存亦可持久化的日志型、key-value数据库,可以用作数据 库,缓存 ,消息中间件,并且有丰富的数据类型,也是目前缓存技术解决方案之一。

1.数据类型

1.1 String

字符串类型是redis中最为基础的数据存储类型,该类可以接受任何格式的数据,其中value最多可以容纳数据长度512M

  1. 设置键值 set key value

    set name itboy
    
  2. 设置键值及过期时间,以秒为单位 setex key seconds value

    setex name 3 itboy  #三秒后这个value就过期啦
    
  3. 设置多个值 mset key1 value1 key2 value2 key3 value3...

    mset name itboy age 18 gender male
    
  4. 追加值 append key value

    append name cc      #指定key  对应的value后面加值 
    
  5. 获取 get key 获取多个mget key1 key2 key3

    get name
    mget name age gender
    
  6. 删除 del key1 key2

    del name age
    

1.2 键命令

  1. 查找键 支持正则表达式 keys pattern 参数支持正则表达试

    h?llo  #匹配 hello, hallo 和 hxllo
    h*llo  #匹配 hllo 和 heeeello
    h[ae]llo #匹配 hello 和 hallo, 但是不匹配 hillo
    h[^e]llo #匹配 hallo, hbllo, … 但是不匹配 hello
    h[a-b]llo #匹配 hallo 和 hbllo
    
  2. 查看所有键

    keys *
    
  3. 判断键是否存在,如果存在返回1,不存大返回 0

    exists key 
    
  4. 查询健的类型 type key

    type name
    
  5. 设置过期时间 ,以秒为单位 expire key seconds

    expire name 2
    
  6. 查看有效时间 以秒为单位 ttl key

    ttl name
    

1.3 Hash

  • hash 用于存储对象,对象的结构为属性、值

  • 值的类型为String

    1. 设置单个属性 hset key field value

      hset user name cc
      hget user name #获取
      
    2. 设置多个属性 hset key field1 value1 field2 value2......

      hset user name cc age 18
      
    3. 获取指定键的所有属性 hkeys key

      hkeys user
      
    4. 获取多个属性的值 hmget key field1 field2

      hmget user name age
      
    5. 获取所有属性的值 havls key

    6. 删除

      • 删除属性,属性对应的值 也会被删除

        hdel user 
        hdel user name
        

1.4 list

  • 列表的元素类型为string

  • 按照插入顺序排序

    1. 左侧插入数据 lpush key value1 value2...

      lpush a1 a b c
      
    2. 右侧插入数据 rpush key value1 value2...

      rpush a1 0 1 2
      
    3. 指定元素的前后插入新元素

      linsert key before或者after 现有的元素 新元素
      linsert a1 before 1 a  # 在键为a1 的列表元素1前面添加a
      
    4. 获取

      1. 返回列表里指定范围内的元素

      2. 索引是左侧开始,第一个元素为0

      3. 索引可以是负数,表示从尾部开始计数,-1表示最后一个

        lrange a1 0 -1  #获取键a1 所有元素
        
        
    5. 指定索引位置的元素值

      lset key index value
      lset a1  0 b
      
    6. 删除指定元素

      • 将列表中前count次出现的值为value的元素移除

      • count > 0: 从头往尾移除

      • count < 0: 从尾往头移除

      • count = 0: 移除所有

         lpush a3 a b a b c b a b a
         lrem a3 -3 a
         abbcbb
        

1.5 set

  • 无序集合

  • 元素为string 类型

  • 元素具有唯 一性,不重复

    1. 添加元素 sadd key member1 mebmer2

      sadd aa a b c
      
    2. 获取

      smembers key  #返回所有的
      smembers aa   #获取键aa的所有元素
      
    3. 删除

      srem key
      srem aa   #删除键aa的所有元素
      sream aa a  #删除键aa中的a元素
      

1.5 zset

  • sorted set 有序集合

  • 元素为string 类型

  • 元素具有唯一性 不重得

  • 每个元素都会关联一个double类型的score,表示 权重,通过 权重将元素从小到大排序

  • 没有修改操作

    1. 添加 zadd key score1 member1 score2 member2

      zadd name 1 a 2 b 3 c 4 d
      
    2. 获取 zrange key start top

      zrange name 0 -1   #获取键name 所有元素
      
      zrangebyscore key min max #返回score值 在min 和max之间的成员
      
    3. 删除 zrem key member1 mermber2

      zrem name a
      
      zremrangebyscore key min max   #删除权重在指定范围的元素
      

2.数据持久化

持久化主要是做灾难恢复,数据恢复,比如redis挂了,导致redis不可用的,大量请求全部落在db上,导致db沉重崩溃,这时候 要做的事情 尽快让reids变得可用,尽快让他对外提供服务,之前就应该做好数据持久 化,重启redis之后,通过备份数据,快速恢复,一量恢复就对外提供 服务

  • reids持久化: RDB,AOF

  • RDB:RDB持久化机制,对redis的数据执行周期性的持久化,redis主进程会fork一个子进程 ,让子进程 执行磁盘IO操作进行RDB持久化即可,即在指定目录生一个dump.rdb文件,redis重启会通过 加载dump.rdb文件恢复数据

    优点:

    1. RDB会生成多个数据文件,每个数据文件都代表某一个时刻中redis数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整数据文件存储云服务器上。
    2. RDB对redis对外提供的读写服务,影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程 ,让子进程 进行磁盘IO操作进行持久化。
    3. 相对AOF持久化机制来说,RDB数据文件来重启和恢复数据,更加快速。

    缺点

    1. 如果想在要redis故障时,尽可能少丢失数据,那么RDB没有AOF好,RDB是每隔一段时间生成一次,如果这个时候 redis宕机啦,那么会丢失 最近这段时间的数据
    2. RDB每次在fork子进程来执行RDB快照文件生成的时候,如果数据文件特别大,可能 导致客户端提供的服务暂停毫秒或者甚至数秒
  • AOF:AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中。

    优点:

    1. 相对RDB而言,AOF可以更好的保护数据不丢失,一般AOF会每隔一秒,能过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据
  1. AOF日志文件以append-only模式写入,所以没有任务磁盘寻址的开销,写入性能非常高,而且 文件不容易破损即使文件尾部破损,也很容易恢复
  2. AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据

缺点:

  1. AOF的文件会越来越大,提供了AOF文件越大的解决方案,redis会自动重新根据当前的redis内存中的数据给生成一个新的最小写操作的AOF文件
  2. AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的

RDB和AOF到底该如何选择

(1)不要仅仅使用RDB,因为那样会导致你丢失很多数据

(2)也不要仅仅使用AOF,因为那样有两个问题,第一,你通过AOF做冷备,没有RDB做冷备,来的恢复速度更快; 第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug

方案,redis会自动重新根据当前的redis内存中的数据给生成一个新的最小写操作的AOF文件
2. AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的

RDB和AOF到底该如何选择

(1)不要仅仅使用RDB,因为那样会导致你丢失很多数据

(2)也不要仅仅使用AOF,因为那样有两个问题,第一,你通过AOF做冷备,没有RDB做冷备,来的恢复速度更快; 第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug

(3)综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值