Redis7分布式缓存之高阶

Redis7分布式缓存之高阶

  • 一. Redis单线程 VS 多线程(入门篇)
    • 1.Redis为什么选择单线程?
      • ① 是什么
      • ② ``厘清一个事实我们通常说Redis是单线程究竟何意?``
      • ③ Redis3.x单线程时代但性能依旧很快的主要原因
      • ④`Redis 4.0`之前一直采用单线程的主要原因有以下三个
    • 2. `既然单线程这么好,为什么逐渐又加入了多线程特性?`
      • ① 单线程也有单线程的苦恼
      • ② 如何解决
        • 案例
    • 3. redis6/7的多线程特性和IO多路复用`入门篇`
      • ① 对于Redis`主要的性能瓶颈是内存或者网络带宽而并非 CPU。`
      • ② 最后Redis的瓶颈可以初步定为: 网络IO
        • Ⅰ `redis6/7,真正多线程登场`
        • Ⅱ `主线程和IO线程是怎么协作完成请求处理的-精讲版`
    • 4. Jnix网终编程中的五种IO模型
      • ① `lO multiplexing - lO多路复用`
        • Ⅰ FileDescriptor
        • Ⅱ 首次浅谈I0多路复用l0多路复用是什么
        • Ⅲ `场景体验,说人话引出epoll`
          • 场景解析
          • IO多路复用模型,简单明了版理解
        • Ⅳ 小总结
        • Ⅴ redis为什么这么快
    • 5. 简单说明:`Redis工作线程是单线程的;但是,整个Redis来说,是多线程的`
      • ① 主线程和IO线程是怎么协作完成请求处理的-精简版
      • ② 结论
    • 6. Redis7默认是否开启了多线程?
  • 二. Bigkey
    • 1. Morekey案例
      • ① 大批量往redis里面插入2000W测试数据key
      • ② 某快递巨头真实生产案例新闻
        • keys* 你试试100W花费多少秒遍历查询
        • `生产上限制keys */flushdb/flushall等危险命令以防止误删误用?`
      • ③ `不用keys *避免卡顿,那该用什么`
        • Scan 命令用于迭代数据库中的数据库键
    • 2. BigKey案例
      • ① 多大算big
        • 参考《阿里云Redis开发规范》
        • string和二级结构
      • ② 有那些危害
      • ③ 如何产生
      • ④ 如何发现
        • redis-cli --bigkeys
        • MEMORY USAGE 键
      • ⑤ 如何删除
        • Ⅰ String
        • Ⅱ hash
        • Ⅲ list
        • Ⅳ set
        • Ⅴ zset
    • 3. Bigkey生产调优
  • 三、缓存双写一致性之更新策略探讨
    • 1. `缓存双写一致性,谈谈你的理解`
      • 读写缓存
      • `采用双检加锁策略`
    • 2. 数据库和缓存一致性的几种更新策略
      • 先更新数据库,再更新缓存
      • 先更新缓存,再更新数据库
      • 先删除缓存,再更新数据库
        • 解决方法
      • `更新策略之 先更新数据库,再删除缓存`
    • 3.小总结
  • 四. Redis与MySQL数据双写一致性工程落地案例
    • 1. 复习+面试题
    • 2. canal
      • ① 是什么
    • 3. 工作原理
    • 4. `mysql-canal-redis双写一致性Coding`
  • 五. 案例落地实战bitmap/hyperloglog/GEO
    • 1.

一. Redis单线程 VS 多线程(入门篇)

1.Redis为什么选择单线程?

① 是什么

Redis7分布式缓存之高阶_第1张图片

厘清一个事实我们通常说Redis是单线程究竟何意?

Redis7分布式缓存之高阶_第2张图片

③ Redis3.x单线程时代但性能依旧很快的主要原因

Redis 4.0之前一直采用单线程的主要原因有以下三个

Redis7分布式缓存之高阶_第3张图片

2. 既然单线程这么好,为什么逐渐又加入了多线程特性?

① 单线程也有单线程的苦恼

Redis7分布式缓存之高阶_第4张图片

② 如何解决

Redis7分布式缓存之高阶_第5张图片

案例

Redis7分布式缓存之高阶_第6张图片

3. redis6/7的多线程特性和IO多路复用入门篇

Redis7分布式缓存之高阶_第7张图片

① 对于Redis主要的性能瓶颈是内存或者网络带宽而并非 CPU。

② 最后Redis的瓶颈可以初步定为: 网络IO

redis6/7,真正多线程登场

Redis7分布式缓存之高阶_第8张图片

主线程和IO线程是怎么协作完成请求处理的-精讲版

Redis7分布式缓存之高阶_第9张图片

4. Jnix网终编程中的五种IO模型

Redis7分布式缓存之高阶_第10张图片

lO multiplexing - lO多路复用

Redis7分布式缓存之高阶_第11张图片

Ⅰ FileDescriptor

Redis7分布式缓存之高阶_第12张图片

Ⅱ 首次浅谈I0多路复用l0多路复用是什么

Redis7分布式缓存之高阶_第13张图片

场景体验,说人话引出epoll

Redis7分布式缓存之高阶_第14张图片

场景解析

Redis7分布式缓存之高阶_第15张图片

IO多路复用模型,简单明了版理解

Redis7分布式缓存之高阶_第16张图片

Ⅳ 小总结


Redis7分布式缓存之高阶_第17张图片

Ⅴ redis为什么这么快

Redis7分布式缓存之高阶_第18张图片

5. 简单说明:Redis工作线程是单线程的;但是,整个Redis来说,是多线程的

Redis7分布式缓存之高阶_第19张图片

① 主线程和IO线程是怎么协作完成请求处理的-精简版

Redis7分布式缓存之高阶_第20张图片

② 结论

Redis7分布式缓存之高阶_第21张图片

6. Redis7默认是否开启了多线程?


Redis7分布式缓存之高阶_第22张图片
Redis7分布式缓存之高阶_第23张图片

Redis7分布式缓存之高阶_第24张图片

二. Bigkey

Redis7分布式缓存之高阶_第25张图片

1. Morekey案例

① 大批量往redis里面插入2000W测试数据key


Redis7分布式缓存之高阶_第26张图片

Redis7分布式缓存之高阶_第27张图片
Redis7分布式缓存之高阶_第28张图片

② 某快递巨头真实生产案例新闻

Redis7分布式缓存之高阶_第29张图片

keys* 你试试100W花费多少秒遍历查询

Redis7分布式缓存之高阶_第30张图片

生产上限制keys */flushdb/flushall等危险命令以防止误删误用?

Redis7分布式缓存之高阶_第31张图片

不用keys *避免卡顿,那该用什么

Scan 命令用于迭代数据库中的数据库键

Redis7分布式缓存之高阶_第32张图片
Redis7分布式缓存之高阶_第33张图片
Redis7分布式缓存之高阶_第34张图片

2. BigKey案例

① 多大算big

参考《阿里云Redis开发规范》

Redis7分布式缓存之高阶_第35张图片

string和二级结构


Redis7分布式缓存之高阶_第36张图片

② 有那些危害

Redis7分布式缓存之高阶_第37张图片

③ 如何产生

④ 如何发现

Redis7分布式缓存之高阶_第38张图片

redis-cli --bigkeys

Redis7分布式缓存之高阶_第39张图片

Redis7分布式缓存之高阶_第40张图片

MEMORY USAGE 键


Redis7分布式缓存之高阶_第41张图片

⑤ 如何删除

Redis7分布式缓存之高阶_第42张图片
Redis7分布式缓存之高阶_第43张图片

Ⅰ String

一般用del,如果过于庞大unlink

Ⅱ hash

Redis7分布式缓存之高阶_第44张图片
Redis7分布式缓存之高阶_第45张图片

Ⅲ list

Redis7分布式缓存之高阶_第46张图片
Redis7分布式缓存之高阶_第47张图片
Redis7分布式缓存之高阶_第48张图片

Ⅳ set

Redis7分布式缓存之高阶_第49张图片
Redis7分布式缓存之高阶_第50张图片

Ⅴ zset

Redis7分布式缓存之高阶_第51张图片

Redis7分布式缓存之高阶_第52张图片

3. Bigkey生产调优



Redis7分布式缓存之高阶_第53张图片

三、缓存双写一致性之更新策略探讨

Redis7分布式缓存之高阶_第54张图片

1. 缓存双写一致性,谈谈你的理解

Redis7分布式缓存之高阶_第55张图片

读写缓存

采用双检加锁策略

Redis7分布式缓存之高阶_第56张图片

Redis7分布式缓存之高阶_第57张图片

@Service
@Slf4j
public class UserService {
    public static final String CACHE_KEY_USER = "user:";
    @Resource
    private UserMapper userMapper;
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 业务逻辑没有写错,对于小厂中厂(QPS《=1000)可以使用,但是大厂不行
     * @param id
     * @return
     */
    public User findUserById(Integer id)
    {
        User user = null;
        String key = CACHE_KEY_USER+id;

        //1 先从redis里面查询,如果有直接返回结果,如果没有再去查询mysql
        user = (User) redisTemplate.opsForValue().get(key);

        if(user == null)
        {
            //2 redis里面无,继续查询mysql
            user = userMapper.selectByPrimaryKey(id);
            if(user == null)
            {
                //3.1 redis+mysql 都无数据
                //你具体细化,防止多次穿透,我们业务规定,记录下导致穿透的这个key回写redis
                return user;
            }else{
                //3.2 mysql有,需要将数据写回redis,保证下一次的缓存命中率
                redisTemplate.opsForValue().set(key,user);
            }
        }
        return user;
    }


    /**
     * 加强补充,避免突然key失效了,打爆mysql,做一下预防,尽量不出现击穿的情况。
     * @param id
     * @return
     */
    public User findUserById2(Integer id)
    {
        User user = null;
        String key = CACHE_KEY_USER+id;

        //1 先从redis里面查询,如果有直接返回结果,如果没有再去查询mysql,
        // 第1次查询redis,加锁前
        user = (User) redisTemplate.opsForValue().get(key);
        if(user == null) {
            //2 大厂用,对于高QPS的优化,进来就先加锁,保证一个请求操作,让外面的redis等待一下,避免击穿mysql
            synchronized (UserService.class){
                //第2次查询redis,加锁后
                user = (User) redisTemplate.opsForValue().get(key);
                //3 二次查redis还是null,可以去查mysql了(mysql默认有数据)
                if (user == null) {
                    //4 查询mysql拿数据(mysql默认有数据)
                    user = userMapper.selectByPrimaryKey(id);
                    if (user == null) {
                        return null;
                    }else{
                        //5 mysql里面有数据的,需要回写redis,完成数据一致性的同步工作
                        redisTemplate.opsForValue().setIfAbsent(key,user,7L,TimeUnit.DAYS);
                    }
                }
            }
        }
        return user;
    }

}

2. 数据库和缓存一致性的几种更新策略

Redis7分布式缓存之高阶_第58张图片

Redis7分布式缓存之高阶_第59张图片

先更新数据库,再更新缓存

Redis7分布式缓存之高阶_第60张图片
Redis7分布式缓存之高阶_第61张图片

先更新缓存,再更新数据库


Redis7分布式缓存之高阶_第62张图片

先删除缓存,再更新数据库

Redis7分布式缓存之高阶_第63张图片

Redis7分布式缓存之高阶_第64张图片
Redis7分布式缓存之高阶_第65张图片
Redis7分布式缓存之高阶_第66张图片
Redis7分布式缓存之高阶_第67张图片

解决方法

Redis7分布式缓存之高阶_第68张图片
Redis7分布式缓存之高阶_第69张图片
Redis7分布式缓存之高阶_第70张图片

更新策略之 先更新数据库,再删除缓存

Redis7分布式缓存之高阶_第71张图片
Redis7分布式缓存之高阶_第72张图片
Redis7分布式缓存之高阶_第73张图片

3.小总结

Redis7分布式缓存之高阶_第74张图片
Redis7分布式缓存之高阶_第75张图片
Redis7分布式缓存之高阶_第76张图片


四. Redis与MySQL数据双写一致性工程落地案例

Redis7分布式缓存之高阶_第77张图片

1. 复习+面试题

Redis7分布式缓存之高阶_第78张图片
Redis7分布式缓存之高阶_第79张图片

2. canal

Redis7分布式缓存之高阶_第80张图片

① 是什么

Redis7分布式缓存之高阶_第81张图片

3. 工作原理

在这里插入图片描述
Redis7分布式缓存之高阶_第82张图片
Redis7分布式缓存之高阶_第83张图片

4. mysql-canal-redis双写一致性Coding

Redis7分布式缓存之高阶_第84张图片

Redis7分布式缓存之高阶_第85张图片

五. 案例落地实战bitmap/hyperloglog/GEO

1.

你可能感兴趣的:(Redis,redis)