Redis入门

  1. Redis是什么
    1. Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
    2. Redis安装在磁盘
    3. Redis数据存储在内存
  2. Redis特性
    1. 速度快
      1. 内存、单线程、IO多路复用、协议简单
    2. 键值对的数据结构服务器
      1. key是简单的字符串,越短小精悍越好,value是String、Hash、List、set、zset
    3. 丰富的功能
      1. 与Memcache区别,Memcache不能持久化并且只能是字符串
    4. 简单稳定:因为单线程、协议简单且持久化
    5. 持久化:redis需要经常将内存中的数据同步到磁盘来保证持久化
    6. 主从复制
    7. 高可用和分布式转移
    8. 客户端语言多
  3. 使用场景
    1. 缓存数据库
    2. 排行榜
    3. 计数器应用
    4. 社交网络:贴标签
    5. 消息队列
  4. 数据结构
    1. 字符串
      1. set age 23 ex 10,10秒后过期
      2. setnx name test,不存在name时,返回1设置成功,返回0说明存在插入失败
      3. 批量设值:mset country china city beijing
      4. 批量获取:mget country city address      //返回china  beigjin, address为nil
      1. 计数
      1. incr age       //必须为整数自加1,非整数返回错误,无age键从0自增返回1
      2. decr age      //整数age减1
      3. incrby age 2 //整数age+2
      4. 字符串追加截取
      5. set name hello;append name world //追加后成helloworld
      6. set hello "世界";strlen hello         //结果6,每个中文占3个字节
      7. set name helloworld ; getrange name 2 4//返回 llo
    2. hash的命令
      1. 是一个string类型的field和value的映射表,hash适合用于存储对象
      2. 命令  hset key field value
      3. 设值:hset user:1 name james
      4. 批量设值:hmset user:2 name james age 23 sex boy
      5. 增加1:hincrby user:2 age 1
    3. 列表:用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素
      1. 可以通过索引下标获取元素或某个范围内元素列表,元素可以重复
      2. rpush james c b a    //依次向右插入c b a, 返回值3
      3. lrange james 0 -1    //从左到右获取列表所有元素 返回 c b a
    4. set:保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集
      1. 场景:用户标签,社交,查询有共同兴趣爱好的人,智能推荐
      2. exists user       //检查user键值是否存在
      3. sadd user a b c//向user插入3个元素,返回3
      4. smembers user //获取user的所有元素,返回结果无序
      5. srem user a     //返回1,删除a元素
      6. scard user       //返回2,计算元素个数
    5. 有序集合
      1. 场景:常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员
      2. zadd user:zan 200 james 120 mike 100 lee
      3. zrange test:1 0 -1 withscores   //查看点赞(分数)与成员名

  1. 三种方案实现用户信息存储优缺点
    1. 原生
      1. 优点:简单直观,每个键对应一个值
      2. 缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境
    2. 对象序列化存入redis
      1. 优点:编程简单,若使用序列化合理内存使用率高
      2. 缺点:序列化与反序列化有一定开销,更新属性时需要把对象全取出进行反序列化,更新后再序列化到redis
    3. 使用hash类型
      1. 简单直观,使用合理可减少内存空间消耗
      2. 缺点:要控制ziplist与hashtable两种编码转换,且hashtable会消耗更多内存Serialize(userInfo)
  2. Redis数据库管理
    1. 默认支持16个数据库;可以理解为一个命名空间
    2. 跟关系型数据库不一样的点
      1. redis不支持自定义数据库名词
      2. 每个数据库不能单独设置授权
      3. 每个数据库之间并不是完全隔离的。 可以通过flushall命令清空redis实例面的所有数据库中的数据
      4. 通过  select dbid 去选择不同的数据库命名空间 。 dbid的取值范围默认是0 -15
  3. 常见问题
    1. 缓存雪崩
      1. 当查询key=james的值,此时Redis没有数据,如果有5000个用户并发来查询key=james,全到Mysql里去查, Mysql会挂掉,造成雪崩
    2. 缓存穿透
      1. 一个值被查询,Redis中无此值,Mysql中也无此值,但一直被查询,拖垮数据库
      2. 解决方案
        1. 对订单表所有数据查询出来放到布隆过滤器,经过布隆过滤器处理的数据很小(只存0或1)
        2. 每次查订单表前,先到过滤器里查询当前订单号状态是0还是1, 0的话代表数据库没有数据
  4. Redis持久化机制
    1. RDB持久化
      1. 把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发
      2. save命令:阻塞当前Redis,直到RDB持久化过程完成,若内存实例比较大会造成长时间阻塞,线上环境不建议用
      3. bgsave命令:redis进程执行fork操作创建子进程,由子线程完成持久化,阻塞时间很短(微秒级),是save的优化,在执行redis-cli shutdown关闭redis服务时,如果没有开启AOF持久化,自动执行bgsave

  1. 优点
    1. 压缩后的二进制文,适用于备份、全量复制,用于灾难恢复
    2. 加载RDB恢复数据远快于AOF方式
  2. 缺点
    1. 无法做到实时持久化,每次都要创建子进程,频繁操作成本过高
    2. 保存后的二进制文件,存在老版本不兼容新版本rdb文件的问题
  1. AOF持久化
    1. 针对RDB不适合实时持久化,redis提供了AOF持久化方式来解决
    2. 类似于执行语句的日志
    3. 配置
      1. appendonly yes           //启用aof持久化方式
      2. # appendfsync always //每收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
      3. appendfsync everysec //每秒强制写入磁盘一次,性能和持久化方面做了折中,推荐
      4. no-appendfsync-on-rewrite  yes  //正在导出rdb快照的过程中,要不要停止同步aof
      5. auto-aof-rewrite-percentage 100  //aof文件大小比起上次重写时的大小,增长率100%时,重写
      6. auto-aof-rewrite-min-size 64mb   //aof文件,至少超过64M时,重写
    4. 如何恢复
      1. 设置appendonly yes;
      2. 将appendonly.aof放到dir参数指定的目录;
      3. 启动Redis,Redis会自动加载appendonly.aof文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值