Redis学习三(进阶功能).
2019-10-22 11:18
阅读目录
127.0.0.1:6379> sadd uid 1 2 3 4 127.0.0.1:6379> mset user_name_1 admin user_level_1 9999 127.0.0.1:6379> mset user_name_2 jack user_level_2 10 127.0.0.1:6379> mset user_name_3 peter user_level_3 25 127.0.0.1:6379> mset user_name_4 mary user_level_4 70
首先,直接利用集合内的元素做排序操作:
127.0.0.1:6379> sort uid 1) "1" 2) "2" 3) "3" 4) "4"
接着,我们来试试 [BY pattern] 和 [GET pattern [GET pattern ...]] 操作:
127.0.0.1:6379> sort uid by user_name_* get # get user_name_* get user_level_* alpha 1) "1" 2) "admin" 3) "9999" 4) "2" 5) "jack" 6) "10" 7) "4" 8) "mary" 9) "70" 10) "3" 11) "peter" 12) "25"
这个语句有点晦涩,试着这么理解 “by user_name_* ”, user_name_* 是一个占用符,它先取出 uid 中的值,然后再用这个值拼接成外部键,而真正进行排序的正是这些外部键值;“get # get user_name_* get user_level_* ” 的含义也可以这么理解,get # 表示返回自己元素,[get pattern] 表示返回外部键值。
二、事务
redis 的事务机制主要是由下面的几个指令来完成:
- multi:标记一个事务块的开始
- exec:执行所有事务块中的命令
- discard:取消事务,放弃执行事务块中的所有指令
- watch key [key...]:监视一个或多个 key,如果在事务执行之前这个(或这些key)被其他命令所改动,这个改动也被称为 CAS 错误,那么事务将被打断
- unwatch:取消 watch 命令对所有 key 的监视
当 redis 接受到 multi 指令时,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中;当从连接受到 exec 命令后,redis 会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给 client。然后此连接就结束事务上下文。
redis 将是否有 watch 命令分为普通类型事务和 CAS(Check And Set)类型事务,无 watch 命令的为普通类型事务,有 watch 命令的为 CAS类型事务。
事务失败的原因可以分为静态错误(如不存在的命令)和运行时错误(如 CAS 错误、对 string 用 lpop 操作等)。静态错误会在提交 exec 时返回错误信息,使事务不能执行;而除 CAS 以外的运行时错误不会阻止事务继