redis入门到精通

本文深入探讨了 Redis 数据库,讲解了 Redis 的数据结构,如 string、hash、list、set 和 sorted set 的应用。重点讨论了 list 的双向链表实现和在消息队列中的应用,以及 set 在处理好友关系中的作用。此外,文章还涵盖了 Redis 的持久化策略(RDB 和 AOF),主从复制机制,以及如何应对缓存穿透、缓存击穿和缓存雪崩等问题。同时,文章介绍了 Redis 中的跳表结构及其在有序集合实现中的角色。最后,文章提到了 Redis 集群的哈希槽分配策略以及 Gossip 协议在集群通信中的作用。
摘要由CSDN通过智能技术生成

0、redis安装在磁盘,数据保存在内存。
redis是K-V数据库,其中V有以下几种数据结构

  • string类型:可以是string也可以是int
  • hash类型
  • List
    1、 Redis list的实现为一个双向链表,即可以支持反向查找和遍历。Lists的一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行
    2、因为 list 结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的 “最近新闻”。
  • Set
    好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能
    sadd user:wade james melo paul kobe
    sadd user:james wade melo paul kobe
    // 获取 wade 和 james 的共同好友
    sinter user:wade user:james
  • Zset(sorted Set)
    好友的“亲密度”排行
    / / 用元素的分数(score)表示与好友的亲密度
    zadd user:kobe 80 james 90 wade 85 melo 90 paul
    //排行
    zrevrange user:kobe 0 -1
  • Bitmaps
  • Hyperloglogs
  • GEO

1、设计redis key:将sql表数据存储到redis
使用冒号把 key 中要表达的多种含义分开表示,步骤如下:

把表名转化为 key 前缀
主键名(或其他常用于搜索的字段)
主键值
要存储的字段

eg. 用户表(user)
id name email
1 zj 156577812@qq.com
2 ai 156577813@qq.com
这个简单的表可能经常会有这个的需求:>根据用户 id 查询用户邮箱地址,可以选择把邮箱地址这个数据存到 redis 中:
set user: id:1:email 156577812@qq.com; //user: id:1:email拼成一个字符串作为key,这种存储会造成key值太多的问题,key太多也很占内存
也可以这样存储:
set user: id:1 '[{“id”:1,“name”:“zj”,“email”:“156577812@qq.com”}
但是这样存储对于value的值不好改,所以推荐hash:
hmset user:1 name zj email 156577812@qq.com
2、Redis的缓存穿透与缓存击穿

  • 缓存穿透说的是查询一个数据库一定不存在的数据,也就是说数据库不存在那缓存中一定也不存在。如果有人恶意用这种一定不存在的key来频繁请求系统,可能会导致DB崩溃。如发起为id为“-1”的数据或id为特别大不存在的数据。
    解决:
    缓存穿透可以设置布隆过滤器进行过滤:在缓存之前在加一层 BloomFilter -存储所有可能存在的key,在查询的时候先去 BloomFilter 去查询 key 是否存在,如果不存在就直接返回,存在再走查缓存 -> 查 DB
    实现:jedis操作代码实现两种方法,一是布隆过滤器添加key值的方法,二是判断key是否存在的方法。
    另外如果有多次查询也可以将这个不存在的数据key缓存到redis中,同时设置一个较短的过期时间,value是空

  • 缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。注意,此时是缓存没有数据,数据库有数据,且是大量请求瞬间发生,缓存穿透是不存在的key持续,频繁请求
    解决:可以对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待(这样就限制了查询DB的并发),然后等解锁后返回数据或者进入DB查询。或者如果是热点key的话,可以设置一个较长的存活时间甚至永不过期

  • 缓存雪崩,是指很多key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这些key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。所以雪崩跟击穿的区别是雪崩是大量key集中过期

4、正常使用缓存查询数据的流程是,依据key去查询value,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存
5、redis持久化

  • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
    优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中直接存储的是key-values的二进制形式,对于恢复数据也快)
    缺点:在保存数据的时候若发生宕机,此间的数据会丢失
  • AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集
    ○ 优点:数据不容易丢失
    ○ 缺点:性能较低(每一条修改操作都要追加到aof文件,执行频率较RDB要高,而且aof文件中存储的是命令,对于恢复数据来讲需要逐行执行命令,所以恢复慢)

线上一般两种模式混用,紧急情况下先用rdb快速恢复。然后再用aof补充rdb丢失的那部分数据

6、redis主从复制
在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,我们定义被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),这种模式叫做主从复制模式。数据流向是单向的,只能是从master到slave
主从复制的作用:为数据提供多个副本,实现高可用;实现读写分离(主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性)。
主从复制的方式:
命令slaveof。优点:无需重启。缺点:不便于管理
修改配置。优点:统一配置。缺点:需要重启

7、主从复制原理
全量同步
Redis全量复制一般发生在Slave初始化阶段,比如开始redis只有单节点,新加入一个从节点。这时Slave需要将Master上的所有数据复制一份。具体步骤如下:

  • 从服务器连接主服务器,发送SYNC命令;
  • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB快照文件,并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值