/images/avatar.png

Redis学习(4)-慢查询分析与RESP协议

慢查询

Redis慢查询分析

与MySQL一样:当执行时间超过极大值时,会将发生时间、耗时、 命令记录;

https://yakax.oss-cn-hangzhou.aliyuncs.com/blog/redis-2019-926/10.png

redis命令生命周期:发送 排队 执行 返回,慢查询只统计第3个执行步骤的时间

Redis如何设置

  1. 动态设置6379:> config set slowlog-log-slower-than 10000 //10毫秒 使用config set完后,若想将配置持久化保存到redis.conf,要执行config rewrite ;前提是你根据redis.conf 执行

  2. redis.conf修改:找到slowlog-log-slower-than 10000 ,修改保存即可 注意:slowlog-log-slower-than =0记录所有命令 -1命令都不记录

Redis学习(2)-缓存击穿、穿透、雪崩、热点数据

设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。 这里不涉及一级缓存还是二级缓存,主要是讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法 我们使用缓存的时候流程一般是这样: https://yakax.oss-cn-hangzhou.aliyuncs.com/blog/redis-2019-926/4.png 当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回并缓存。 这种情况下就可能会出现一些现象。

Redis学习(1)-基本命令与持久化机制

docker简单安装设置密码并开启持久化

1
docker run -d --name myredis -p 6379:6379 redis --requirepass "156967" --appendonly yes

文档

文档学习

特性

  1. 速度快 数据放内存中是速度快的主要原因、C语言实现,与操作系统距离近、使用了单线程架构,预防多线程可能产生的竞争问题
  2. 丰富的功能:value可以为string、hash、list、set、zset等多种数据结构,可以满足很多应用场景。还提供了键过期,发布订阅,事务,流水线。(流水线: Redis 的流水线功能允许客户端一次将多个命令请求发送给服务器, 并将被执行的多个命令请求的结果在一个命令回复中全部返回给客户端, 使用这个功能可以有效地减少客户端在执行多个命令时需要与服务器进行通信的次数)
  3. 高可用和分布式:哨兵机制实现高可用,保证redis节点故障发现和自动转移
  4. 键值对的数据结构服务器
  5. 持久化:发生断电或机器故障,数据可能会丢失,可以持久化到硬盘通过(aof、rdb)
  6. 主从复制:实现多个相同数据的redis副本

并发编程学习(6)CountDownLatch、Semaphore、CyclicBarrier

CountDownLatch

countdownlatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行,countdownlatch 提供了两个方法,一个是 countDown,一个是 await。countdownlatch 初始化的时候需要传入一个整数,在这个整数倒数到 0 之前,调用了 await 方法的程序都必须要等待,然后通过 countDown 来倒数

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(5);
        new Thread(() -> {
            System.out.println("Thread1");
            countDownLatch.countDown(); //3-1=2
            System.out.println("Thread1执行完毕");
        }).start();
        new Thread(() -> {
            System.out.println("Thread2");
            countDownLatch.countDown();//2-1=1
            System.out.println("Thread2执行完毕");
        }).start();
        new Thread(() -> {
            System.out.println("Thread3");
            countDownLatch.countDown();//1-1=0
            System.out.println("Thread3执行完毕");
        }).start();
        countDownLatch.await();
    }
输出--------------------
Thread1
Thread2
Thread2执行完毕
Thread1执行完毕
Thread3
Thread3执行完毕
-----------不会结束

并发编程学习(5)Condition

Condition

在前面学习 synchronized 的时候,有wait/notify 的基本使用,结合 synchronized 可以实现对线程的通信。那么,既然 J.U.C 里面提供了锁的实现机制,那 J.U.C 里面应该也有提供线程通信的机制,Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。