共计 3051 个字符,预计需要花费 8 分钟才能阅读完成。
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)集群伸缩:将槽和数据移动到不同的节点上。