Redis事务、过期时间、排序、消息、管道

1:事务,Redis中的事务是一组命令的集合,事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。

MULTI开启事务,EXEC关闭事务

redis> MULTI
redis> SET key1 value1
redis> QUEUED
redis> SET key2 value2
redis> QUEUED
redis> EXEC

EXEC命令的返回值就是这些命令的返回值组成的列表,返回值顺序和命令的顺序相同。

事务中的错误处理: 分为语法错误和运行错误

1)语法错误指命令不存在或者命令参数的个数不对,只要有一个语法错误,不管语句顺序如何,即使在错误语句前面的语句都正确,执行EXEC命令后Redis就会直接返回错误,连正确的命令也不会执行。

2)运行错误指在命令执行时出现的错误,比如使用不同数据类型的命令操作同一个key,这种错误在Redis执行之前是不会被发现的。如果事务里的一条命令出现的运行错误,事务里其他的命令依然会继续执行(包括错误语句之后的命令)。

Redis中没有回滚功能,所以要注意不要发生运行错误

 2过期时间,Redis中可以使用EXPIRE命令设置一个键的过期时间,到时间后Redis会将其自动删除

redis> EXPIRE key seconds

 seconds参数表示键的过期时间,单位是秒。注意,不能使用表达式,比如15分钟不能写成15*60,而是900

 

返回值:返回1表示设置成功,0表示失败

使用TTL命令可以查看一个键还有多久过期

redis> TTL key

返回值是单位秒,如果键没有设置过期时间则返回-1,当键不存在时返回-2。

如果想要取消键的过期时间设置,可以使用PERSIST命令。

redis> PERSIST key

返回值:过期时间被成功清除返回1;否则返回0(当键不存在或本身就是永久的)。

除了PERSIST以外,使用SET或者GETSET命令为键赋值也会清除键的过期时间(使用string数据类型的赋值方式,覆盖了原来的键),

还有一个命令为PEXPIRE,区别是PEXPIRE使用毫秒为单位

另外两个不常用的命令:EXPIREAT,PEXPIREAT;他们使用UNIX时间表示键的过期时间

redis> PEXPIRE key 1000(毫秒)
redis> EXPIREAT key seconds
redis> PEXPIREAT key milliseconds

如果用WATCH命令监控了一个拥有过期时间的key,当key到期自动清除时,不会被WATCH认为发生了修改

 

 3:排序,Redis提供了SORT命令对列表类型、集合类型和有序集合类型键进行排序。

 排序命令如下:(redis命令与下面的介绍需一对一对照看)

1 redis> SORT key [ASC/DESC] [LIMIT offset count] [STORE deskey]
2 redis> SORT key [ALPHA] [ASC/DESC] [LIMIT offset count] [STORE deskey]
3 redis> SORT key1 BY key2:*->field [ASC/DESC] [LIMIT offset count] [STORE deskey]
4 redis> SORT key1 BY key2:*->field [ASC/DESC] GET key3:*->field1 
             [GET key3:*->field2...] [LIMIT offset count] [STORE deskey]
 1)如果集合中有非数字类型,SORT会报错,集合中可以有小数。这种命令方式只对数字进行排序,LIMIT限制返回数量为count,offset表示跳过前offset个元素。STORE将结果存到指定键,该键是list类型,如果键已经存在则覆盖原来的键,不论原key是什么类型,即使是string也会覆盖。

 2)添加ALPHA后,实现按字典顺序排列非数字元素,1-9A-Za-z,数字部分不再按照大小排序,而是对每一位数字的大小做比较(比如2排在12的后面)。

 3)BY后面的键为参考键,参考键可以是字符串类型键或散列类型键的某个字段(key->field表示),当有BY参数时,将使用key1中每个元素的值替换"*"符号,并获取对应键的指定的字段值,然后对这个值进行排序,再映射至key1中,完成对key1的排序。当key2中不含"*"时,SORT不会执行排序命令;当参考键不存在时,会默认参考键的值为0。

 4)对key1完成排序后,再代入key3:*中,更快的获取需要的元素;可以使用多个GET获取多个值,如果还想获取key1对应的值,可以使用GET #,他返回元素本身的值。

上述几种排序方法,STORE会返回添加的元素数量,2 3 返回排序后的key1,4返回排序后的key1在key3中所查询的值

 4:消息,即队列

redis>BRPOP key seconds
redis>BLPOP key seconds

 名字很容易理解,阻塞的list,弹出元素。第一个参数是键名;第二个参数是超市时间,单位为秒。若超过指定时间仍未取得元素则返回nil。0表示不限制等待时间

可以通过list实现优先级队列:

redis> BRPOP list1 list2 list3 ...
redis> BLPOP list1 list2 list3 ...

 可以同时设置多个队列,即同时检测多个键,如果都能取得元素,则优先从list1中取。(将优先级高的列表放在优先级低的前面,便可以实现优先级队列)

 5:管道,优化redis,减少tcp收发总耗时

Jedis jedis = new Jedis("127.0.0.1", 6379);
Pipeline pipeline = jedis.pipelined();
for (int i = 0; i < 10000; i++){
    pipeline.incr("key");
}
pipeline.sync();

 不再是单条命令发送,而是批量发送。减少了客户端与Redis的通信次数。

 

 这次的博客就到这里结束了,本来还想写点订阅/发布的,结果自己也不太会,就不出来丢人了.......谢谢能看完。

猜你喜欢

转载自zk-chs.iteye.com/blog/2255039
今日推荐