乐趣区

Redis概述

1.Redis 的安装

目前最新的版本:5.0

windows 下载:

linux 下载:

2. 常用的数据操作命令

(1)setnx

当 key 已经存在,再去设置值会返回 0,表示设置失败,只有当 key 不存在的时候,才能设置成功并返回 1。
应用场景:分布式锁

    /**
     * setnx
     */
    @Test
    public void testSetnx() {final Jedis jedis = new Jedis("127.0.0.1",6379);
        final CountDownLatch latch = new CountDownLatch(2);

        Thread t1 = new Thread(new Runnable() {public void run() {System.out.println("t1 begin");
                jedis.setnx("hello","world");
                System.out.println("t1" + jedis.get("hello"));
                try {Thread.sleep(5000);
                } catch (InterruptedException e) {e.printStackTrace();
                }
                jedis.del("hello");
                latch.countDown();}
        });
        Thread t2 = new Thread(new Runnable(){public void run() {System.out.println("t2 begin");
                long result = 0;
                while(result == 0) {result = jedis.setnx("hello","world222");
                    System.out.println("t2" + jedis.get("hello"));
                }

                latch.countDown();}
        });

        t1.start();
        t2.start();

        try {latch.await();
            System.out.print("end");
        } catch (Exception e) {e.printStackTrace();
        }finally {jedis.close();
            System.out.println("close");
        }
    }
(2)incr,decr,incrby,decrby

incr: 表示每次加 1.
decr: 表示每次减 1,
incrby: 表示增加指定的数目
decrby: 表示减少指定的数目
应用场景:计数

    /**
     * incr 对值进行自增
     */
    @Test
    public void testIncrby() {Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.incr("count");
        jedis.incrBy("count",10);
        System.out.println(jedis.get("count"));
        jedis.close();}
(3) lpush+lpop=Stack(栈)和 lpush+rpop=Queue(队列)

Redis 的 list 数据结构是既能从头部 (lpush) 插入,也能从尾部插入 (rpush), 既能从头部删除(lpop), 也能从尾部删除(rpop). 从头部(lpush) 插入,再从头部 (lpop) 删除就相当于一个栈;从头部插入 (lpush), 再从尾部删除(rpop) 就相当于一个队列。

    @Test
    public void testListPush() {Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.del("list");
        jedis.rpush("list","one","two","three","four");
        jedis.rpop("list");

        List<String> list =  jedis.lrange("list",0,7);
        for(int i = 0;i < list.size();i++) {System.out.println(list.get(i));
        }
        
        jedis.close();}

其他类似的操作:
rpush+rpop=Stack(栈)
rpush+lpop=Queue(队列)

(4)sinter,sunion 和 sdiff

sinter 是计算两个 set 集合的交集
sunion 是计算两个 set 集合的并集
sdiff 是计算两个 set 集合的差集

应用场景:通过 sinter 可以找到两个事物共同的属性,类似两个人有什么共同的兴趣爱好。

(5)spop,srandmember

srandmember 是随机生成一个数 (可以指定个数)
spop 是随机弹出一个数
应用场景:产生随机数,

(6)zrank,zrange

zrank 是查询指定 zset 集合的指定成员的排名
zrange 是对指定 zset 集合的成员进行排序

3. 持久化

持久化是指将数据存储在硬盘中,当服务器重启的时候,可以进行数据的恢复。
Redis 的持久化分为两种,一种是 RDB, 另外一种是 AOF

(1)RDB

a. 触发机制

  • save: 堵塞当前的 Redis 服务器,直至完成 RDB 过程。
  • bgsave:Redis 进程执行 fork 操作创建一个子进程来完成 RDB 过程,堵塞时间发生在 fork 操作的过程。

b.bgsave 的运作流程

c.redis 的配置文件关于 RDB 的操作

# 在 900 秒内至少有一个 key 值发生变化
save 900 1 
#在 300 秒内至少有 10 个 key 值发生变化
save 300 10
#在 60 秒内至少有 10000 个 key 值发生变化
save 60 10000
#如果启用了 RDB 并且最近的一次后台保存失败,Redis 会停止接收写操作。stop-writes-on-bgsave-error yes
#是否使用 LZF 压缩字符串对象
rdbcompression yes
#存储快照后,是否使用 CRC64 算法进行数据检验
rdbchecksum yes
#设置快照文件名称
dbfilename dump.rdb
#设置快照文件的存放文件夹
dir ./

参考资料:
https://www.cnblogs.com/ysoce…

(2)AOF

a. 执行策略
以独立日志的方式记录每次写命令,重启的时候再重新执行 AOF 文件以恢复数据。

b.AOF 的工作流程

c. 配置文件关于 AOF 的配置
https://www.cnblogs.com/ysoce…

(3)RDB 和 AOF 的优缺点对比

4. 主从复制

5. 哨兵模式

(1)哨兵节点会对主节点,从节点和其他的哨兵节点进行监控。
(2)哨兵节点会每隔一段时间向主节点,从节点和哨兵节点发送命令,当一个节点在指定的时间内没有进行回复,就认为这个节点不可用,因为是一个节点的判断,所以称为主观下线。
(3)当认为不可用的节点是主节点时,哨兵节点会询问其他哨兵节点的意见,如果超过半数的节点认为这个节点不可用,就会认为是客观下线。
(4)主观下线之后,这个哨兵节点就会向其他哨兵节点发送想成为领导者的请求,获得多数票的哨兵节点就会成为领导者。
(5)领导者会对客观下线的主节点进行故障转移,选择一个从节点作为新的主节点,让其余的从节点跟随新的主节点,原本的主节点在恢复后也跟随新的主节点。

6. 集群模式

(1)集群是以槽为单位,每个节点分配一定数量的槽,将数据按照一定的计算规则存储在指定的槽中,也就存储在指定的节点中。
(2)meet 消息:有新的节点加入集群。
ping 消息: 相当于一个 request 请求,检测节点是否在线和交换彼此状态信息。
pong 消息:相当于一个 response 请求。回复给发送方确认消息正常通信。
fail 消息:更新节点下线状态。

(3)集群伸缩:将槽和数据移动到不同的节点上。

退出移动版