1.Redis的安装

目前最新的版本:5.0

windows下载:

linux下载:

2.常用的数据操作命令

(1)setnx

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

    /**
     * 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,decr,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)就相当于一个队列。
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可以找到两个事物共同的属性,类似两个人有什么共同的兴趣爱好。
sinter+sunion+sdiff

(5)spop,srandmember

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

(6)zrank,zrange

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

3.持久化

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

(1)RDB

a.触发机制

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

b.bgsave的运作流程
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的工作流程
AOF的工作流程

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

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

4.主从复制

5.哨兵模式

clipboard.png

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

6.集群模式

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


bluesnail95
69 声望6 粉丝

Java开发工程师