Redis-不懂这些基本概念别说你用过

数据类型:

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 被其他命令所改动,那么事务将被打断。

你可能感兴趣的:(Redis-不懂这些基本概念别说你用过)