"事务 multi sadd key value sadd key value ··· exec (还能保证一个事务内的命令不被其他命令插入,如 A 执行几条命令,B 执行 1 条命令,使用事务防止 B 插入) 语法错误,若包含语法错误则 exec 后一个命令也不会执行(2.6.5 前会执行正确的命令) 运行时错误,会执 .."

Redis 进阶

本贴最后更新于 439 天前,其中的信息可能已经东海扬尘

事务

multi sadd key value sadd key value ··· exec (还能保证一个事务内的命令不被其他命令插入,如 A 执行几条命令,B 执行 1 条命令,使用事务防止 B 插入)

语法错误,若包含语法错误则 exec 后一个命令也不会执行(2.6.5 前会执行正确的命令) 运行时错误,会执行正确的命令

redis 没有提供回滚功能,所以执行出错需要手动处理错误

watch 命令 对一个或多个键进行监控,持续到 exec 命令,一旦其中一个键被修改或删除,则事务不会执行 如果想取消监控,可以使用 unwatch

过期时间

expire key seconds 为一个键设置过期时间 成功返回 1 键不存在或失败返回 0 ttl key 返回键剩余时间 -2 表示不存在 -1 表示永久存在(2.6 版本中,不存在还是没有过期时间都是 -1) 取消过期时间 1 persist key 成功清除返回 1 否则 0 2 为键重新赋值 3 再次 expire 会覆盖 其它 incr hset lpush 等均无效

pexpire pttl 用法一样 单位为毫秒 Tips 如果 watch 监测了一个有过期时间的键 键到期被删除 不会认为键被改变 两个不常用的命令 expireat pexpireat 以 unix 时间为单位 后者为毫秒级

可以用来实现访问频率限制

缓存功能

大量使用缓存且过期时间过长会导致 redis 占满内存 可以修改配置文件中 maxmemory 单位为字节 根绝 maxmemory-policy 删除不需要的键直到 redis 内存小于指定内存 volatile-lru 随机 lru 删带过期时间 allkeys-lru 随机 lru 删 v-random 随机删带过期时间 a-random 随机删 v-ttl 删过期时间最近 noeviction 报错 LRU 最近最少使用算法 (感谢操作系统中学到过) (maxmemory samples 设置实际数量,默认为 3 Redis 并不会准确删,每次随机 3 个按上述方案删)

Sort 命令

如果集合,列表 有序集合中元素可以排序 可使用 sort 进行排序 对有序集合排序会忽略分数 sort key alpha 参照字典顺序排序非数字元素 如果不加 alpha 则尝试转换为双精度浮点数来比较,转换失败报错 sort key desc limit 1 2 默认从小到大 desc 倒序 limit 同 mysql

By 命令

sort key by post:->time ( 表示为键名 -> 字段名)必须在 -> 前,之后的会被当做常量处理,但并不会被判定为常量参考键,会按元素本身大小排列。 对每个元素的值替换参考键中的第一个并获取值在排序 也可以是字符串 sort key by item: 当参考键不包含 * 即为常量时 返回结果与 lrange 相同 如果参考值相同会再比较本身的值 参考键不存在默认为 0

未完待续 更了更了

Get 命令

使 sort 命令返回结果不在是元素自身的值,而是 get 指定的键值。 sort tag:ruby:post by post:->time desc get post:->title get post:*->time get # get #返回元素本身的值

Store 命令

默认 sort 会直接返回结果 可使用 store 保存结果 sort tag:ruby:post by post:->time desc get post:->title get post:*->time get # store sort.result 保存后键为列表类型 返回结果的个数 键已存在 会覆盖

sort 是 Redis 中最强大复杂的命令之一,复杂度为 O(n+mlog(m)) n 表示排序列表个数,m 表示返回的个数 会建立一个长度为 n 的临时容器来储存排序元素 当 n 太大时,会影响性能 注意 3 点 1 使集合中元素尽可能少 2 使用 limit 限制获取结果数量 3 排序的数据量较大时,使用 store 保存

Redis 任务队列

任务队列 相当于生产 / 消费模式 可以做到松耦合 方便系统进行扩展 降低单台服务器负载

BRPOP 与 RPOP 类似,区别为当 列表中没有元素时,会阻塞连接 直到有新元素加入 或超时 超时返回 nil BRPOP queue 0 0 代表永不超时 BLPOP 类似

优先级队列 BRPOP 可同时接受多个键 如 BRPOP queue1 queue2 queue3 如果不止一个键存在元素 则 从左往右取第一个

发布 / 订阅模式

publish channel hi 返回接受到消息的订阅者数量 subscribe channel1 channnel2 可同时订阅多个频道 执行后进入订阅模式 只可以执行 subscribe unsbscribe psubscribe punsubscribe 返回 3 个值 1 subscribe 订阅成功反馈 第二个值为订阅成功频道名 第三个为当前客户端订阅数量 2 message 第二个值表示产生消息的频道名 第三个为内容 3 unsubscribe 取消成功反馈 第二个值为对应频道名 第三个为当前订阅数量 0 时会退出订阅模式

unsubscribe 可以取消多个频道 不指定参数取消所有

前面多两个 p 命令 指定参数时可以使用 glob 风格通配符,可以重复订阅多个频道 p 命令与 s 命令订阅 退订 互不干扰 p * 无法匹配到 p xxx.* 匹配时为严格字符串匹配

管道

减少往返时延 当一组命令不依赖之前命令结果时 可使用管道发出 JRedis 时可采用

节省空间

精简键名键值 但不可过简 不易维护 也容易冲突

内部编码优化 object encoding key 可查看

Redis 启动时会预先建立 0 到 9999 数字的对象 之后存 id 时会指向这些地址 节约空间 当配置参数 maxmemory 后 不会使用共享对象 因为每个键值都要单独记录 lru

到此为止,绝大多数命令已经介绍完毕。

下期预告 JRedis 实战

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    118 引用 • 202 回帖 • 879 关注
  • 命令
    14 引用 • 14 回帖
感谢    关注    收藏    赞同    反对    举报    分享
回帖    
请输入回帖内容...