Command
keys * 查出所有的key出来,会抢占,站资源。 set key value 插入redis键值对 setex key time value 设置过期的Redis键值对。 中间的time表示时间,单位:秒数 get key : 查看可以得值是多少 ttl key : 查询Key的过期时间 -1表示永久有效。 -2表示不能存在 exists key : 查看指定的key是否存在
常用命令
1 ) 连接操作命令quit: 关闭连接( connection)auth: 简单密码认证help cmd: 查看cmd帮助, 例如: help quit2) 持久化save: 将数据同步保存到磁盘bgsave: 将数据异步保存到磁盘lastsave: 返回上次成功将数据保存到磁盘的Unix时戳shundown: 将数据同步保存到磁盘, 然后关闭服务3) 远程服务控制info: 提供服务器的信息和统计monitor: 实时转储收到的请求slaveof: 改变复制策略设置config: 在运行时配置Redis服务器4) 对value操作的命令exists(key): 确认一个key是否存在del(key): 删除一个keytype(key): 返回值的类型keys(pattern): 返回满足给定pattern的所有keyrandomkey: 随机返回key空间的一个keyrename(oldname, newname): 重命名keydbsize: 返回当前数据库中key的数目expire: 设定一个key的活动时间( s)ttl: 获得一个key的活动时间select(index): 按索引 查询move(key, dbindex): 移动当前数据库中的key到dbindex数据库flushdb: 删除当前选择数据库中的所有keyflushall: 删除所有数据库中的所有key5) Stringset(key, value): 给数据库中名称为key的string赋予值valueget(key): 返回数据库中名称为key的string的valuegetset(key, value): 给名称为key的string赋予上一次的valuemget(key1 , key2,…, key N): 返回库中多个string的valuesetnx(key, value): 添加string, 名称为key, 值为valuesetex(key, time, value): 向库中添加string, 设定过期时间timemset(key N, value N): 批量设置多个string的值msetnx(key N, value N): 如果所有名称为key i的string都不存在incr(key): 名称为key的string增1 操作incrby(key, integer): 名称为key的string增加integerdecr(key): 名称为key的string减1 操作decrby(key, integer): 名称为key的string减少integerappend(key, value): 名称为key的string的值附加valuesubstr(key, start, end): 返回名称为key的string的value的子串6) Listrpush(key, value): 在名称为key的list尾添加一个值为value的元素lpush(key, value): 在名称为key的list头添加一个值为value的 元素llen(key): 返回名称为key的list的长度lrange(key, start, end): 返回名称为key的list中start至end之间的元素ltrim(key, start, end): 截取名称为key的listlindex(key, index): 返回名称为key的list中index位置的元素lset(key, index, value): 给名称为key的list中index位置的元素赋值lrem(key, count, value): 删除count个key的list中值为value的元素lpop(key): 返回并删除名称为key的list中的首元素rpop(key): 返回并删除名称为key的list中的尾元素blpop(key1 , key2,… key N, timeout): lpop命令的block版本。brpop(key1 , key2,… key N, timeout): rpop的block版本。rpoplpush(srckey, dstkey): 返回并删除名称为srckey的list的尾元素, 并将该元素添加到名称为dstkey的list的头部7) Setsadd(key, member): 向名称为key的set中添加元素membersrem(key, member) : 删除名称为key的set中的元素memberspop(key) : 随机返回并删除名称为key的set中一个元素smove(srckey, dstkey, member) : 移到集合元素scard(key) : 返回名称为key的set的基数sismember(key, member) : member是否是名称为key的set的元素sinter(key1 , key2,…key N) : 求交集sinterstore(dstkey, (keys)) : 求交集并将交集保存到dstkey的集合sunion(key1 , (keys)) : 求并集sunionstore(dstkey, (keys)) : 求并集并将并集保存到dstkey的集合sdiff(key1 , (keys)) : 求差集sdiffstore(dstkey, (keys)) : 求差集并将差集保存到dstkey的集合smembers(key) : 返回名称为key的set的所有元素srandmember(key) : 随机返回名称为key的set的一个元素8) Hashhset(key, field, value): 向名称为key的hash中添加元素fieldhget(key, field): 返回名称为key的hash中field对应的valuehmget(key, (fields)): 返回名称为key的hash中field i对应的valuehmset(key, (fields)): 向名称为key的hash中添加元素fieldhincrby(key, field, integer): 将名称为key的hash中field的value增加integerhexists(key, field): 名称为key的hash中是否存在键为field的域hdel(key, field): 删除名称为key的hash中键为field的域hlen(key): 返回名称为key的hash中元素个数hkeys(key): 返回名称为key的hash中所有键hvals(key): 返回名称为key的hash中所有键对应的valuehgetall(key): 返回名称为key的hash中所有的键( field) 及其对应的value9)其他设置从服务器SLAVEOF xxx.xxx.xxx.xxx 6379解除主从关系SLAVEOF NO ONE修改某个配置config set xxxxx xxxxx获得某个配置config get xxxx.xxx将配置回写文件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 [某银行的方案]
实践

Infomation
- Basic
- 架构
- 持久化
- 命令
- 规范
- 优化
- 开发
- other
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
