数据类型:
String、list、set、hash、zset、Pub/Sub、Transactions
特性:
1.速度极快。官方给出的数据是 10 万次 ops 的读写,这主要归功于这些数据都存在于内存中。由于 Redis 是开源的,当你打开源代码,就会发现 Redis 都是用 C 语言写的,C 语言是最接近计算机语言的代码,而且只有区区 5 万行,保证了 Redis 的速度。同时一个 Redis 只是一个单线程,其真正的原因还是因为单线程在内存中是效率最高的。
2.持久化。Redis 的持久化可以保证将内存中的数据每隔一段时间就保存于磁盘中,重启的时候会再次加载到内存。持久化方式是 RDB 和 AOF。
3.支持多种数据结构。分别支持哈希、集合、BitMaps,还有位图(多用于活跃用户数等统计)、HyperLogLog(超小内存唯一值计数,由于只有 12K,是有一定误差范围的)、GEO(地理信息定位)。
4.支持多种编程语言。支持Java、PHP、Python、Ruby、Lua、Nodejs。
5.功能丰富。如发布订阅、Lua 脚本、事务、Pipeline(管道,即当指令到达一定数量后,客户端才会执行)。
6.简单。不依赖外部库、单线程、只有 23000 行 Code。
7.主从复制。主节点的数据做副本,这是做高可用的基石。
8.高可用和分布式。Redis-Sentinel(v2.8)支持高可用,Redis-Cluster(v3.0)支持分布式。
使用场景:
1.缓存系统。这是 Redis 使用最多的场景。Redis 能够替代 Memcached,让你的缓存从只能存储数据变得能够更新数据,因此你不再需要每次都重新生成数据。
2.计数器。如转发数、评论数,有了原子递增(Atomic Increment),你可以放心的加上各种计数,用GETSET重置,或者是让它们过期。
3.消息队列系统。虽然 Kafka 更强,但是简单的可以使用 Redis。运行稳定并且快速,支持模式匹配,能够实时订阅与取消频道。
4.排行榜及相关问题。实际就是一种有序集合。
5.社交网络。Redis 可以非常好地与社交网络相结合,如新浪微博、Twiter等,比如QQ和用户交互的时候,用户和状态消息将会聚焦很多有用的信息,很多交互如实时聊天就是通过 Redis 来实现的。
6.按照用户投票和时间排序。Reddit 的排行榜,得分会随着时间变化。LPUSH 和 LTRIM 命令结合运用,把文章添加到一个列表中。一项后台任务用来获取列表,并重新计算列表的排序,ZADD 命令用来按照新的顺序填充生成列表。列表可以实现非常快速的检索,即使是负载很重的站点。
7.过期项目处理。通过 Unix 时间作为关键字,用来保持列表能够按时间排序。对 currenttime 和 timeto_live 进行检索,完成查找过期项目的艰巨任务。另一项后台任务使用 ZRANGE...WITHSCORES 进行查询,删除过期的条目。
8.实时系统。使用位图来做布隆过滤器,例如实现垃圾邮件过滤系统的开发变的非常容易。
常用命令:
1.字符串 String
GET、SET 和DEL
这是 Redis 最简单的命令,如果你要得到一个 value 的值,只需要 GET key,就 ok 了。如果你要设置某个 key 的值,那就 SET key value,搞定。
INCR、DECR、INCRBY、DECRBY
INCR key:就是 key 自增 1,不存在,自增后 get(key)=1;
DECR key:就是 key 自减 1,不存在,自减后返回 -1;
INCRBY key k:自增 k ,不存在,则返回 k;
DECRBY key k:自减 k 。
SET、SETNX、SET xx
SET key value:不管 key 是否存在,都设置;
SETNX key value:key 不存在,才设置(相当于 add);
SET key value xx:key 存在,才设置(相当于 update)。
MGET、MSET
MGET key1 key2 key3 ...:批量获取 key,原子操作;
MSET key1 val2 key2 val2 key3 val3:批量设置 key-value。
实际开发的过程中,我们通常使用 MGET,因为 MGET 只有 1 次网络时间和 n 次命令时间。但是如果你使用 GET 的话,就是 n 次网络时间和 n 次命令时间。
GETSET、APPEND、STRLEN
GETSET key newvalue:set key newvalue 并返回旧的 value,旧的 value 会被删除;
APPEND key value:将 value 追加到旧的 value 上;
STRLEN key:返回字符串的长度(注意中文)。
INCRBYFLOAT、GETRANGE、SETRANGE
INCRBYFLOAT key 3.5:在 key 上追加对应的值 3.5;
GETRANGE key start end:获取字符串指定下标所有的值;
SETRANGE key index value:设置指定下标所有对应的值。
2.哈希 Hash:相当于 value 是一个 Map,里面的所有属性我们都可以单独新增、修改或者删除,而不需要像字符串那样全部覆盖操作。
HGET、HSET、HGETALL
HGET key field:获取存储在哈希表中指定字段的值。
HSET key field value:将哈希表 key 中的字段 field 的值设为 value。
HGETALL key:获取在哈希表中指定 key 的所有字段和值,生产环境不常用。
3.列表 List
LPUSH、RPUSH、LPOP、RPOP、LRANGE
LPUSH key value1 [value2]:将一个或多个值插入到列表头部;
RPUSH key value1 [value2]:在列表中添加一个或多个值;
LPOP key:移出并获取列表的第一个元素;
RPOP key:移除并获取列表最后一个元素;
LRANGE key start stop:获取列表指定范围内的元素。
4.集合 Set
SADD、SCARD、SNENVERS、SPOP
SADD key member1:向集合添加一个或多个成员;
SCARD key:获取集合的成员数;
SMEMBERS key:返回集合中的所有成员;
SPOP key:移除并返回集合中的一个随机元素。
5.Sorted Set 有序集合:和 Set 最大的不同是Sorted Set是自动排序的。
ZADD、ZRANGE、ZREM、ZCARD
ZADD key score1 member1:向有序集合添加一个或多个成员,或者更新已存在成员的分数;
ZRANGE key start stop:通过索引区间返回有序集合成指定区间内的成员;
ZREM key member:移除有序集合中的一个或多个成员;
ZCARD key:获取有序集合的成员数。
6.Pub/Sub 发布订阅:即发布(Publish)与订阅(Subscribe),你可以设定对某一个 key 值进行消息发布及消息订阅,当 key 的值进行了消息发布后,所有订阅它的客户端都会收到相应的消息,这类似于 QQ、微信。
PSUBSCRIBE、PUBSUB、PUBLISH、SUBSCRIBE
PSUBSCRIBE pattern:订阅一个或多个符合给定模式的频道;
PUBSUB subcommand:查看订阅与发布系统状态;
PUBLISH channel message:将信息发送到指定的频道;
SUBSCRIBE channel:订阅给定的一个或多个频道的信息;
UNSUBSCRIBE [channel [channel ...]]:指退订给定的频道。
7.Transactions 事务:Redis 提供了 WATCH 命令,可以对某个 key 来 watch 一下,然后再执行 Transactions。如果这个被Watch 的值进行了修改,那么这个 Transactions 会发现并拒绝执行。
MULTI、EXEC、DISCARD
MULTI:标记一个事务块的开始;
EXEC:执行所有事务块内的命令;
DISCARD:取消事务,放弃执行事务块内的所有命令;
UNWATCH:取消 WATCH 命令对所有 key 的监视;
WATCH key:监视 key,如果在事务执行之前 key 被其他命令所改动,那么事务将被打断。