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)集群伸缩:将槽和数据移动到不同的节点上。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。