目前最新的版本:5.0
windows下载:
linux下载:
当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"); } }
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(); }
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(队列)
sinter 是计算两个set集合的交集
sunion 是计算两个set集合的并集
sdiff 是计算两个set集合的差集
应用场景:通过sinter可以找到两个事物共同的属性,类似两个人有什么共同的兴趣爱好。
srandmember 是随机生成一个数(可以指定个数)
spop 是随机弹出一个数
应用场景:产生随机数,
zrank 是查询指定zset集合的指定成员的排名
zrange 是对指定zset集合的成员进行排序
持久化是指将数据存储在硬盘中,当服务器重启的时候,可以进行数据的恢复。
Redis的持久化分为两种,一种是RDB,另外一种是AOF
a.触发机制
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...a.执行策略
以独立日志的方式记录每次写命令,重启的时候再重新执行AOF文件以恢复数据。
b.AOF的工作流程
c.配置文件关于AOF的配置
https://www.cnblogs.com/ysoce...
(1)哨兵节点会对主节点,从节点和其他的哨兵节点进行监控。
(2)哨兵节点会每隔一段时间向主节点,从节点和哨兵节点发送命令,当一个节点在指定的时间内没有进行回复,就认为这个节点不可用,因为是一个节点的判断,所以称为主观下线。
(3)当认为不可用的节点是主节点时,哨兵节点会询问其他哨兵节点的意见,如果超过半数的节点认为这个节点不可用,就会认为是客观下线。
(4)主观下线之后,这个哨兵节点就会向其他哨兵节点发送想成为领导者的请求,获得多数票的哨兵节点就会成为领导者。
(5)领导者会对客观下线的主节点进行故障转移,选择一个从节点作为新的主节点,让其余的从节点跟随新的主节点,原本的主节点在恢复后也跟随新的主节点。
(1)集群是以槽为单位,每个节点分配一定数量的槽,将数据按照一定的计算规则存储在指定的槽中,也就存储在指定的节点中。
(2)meet消息:有新的节点加入集群。
ping消息:相当于一个request请求,检测节点是否在线和交换彼此状态信息。
pong消息:相当于一个response请求。回复给发送方确认消息正常通信。
fail消息:更新节点下线状态。
(3)集群伸缩:将槽和数据移动到不同的节点上。