Redis简介

作者: loveFXX | 来源:发表于2020-01-08 20:46 被阅读0次

    redis是一个单线程,高性能内存数据库,基于内存运行并支持持久化的非关系型数据库。用C语言编写的
    主要是用来做缓存,也可以实现分布式锁,队列,会话缓存

    redis安装

    redis官方下载
    下载之后解压、make、make install、启动

    redis数据类型及API

    官网命令
    常用命令:

    keys *
    scan  0 match  *  count  1
    exists key 判断某个key是否存在
    move key db  当前库就没有了,到指定的库中去了
    expire key  为给定的key设置过期时间
    ttl key 查看还有多少时间过期   -1表示永不过期  -2表示已过期
    type key  查看key是什么类型
    
    string

    string是redis最基本类型,一个key对应一个value。是二进制安全的,可以包含任何对象如序列化的对象。一个redis的字符串value最多可以是512M

    set  key  value   设置key  value
    get  key    查看当前key的值
    del  key   删除key
    append key  value   如果key存在,则在指定的key末尾添加,如果key存在则类似set
    strlen  key  返回此key的长度
    
    
    以下几个命令只有在key值为数字的时候才能正常操作
    incr  key  为执定key的值加一
    decr  key  为指定key的值减一
    incrby key  数值     为指定key的值增加数值
    decrby key  数值     为指定key的值减数值
    
    getrange  key  0(开始位置)  -1(结束位置)    获取指定区间范围内的值,类似between......and的关系 (0 -1)表示全部
    setrange key 1(开始位置,从哪里开始设置) 具体值    设置(替换)指定区间范围内的值
    setex 键 秒值 真实值    设置带过期时间的key,动态设置。
    setnx  key   value         只有在 key 不存在时设置 key 的值。
    mset   key1   value  key2   value       同时设置一个或多个 key-value 对。
    mget   key1   key 2    获取所有(一个或多个)给定 key 的值。
    msetnx   key1   value  key2   value   同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
    getset   key    value  将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
    
    list

    是一个字符串链表,left和right都可以添加。如果键不存在,则创建新的链表。

    lpush  key  value1  value2  将一个或多个值加入到列表头部
    rpush  key  value1  value2 将一个或多个值加入到列表底部
    lrange key  start  end  获取列表指定范围的元素   (0 -1)表示全部
    lpop key 移出并获取列表第一个元素
    rpop key  移出并获取列表最后一个元素
    lindex key index   通过索引获取列表中的元素
    llen 获取列表长度
    lrem key   0(数量) 值,表示删除全部给定的值。零个就是全部值   从left往right删除指定数量个值等于指定值的元素,返回的值为实际删除的数量
    ltrim key  start(从哪里开始截)  end(结束位置) 截取指定索引区间的元素,格式是ltrim list的key 起始索引 结束索引
    
    set

    set是string类型的无序不能重复的集合

    sadd key value1 value 2 向集合中添加一个或多个成员
    smembers  key  返回集合中所有成员
    sismembers  key   member  判断member元素是否是集合key的成员
    scard key  获取集合里面的元素个数
    srem key value  删除集合中指定元素
    srandmember key  数值     从set集合里面随机取出指定数值个元素   如果超过最大数量就全部取出,
    spop key  随机移出并返回集合中某个元素
    smove  key1  key2  value(key1中某个值)   作用是将key1中执定的值移除  加入到key2集合中
    sdiff key1 key2  在第一个set里面而不在后面任何一个set里面的项(差集)
    sinter key1 key2  在第一个set和第二个set中都有的 (交集)
    sunion key1 key2  两个集合所有元素(并集)
    
    hash

    redis hash是一个键值对集合,string类型的field和value的映射表,适合存储对象。类似Java里面的Map<String,Object>

    hset  key  (key value)  向hash表中添加一个元素
    hget key  key  向hash表中获取一个元素
    hmset  key key1 value1 key2 value2 key3 value3 向集合中添加一个或多个元素
    hmget key  key1 key2 key3  向集合中获取一个或多个元素
    hgetall  key   获取在hash列表中指定key的所有字段和值
    hdel  key  key1 key2 删除一个或多个hash字段
    hlen key 获取hash表中字段数量
    hexits key key  查看hash表中,指定key(字段)是否存在
    hkeys  key 获取指定hash表中所有key(字段)
    hvals key 获取指定hash表中所有value(值)
    hincrdy key  key1  数量(整数)  执定hash表中某个字段加  数量  ,和incr一个意思
    hincrdyfloat key key1  数量(浮点数,小数)  执定hash表中某个字段加  数量  ,和incr一个意思
    hsetnx key key1 value1  与hset作用一样,区别是不存在赋值,存在了无效。
    
    zset

    zset和set一样是string类型元素的集合,不允许重复

    zadd  key  score 值   score 值   向集合中添加一个或多个成员
    zrange key  0   -1  表示所有   返回指定集合中所有value
    zrange key  0   -1  withscores  返回指定集合中所有value和score
    zrangebyscore key 开始score 结束score    返回指定score间的值
    zrem key score某个对应值(value),可以是多个值   删除元素
    zcard key  获取集合中元素个数
    zcount key   开始score 结束score       获取分数区间内元素个数
    zrank key vlaue   获取value在zset中的下标位置(根据score排序)
    zscore key value  按照值获得对应的分数
    
    其他类型

    1、pipeline
    2、GEO
    3、hyperLogLog
    基数统计算法
    4、bitmaps

    redis的持久化机制

    redis提供两种持久化方式:RDB和AOF。

    RDB

    原理:redis会创建(fork)一个与当前进程一样的子进程来进行持久化,这个子进程的数据都和原进程一模一样,会首先将数据写入到一个临时文件中,待持久化结束后,再用这个临时文件替换上次持久化的文件。
    fork一个进程的原因是redis是单线程,如果不frok一个客户端命令将会阻塞,直到持久化结束。
    触发rdb持久化机制:
    1、shutdown时,如果没有开启aof会触发
    2、执行命令save或bgsave
    bgsave会fork子进程,系统默认触发rdb持久化就是调用的这个命令
    save不会fork子进程,是阻塞的
    3、执行flushall命令 会清空数据

    aof

    原理是将redis的操作日志以追加的方式写入文件,读操作不记录。数据写入内存、数据写入aof buf(根据配置文件触发)、写入到持久化文件(根据配置文件触发)
    触发机制:
    1、no 不进行持久化
    2、always 每次发生数据变化是
    3、everysec 每秒同步一次(默认,可能会丢失一秒数据)
    aof重写机制:
    aof是以日志追加方式将命令字符串保存到aof文件中,随着时间增长redis操作越多,aof文件会越来越大。所以需要重写。思想是:直接根据现在内存的数据,生成aof文件,然后替换旧的aof文件,就可以把中间无效的清除。
    重写触发机制:
    1、当aof文件增长到一定大小的时候,redis调用bgrewriteaof进行重写
    2、aof文件增长率大于该配置项时(超过原大小100%),auto-aof-rewrite-percentage 100
    3、aof文件大于该配置项(64M) auto-aof-rewrite-min-size 64mb
    重写是fork子进程完成,正常的aof不会fork子进程

    混合持久化机制

    redis4.0默认没有开启 通过aof-use-rdb-preamble参数控制,yes表示开启
    redis5.0默认开启
    混合持久化是通过bgrewriteaof完成的,当开启混合持久化时,fork出的子进程先将内存中的副本全量以rdb方式写入aof文件,然后将重写缓冲区的增量命令以aof方式写入到文件,写入完成后通知主进程更新统计信息,并将含有RDB格式和aof格式的AOF文件替换旧的aof文件。新的aof文件前半段是rdb格式的全量数据,后半段是aof格式的增量数据。
    优点:混合持久化集合了rdb和aof持久化的优点,绝大部分都是RDB格式,加载速度快,结合aof,增量数据以aof方式保存,丢失更少的数据

    删除策略

    1、定时删除
    2、惰性删除
    当调用查询键时,删除
    3、定期删除
    ①、redis启动时读取配置文件的hz的值,默认是10
    ②、每秒执行hz次serverCron()-->databasesCron()--->actveEXpireCyle()
    ③、actveEXpireCyle()方法对每个数据库expires[]进行逐一检查,每次执行(250/hz)ms
    ④、对某个expires[
    ]检测时,随机挑选N个key检查
    如果key超时,删除key 如果一轮中删除的key的数量>N25%,循环该过程
    如果删除的key数量小于N
    25%,则检查下一个expires[*+1]数据库
    current_db用于记录actveEXpireCyle()进入哪个expires[ * ] 数据库执行,如果时间到了,那么下次根据current_db继续执行

    逐出算法

    当内存使用达到最大值时,redis使用的清除策略。有以下几种可以选择
    1、volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
    2、allkeys-lru 利用LRU算法移除任何key
    3、volatile-random 移除设置过过期时间的随机key
    4、allkeys-random 移除随机key
    5、volatile-ttl 移除即将过期的key(minor TTL)
    6、noeviction 不移除任何key,只是返回一个写错误 。默认选项

    缓存几大问题

    1、缓存粒度问题

    是部分数据缓存还是全部数据缓存,使用不当可能会造成空间、网络带宽等问题’

    2、缓存穿透问题

    缓存穿透是查询一个不存在的数据,由于缓存不命中,则每次查询都要到数据库查询。
    这样会造成数据库压力过大
    解决方案:
    1、缓存空对象
    2、布隆过滤器
    ①、google布隆过滤器 基于JVM内存的一种布隆过滤器,重启即失效、本地内存无法在分布式场景应用、不支持大数据量存储
    ②、redis布隆过滤器 需要网络IO

    3、缓存击穿

    缓存击穿是数据库存在,由于缓存时间到期,缓存中不存在。对热点key的大量并发访问
    这时如果有大量并发用户访问,同时读热点数据而缓存中没有数据,将会去数据库查询然后重建缓存,会出现很多线程同时重建的问题。会出现在重建还没有完成,不断被重建,并导致服务器变慢。
    解决方案:
    互斥锁 第一个获取缓存的时候,没有获取到会加一个锁查询数据库并重建缓存。另一个线程过来发现有锁,会等待直到命中。redis分布式锁,会降低缓存粒度

    4、缓存雪崩

    缓存雪崩是指机器宕机或设置缓存是采用相同时间,导致缓存在某一时刻同时失效。请求全部转到数据库,数据库压力瞬间过大。
    解决方案:
    ①、通过加锁或队列控制数据库写缓存的线程数
    ②、做二级缓存 A2为拷贝缓存 A1缓存失效时间为短期,A2长期
    ③、不同的key设置不同过期时间

    总结:

    redis基于内存的非关系型数据库,数据类型及常用API
    持久化机制rdb和aof的原理
    缓存穿透、缓存击穿、缓存雪崩的原因及处理

    相关文章

      网友评论

        本文标题:Redis简介

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