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的通信次数。
这次的博客就到这里结束了,本来还想写点订阅/发布的,结果自己也不太会,就不出来丢人了.......谢谢能看完。