Command

keys * 查出所有的key出来,会抢占,站资源。 set key value 插入redis键值对 setex key time value 设置过期的Redis键值对。 中间的time表示时间,单位:秒数 get key : 查看可以得值是多少 ttl key : 查询Key的过期时间 -1表示永久有效。 -2表示不能存在 exists key : 查看指定的key是否存在

常用命令

  1. 1 连接操作命令
  2. quit 关闭连接( connection
  3. auth 简单密码认证
  4. help cmd 查看cmd帮助, 例如: help quit
  5. 2 持久化
  6. save 将数据同步保存到磁盘
  7. bgsave 将数据异步保存到磁盘
  8. lastsave 返回上次成功将数据保存到磁盘的Unix时戳
  9. shundown 将数据同步保存到磁盘, 然后关闭服务
  10. 3 远程服务控制
  11. info 提供服务器的信息和统计
  12. monitor 实时转储收到的请求
  13. slaveof 改变复制策略设置
  14. config 在运行时配置Redis服务器
  15. 4 value操作的命令
  16. exists(key): 确认一个key是否存在
  17. del(key): 删除一个key
  18. type(key): 返回值的类型
  19. keys(pattern): 返回满足给定pattern的所有key
  20. randomkey 随机返回key空间的一个
  21. keyrename(oldname, newname): 重命名key
  22. dbsize 返回当前数据库中key的数目
  23. expire 设定一个key的活动时间( s
  24. ttl 获得一个key的活动时间
  25. select(index): 按索引 查询
  26. move(key, dbindex): 移动当前数据库中的keydbindex数据库
  27. flushdb 删除当前选择数据库中的所有key
  28. flushall 删除所有数据库中的所有key
  29. 5 String
  30. set(key, value): 给数据库中名称为keystring赋予值value
  31. get(key): 返回数据库中名称为keystringvalue
  32. getset(key, value): 给名称为keystring赋予上一次的value
  33. mget(key1 , key2,…, key N): 返回库中多个stringvalue
  34. setnx(key, value): 添加string 名称为key 值为value
  35. setex(key, time, value): 向库中添加string 设定过期时间time
  36. mset(key N, value N): 批量设置多个string的值
  37. msetnx(key N, value N): 如果所有名称为key istring都不存在
  38. incr(key): 名称为keystring1 操作
  39. incrby(key, integer): 名称为keystring增加integer
  40. decr(key): 名称为keystring1 操作
  41. decrby(key, integer): 名称为keystring减少integer
  42. append(key, value): 名称为keystring的值附加value
  43. substr(key, start, end): 返回名称为keystringvalue的子串
  44. 6 List
  45. rpush(key, value): 在名称为keylist尾添加一个值为value的元素
  46. lpush(key, value): 在名称为keylist头添加一个值为value 元素
  47. llen(key): 返回名称为keylist的长度
  48. lrange(key, start, end): 返回名称为keyliststartend之间的元素
  49. ltrim(key, start, end): 截取名称为keylist
  50. lindex(key, index): 返回名称为keylistindex位置的元素
  51. lset(key, index, value): 给名称为keylistindex位置的元素赋值
  52. lrem(key, count, value): 删除countkeylist中值为value的元素
  53. lpop(key): 返回并删除名称为keylist中的首元素
  54. rpop(key): 返回并删除名称为keylist中的尾元素
  55. blpop(key1 , key2,… key N, timeout): lpop命令的block版本。
  56. brpop(key1 , key2,… key N, timeout): rpopblock版本。
  57. rpoplpush(srckey, dstkey): 返回并删除名称为srckeylist的尾元素, 并将该元素添加到名称为dstkeylist的头部
  58. 7 Set
  59. sadd(key, member): 向名称为keyset中添加元素member
  60. srem(key, member) 删除名称为keyset中的元素member
  61. spop(key) 随机返回并删除名称为keyset中一个元素
  62. smove(srckey, dstkey, member) 移到集合元素
  63. scard(key) 返回名称为keyset的基数
  64. sismember(key, member) member是否是名称为keyset的元素
  65. sinter(key1 , key2,…key N) 求交集
  66. sinterstore(dstkey, (keys)) 求交集并将交集保存到dstkey的集合
  67. sunion(key1 , (keys)) 求并集
  68. sunionstore(dstkey, (keys)) 求并集并将并集保存到dstkey的集合
  69. sdiff(key1 , (keys)) 求差集
  70. sdiffstore(dstkey, (keys)) 求差集并将差集保存到dstkey的集合
  71. smembers(key) 返回名称为keyset的所有元素
  72. srandmember(key) 随机返回名称为keyset的一个元素
  73. 8 Hash
  74. hset(key, field, value): 向名称为keyhash中添加元素field
  75. hget(key, field): 返回名称为keyhashfield对应的value
  76. hmget(key, (fields)): 返回名称为keyhashfield i对应的value
  77. hmset(key, (fields)): 向名称为keyhash中添加元素field
  78. hincrby(key, field, integer): 将名称为keyhashfieldvalue增加integer
  79. hexists(key, field): 名称为keyhash中是否存在键为field的域
  80. hdel(key, field): 删除名称为keyhash中键为field的域
  81. hlen(key): 返回名称为keyhash中元素个数
  82. hkeys(key): 返回名称为keyhash中所有键
  83. hvals(key): 返回名称为keyhash中所有键对应的value
  84. hgetall(key): 返回名称为keyhash中所有的键( field 及其对应的value
  85. 9)其他
  86. 设置从服务器
  87. SLAVEOF xxx.xxx.xxx.xxx 6379
  88. 解除主从关系
  89. SLAVEOF NO ONE
  90. 修改某个配置
  91. config set xxxxx xxxxx
  92. 获得某个配置
  93. config get xxxx.xxx
  94. 将配置回写文件
  95. CONFIG REWRITE

Redis监控

  • Redis Live是一个更通用的 Redis 监控方案, 它的原理是定时在 Redis 上执行 MONITOR 命令, 来获取当前 Redis 当前正在执行 的命令, 并通过统计分析, 生成web页面的可视化分析报表
  • Redis Faina是由著名的图片分享应用 instagram 开发的 Redis 监控服务, 其原理和 Redis Live 类似, 都是对通过 MONITOR 来 做的。
  • redmon是那种一眼看上去就觉得不错的小工具, 而且必然会很轻量级, 目 前它已经支持实时查看Redis的流量, 请求, 配置信息, 命令行操作等功能, 后续还将添加Web端配置修改, 慢日 志查询等功能
  • Redis集群管理工具 Redis: : Sentinel是Redis的作者antirez完成的, 因为Redis实例在各个大公司的应用,每个公司都需要一个Redis集群的管理工具, 被迫都自 己写管理工具来管理Redis集群, antirez考虑到社区的急迫需要(详情), 花了几个星期写出了Redis-sentinel。

持久化(persistence)

Redis提供两种持久化的方式:

  • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照( point-in-time snapshot) 。
  • AOF 持久化记录服务器执行的所有写操作命令, 并在服务器启动时, 通过重新执行这些命令来还原数据集。 AOF文件中的命令全部以 Redis 协议的格式来保存, 新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写( rewrite) , 使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
  • 切换持久化 ``` 在 Redis 2.2 或以上版本,可以在不重启的情况下,从 RDB 切换到 AOF :

    为最新的 dump.rdb 文件创建一个备份。 将备份放到一个安全的地方。 执行以下两条命令:

    redis-cli> CONFIG SET appendonly yes

    redis-cli> CONFIG SET save “”

    确保命令执行之后,数据库的键的数量没有改变。 确保写命令会被正确地追加到 AOF 文件的末尾。

步骤 3 执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。

步骤 3 执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能 ```

特殊介绍

1).RDB 快照 在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自 动保存一次数据集。你也可以通过调用 SAVE 或者 BGSAVE , 手动让 Redis 进行数据集保存操作。 比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1 000 个键被改动”这一条件时, 自 动保存一次数据集: save 60 1 000 这种持久化方式被称为快照(snapshot) 。 2).只进行追加操作的文件( append-only file, AOF)从 1 .1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。你可以通过修改配置文件来打开 AOF 功能:appendonly yes从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET) , 这个命令就会被追加到 AOF 文件的末尾。这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目 的。

3)如果 AOF 文件出错了, 怎么办? 服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错( corrupt) , 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。 当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件: 1 . 为现有的 AOF 文件创建一个备份。 2. 使用 Redis 附带的 redis-check-aof 程序, 对原来的 AOF 文件进行修复。 $ redis-check-aof —fix 3. (可选) 使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,   查看两个文件之间的不同之处。 4. 重启 Redis 服务器, 等待服务器载入修复后的 AOF 文件, 并进行数据恢复。 4)怎么从 RDB 持久化切换到 AOF 持久化 1 . 为最新的 dump. rdb 文件创建一个备份。 2. 将备份放到一个安全的地方。 3. 执行以下两条命令: redis-cli> CONFIG SET appendonly yes redis-cli> CONFIG SET save “ “ 4. 确保命令执行之后, 数据库的键的数量没有改变。 5. 确保写命令会被正确地追加到 AOF 文件的末尾。

技术方案

  • Redis Master/Slave + Redis Sentinel
  • Redis Cluster
  • Redis Master/Slave + HaProxy + Shell
  • Redis Master/Slave + twemproxy(nutcracker)
  • CacheCloud [搜狐开源方案]
  • Redis Master/Slave + F5 [某银行的方案]

实践

Redis - 图1 Redis - 图2

Infomation

Issue

127.0.0.1:6379> FLUSHDB

(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。
解决方案:config set stop-writes-on-bgsave-error no