?
广告
Redis是一个在内存中的键值数据库,它是免费且开源的。它是用C语言实现的,运行速度非常快。Redis已经是一个成熟(现在是3.03版本)的产品了。它经历了非常严酷的战火的洗礼,给大大小小的用户们使用了多年。Redis提供了非常好的文档,以及供各种编程语言使用的用户库。
在本文中,我会带领大家一起探索Redis,学习它的基本用法。
Redis有什么特殊之处?
Redis的速度非常快。要使一个软件运行速度快,最典型的方法就是关注每个细小的功能片,然后玩命地优化它。Redis则不同。它提供的丰富的高级特性能够匹敌甚至超越大多数的键值数据库,但不影响速度。让我们一起快速过一下Redis的特性:
丰富的键值类型:字符串,字典(哈希),集合,位图和hyperlogs 对这些值的高级操作 可选择的持久性 主-从式设置 异步复制 监控哨兵、通过、自动故障处理 事务 发布、订阅消息 自动回收最不常用的键值 自动回收超时的键值 脚本(使用Lua)
Redis的基础用例
Redis可用于多种目的。它作为超快的分布式缓冲区非常棒。但是,它常被当作队列(使用命令对一个list的条目作push和pop)使用,或者利用它的发布-订阅系统实现事件路由器功能。Redis通过它的增量命令来计数。对于需要跟踪最后一条item的用例,Redis提供了一个很好的替代方法,不再需要关系数据库中过多的索引,而只是对项目保持一个修剪列表就可以了。
Redis实践
让我们进一步探索Redis。从这里下载和安装Redis。
linking…
如果你使用的是Mac OSX,我建议使用Homebrew来安装。
然后让我们启动redis。在redis-server终端窗口,你会看见这个:
img…
还有一些可爱的ASCII艺术字。现在,在另一个终端窗口redis-cli。这里少了一些色彩,你会看到这个:
~>redis-cli
127.0.0.1:6379
不管怎样,我们就要开始了。先存一些关键字和值到数据库里去吧。
简单的值
这个例子是关于如何设置和获取简单的字符串型值
127.0.0.1:6379> set k v OK 127.0.0.1:6379> get k "v" 127.0.0.1:6379> get no_such_key (nil)
哇!你已经掌握了Redis的80%了。这是一个非常简单的高速缓存。
那么怎么删除关键字呢?没问题。
127.0.0.1:6379> del k (integer) 1 127.0.0.1:6379> del no_such_key (integer) 0
Redis会告诉有多少个关键字被删除了。
计数
Redis能够支持+1和+n两种计数方式来改变键所对应的值。
127.0.0.1:6379> set counter 0 OK 127.0.0.1:6379> incr counter 1 (integer) 1 127.0.0.1:6379> incrby counter 3 (integer) 4
“incrby”命令表示+n。因此,你想加多少都可以。redis还可以返回增加后计数器的值。
通过把n设置为负数,你也可以实现向下计数。
127.0.0.1:6379> incrby counter -2 (integer) 2
计数器的操作是原子操作,这对多用户环境来说很重要。
浏览关键字
如果你想知道哪些关键字是可用的,你可以使用命令”keys”结合模型匹配:
127.0.0.1:6379> set k1 1 OK 127.0.0.1:6379> set k2 2 OK 127.0.0.1:6379> keys k* 1) "k1" 2) "k2"
lists
redis不只是可以存储简单的字符串和数字。让我们来看一下list。lists是有序的item集合。你可以从lists尾部push或pop item。你可以查询lists的长度,你可以获取lists的片段。这里有一个简单的例子:
127.0.0.1:6379> lpush superheroes batman (integer) 1 127.0.0.1:6379> lpush superheroes spiderman (integer) 2 127.0.0.1:6379> llen superheroes (integer) 2 127.0.0.1:6379> lrange superheroes 0 -1 1) "spiderman" 2) "batman
“lrange”命令接收起始索引和最后索引。-1表示显示到最后一条。第一个索引是0。输出结果从1开始时不要觉得困惑。
更多例子:
127.0.0.1:6379> rpush superheroes "the incredible hulk" catwoman (integer) 4 127.0.0.1:6379> rpop superheroes "catwoman" 127.0.0.1:6379> lpop superheroes "spiderman" 127.0.0.1:6379> lrange superheroes 0 -1 1) "batman" 2) "the incredible hulk"
它对数据结构操作的接口非常完整,它能够提供随机访问队列lists(使用lrange),后进先出栈stack(使用lpush/lpop),先进先出队列queue(使用lpush,rpop)或双端队列dequeue(对两端的push/pop)。
sets
对于item的无序集合,常常会选择sets。redis对于管理sets有着非常完整的命令:
127.0.0.1:6379> sadd primes 2 3 5 7 11 13 17 19 (integer) 8 127.0.0.1:6379> sadd integers_to_10 1 2 3 4 5 6 7 8 9 10 (integer) 10
举个例子,这里有两个sets。一个是不超过20的素数,另一个是1-10的整数。
现在,你可以做第一个测试—“sismember”命令:
127.0.0.1:6379> sismember primes 8 (integer) 0 127.0.0.1:6379> sismember primes 7 (integer) 1
找到不超过10的素数,我们可以使用求交集命令
127.0.0.1:6379> sinter primes integers_to_10 1) "2" 2) "3" 3) "5" 4) "7"
这个例子中我们很幸运,因为结果是排序的。但是通常情况下,sets是无序的,我们得到的结果可能是任意序列的。Redis也支持对sets排序,每个item对应一个分数,然后基于这个分数对sets排序。
总结
redis是一个多功能的数据库,拥有丰富的高级特性。它还有一个相对较新的产品配件来扩展它的能力,使它能够处理那些不能只在一个机器上处理的用例。那就花些时间学习并把它用到你的系统中吧。