<p><span class="hilite1"><span style="color: #006699;">redis</span>
</span>
,是快客王在je chat中介绍过的一个keyvalue数据库,打着在'入门级服务器'上10w/s set ops高性能头衔来忽悠众多不明真相的程序猿。 <br><br>
事实上,号称的'入门级服务器'服务器是一台 Xeon X3320 2.5Ghz 的机器,在我的 <br><br>
AMD Athlon(tm) 64 X2 Dual Core Processor 4000+ 台式机上,benchmark结果是</p>
<div class="quote_title">引用</div>
<div class="quote_div">====== SET ====== <br>
100005 requests completed in 2.73 seconds <br>
50 parallel clients <br>
3 bytes payload <br>
keep alive: 1 <br><br>
12.12% <= 0 milliseconds <br>
93.68% <= 1 milliseconds <br>
99.61% <= 2 milliseconds <br>
99.93% <= 3 milliseconds <br>
99.95% <= 4 milliseconds <br>
99.96% <= 5 milliseconds <br>
99.99% <= 6 milliseconds <br>
100.00% <= 7 milliseconds <br>
100.00% <= 202 milliseconds <br>
36685.62 requests per second</div>
<p><br><br>
在一台更为牛X的 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz 8核机上</p>
<div class="quote_title">引用</div>
<div class="quote_div">====== SET ====== <br>
100004 requests completed in 1.16 seconds <br>
50 parallel clients <br>
3 bytes payload <br>
keep alive: 1 <br><br>
59.77% <= 0 milliseconds <br>
100.00% <= 1 milliseconds <br>
100.00% <= 201 milliseconds <br>
85987.96 requests per second <br>
</div>
<p><br><br>
这玩意目前只能用一个核,所以CPU频率和缓存就成了速度的关键。 <br><br>
好吧,就DB来说,似乎这个成绩已经很惊人
了,且不说memcachedb和tokyocabinet之流,就说原版的memcached,速度似乎也只能达到这个级别。可是经过进一步的发现,这
玩意根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE … <br><br>
当接收到SAVE指令的时候,这玩意就会dump数据到一个文件里面。。。 <br><br>
当揭发了<span class="hilite1">redis</span>
的真面目之后,值得一说的是它的独家功能:存储列表和集合,这是它与mc之流相比更有竞争力的地方。 <br>
不介绍mc里面已经有的东东,只列出特殊的: <br><br>
TYPE key — 用来获取某key的类型 <br>
KEYS pattern — 匹配所有符合模式的key,太厉害了,比如KEYS * 就列出所有的key了,当然,复杂度O(n) <br>
RANDOMKEY - 返回随机的一个key <br>
RENAME oldkey newkey — key也可以改名 <br><br>
列表操作,这里才是精华阿 <br>
RPUSH key string — 将某个值加入到一个key列表头部 <br>
LPUSH key string — 将某个值加入到一个key列表末尾 <br>
LLEN key — 列表长度 <br>
LRANGE key start end — 返回列表中某个范围的值,相当于mysql里面的分页查询那样 <br>
LTRIM key start end — 只保留列表中某个范围的值 <br>
LINDEX key index — 获取列表中特定索引号的值,要注意是O(n)复杂度 <br>
LSET key index value — 设置列表中某个位置的值 <br>
LPOP key <br>
RPOP key — 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了 <br><br>
集合操作,也一样精彩 <br>
SADD key member — 增加元素 <br>
SREM key member — 删除元素 <br>
SCARD key — 返回集合大小 <br>
SISMEMBER key member — 判断某个值是否在集合中 <br>
SINTER key1 key2 ... keyN — 获取多个集合的交集元素 <br>
SMEMBERS key — 列出集合的所有元素 <br><br>
还有Multiple DB的命令,可以更换db,也是比较有意思,数据可以隔离开,默认是存放在DB 0 <br><br>
好了,命令都列出来了,有什么用呢?官方做了一个更加山寨的twitter克隆版,retwis,代码使用PHP开发,主要看retwis.php就可以了。下面结合下je的山寨chat来说明这东东是怎样用<span class="hilite1">redis</span>
的。 <br><br>
首先是全站闲聊: <br>
http://app.javaeye.com/chat/all <br>
有一个"global:timeline"列表,里面存放所有的口水,然后通过LRANGE取头50个,返回显示。 <br><br>
想看看肉饼最近说啥了,http://robbin.javaeye.com/blog/chat,构造一个key "uid:$userid:posts",比如 'uid:robbinfan:posts',同理LRANGE取列表。 <br><br>
有多少人订阅了肉饼饭呢? http://robbin.javaeye.com/blog/subscriptions <br>
SCARD
一下 "uid:robbinfan:followers",同理肉饼饭的订阅数
"uid:robbinfan:following"。要获取全部的列表,那就 SMEMBERS "uid:robbinfan:followers"
好了,然后加载每个订阅者的信息:GET "uid:quakewang:username"。 <br><br>
随着水王的诞生,居然在一个集合里面保存了上万的口水(比如global:timeline)。如果只需要保存最新的记录,可以LTRIM一下,整个世界就清静了。 <br><br><span class="hilite1">redis</span>
的
出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了
Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这东东还很新,目前是beta-6版本,可能还不足够稳定。此外,缺乏mc中批
量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。</p>
分享到:
相关推荐
RedisDB增删Demo是一个关于使用Redis数据库进行数据增删操作的示例项目。在这个项目中,我们将探讨如何通过Java编程语言以及Jedis库与Redis服务器进行交互,实现数据的添加和删除功能。Redis是一个高性能的键值存储...
【Redis_Key操作命令】是Redis中的重要组成部分,主要用于管理和操作Redis数据库中的键(Key)。Redis是一种内存数据存储系统,常用于实现数据队列、缓存、计数器等多种功能,而Key的操作是实现这些功能的基础。 一...
的Key-Value DB。Redis的出色之 处不仅仅是性能,Redis最大的魅力是支持保存多种数据 结构,此外单个value的最大限制是1GB,不像memcached只能保存1 MB的数据,因此 Redis可以用来实现很多有用的功能,比方说用他的...
因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value DB。 为什么 Redis 需要把所有数据放到内存中? Redis 为了达到最快的读写速度将数据都读到内存中,并...
var value = db.StringGet("key"); ``` 2. **哈希操作**: 增加或更新哈希字段: ```csharp var hash = db.HashGetAll("myHash"); db.HashSet("myHash", new HashEntry[] { new HashEntry("field1", "value1...
Redis之所以能处理高并发请求而不会导致数据库连接异常,是因为它采用了非阻塞I/O多路复用机制。这种机制允许单个线程高效地监听多个网络连接,从而在响应大量用户请求时,能够避免频繁的线程上下文切换,显著提升了...
是一个key-value存储系统 2)高性能、可靠性 Redis将数据存储在内存中,读写性能高;Redis提供了 RDB和AOF持久化,可将内存数据存盘,避免断电数据丢失 3)支持多种数据类型,常见的如 string、list、hash、set、...
string value = db.StringGet("key"); ``` 除了基本的字符串操作,Redis还支持哈希(Hashes)、集合(Sets)、有序集合(Sorted Sets)和列表(Lists)等多种数据结构。例如,创建一个哈希: ```csharp var hash = ...
默认情况下,Redis会将数据存储在当前目录的`db/`子目录下,端口设为6379,日志文件名为`redis.log`。你可以在`redis.conf`中修改这些设置。例如,修改默认端口为6380: ```bash sed -i 's/# port 6379/port 6380/...
_db.StringSet(key, value, expiry.Value); else _db.StringSet(key, value); } public void Remove(string key) { _db.KeyDelete(key); } } ``` 这个示例中,我们创建了一个简单的缓存服务,可以设置、...
bigkey是Redis中的一个性能瓶颈,阿里巴巴建议避免使用bigkey,使用紧凑型数据结构来节省内存空间。 规范三:使用高效序列化方法和压缩方法 阿里巴巴建议使用高效的序列化方法和压缩方法来减少value的大小,例如...
在很多时候,人们只是将Redis视为Key/Value数据库服务器,然而事实并非如此,在目前的版本中,Redis除了Key/Value之外还支持List、Hash、Set和Ordered Set等数据结构,因此它的用途也更为宽泛。对于此种误解,Redis...
var fieldValue = db.HashGet("hashKey", "field1"); ``` #### 列表(List) 向列表尾部添加元素: ```csharp db.ListRightPush("listKey", "item1"); ``` 获取列表的一部分: ```csharp var listItems = db....
var value = db.StringGet("key"); ``` 3. **删除数据**:使用`KeyDelete`方法删除指定的键: ```csharp db.KeyDelete("key"); ``` 4. **更新数据**:对于字符串类型,可以使用`StringSet`再次设置键值来...
例如,使用`ConnectionMultiplexer`建立与Redis服务器的连接,然后通过`Db.StringSet`,`Db.HashGetAll`等方法来操作数据。 总结,"RedisDemo.rar"提供的资源可以帮助你理解并实践Redis的五大数据类型,同时包含...
- **键值(Key-Value)存储数据库**:如TokyoCabinet/Tyrant、Redis等,适合于内容缓存场景,数据模型为一系列键值对,优点在于快速查询,缺点是数据缺少结构化。 - **列存储数据库**:如Cassandra、HBase等,适用于...
Redis 是一款开源的高性能键值(Key-Value)存储系统,常被用作数据库、缓存和消息中间件。其默认端口为 6379。Redis 支持多种数据结构如字符串(Strings)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)以及哈希...
- `mset key1 value1 key2 value2 key3 value3 ...`:同时设置多个键值对。 - `mget key1 key2 key3 ...`:批量获取多个键的值。 - `incr key`:将键`key`的值增加1。 - `decr key`:将键`key`的值减少1。 - `...
string value = db.StringGet("key"); Console.WriteLine("Value for key 'key': " + value); redis.Close(); } } ``` 这段代码展示了如何连接到Redis服务器,设置一个键值对,然后获取该值。注意,连接字符串...
db.SetAdd("setKey", "value1", "value2"); bool contains = db.SetContains("setKey", "value1"); ``` 6. **有序集合操作** 有序集合与集合类似,但每个元素都有一个分数,支持排序。 ```csharp db....