|
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持.
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets)和 有序集合(sorted sets)等类型。
Redis支持诸如列表、集合或有序集合的交集、并集、差集等高级原子操作.
持久化
通常,Redis将数据存储于内存中,或被配置为使用虚拟内存。[3]通过两种方式可以实现数据持久化:使用快照的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。
[编辑]主从同步
Redis支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。
[编辑]性能
相比需要依赖磁盘记录每个更新的数据库,基于内存的特性无疑给Redis带来了非常优秀的性能。读写操作之间没有显著的性能差异,如果Redis将数据只存储于内存中。
Redis的优点
- 性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子(事务性) – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。(你可以将数据推到某个信息管道中,然后其它人可以通过订阅这些管道来获取推送过来的信息)
- 持久化: 1. 数据快照的原理是将整个Redis中存的所有数据遍历一遍存到一个扩展名为rdb的数据文件中。通过SAVE(BGSAVE)命令可以调用这个过程。2.Redis还支持一种追加式的操作日志记录,叫append only file,其日志文件以aof结局,我们一般各为aof文件。
redis命令在线练习
http://try.redis.io/
http://redis.cn/
redis命令操作类可以参考:Redis系统性介绍
http://blog.nosqlfan.com/html/3139.html?ref=rediszt
MEMCACHE与REDIS的对比:
1. 没有必要过多的关心性能,因为二者的性能都已经足够高了。由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。(比如瓶颈可能会在网卡)
2. 如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
3. 如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的
4. 当然,最后还得说到你的具体应用需求。Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果你需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。
1、查看keys
redis 127.0.0.1:6379> keys *
1) "serverMinutes.1.1336284900"
2) "serverMinutes.1.1340192100"
3) "serverDay.1.20120620"
4) "server.1.lastState"
5) "serverMinutes.1.1340192400"
2、列表操作
Jedis jedis = getJedis();
jedis.rpush(cacheKey,"list_data1");
jedis.rpush(cacheKey,"list_data2");
jedis.rpush(cacheKey,"list_data3");
jedis.expire(cacheKey, expireSeconds);
//get data
List<String> list =jedis.lrange(cacheKey, 0, -1); //start, end
命令模式查看:
redis 127.0.0.1:6379> lrange serverMinutes.1.1340192100 0 -1
1) "1.266667"
2) "0.9641184807561425"
3) "3.5300000000000002"
4) "0.33855871944968086"
5) "0.0"
3. MAP操作
Jedis jedis = getJedis();
jedis.hset(cacheKey, "lastRecv", "1340192603");
jedis.hincrBy(cacheKey, "packetNum", 1);
Map<String, String> map = jedis.hgetAll(key);
String fieldData = jedis.hget(cacheKey, field);
命令模式查看:
redis 127.0.0.1:6379> hgetall server.1.lastState
1) "lastRecv"
2) "1340192603"
3) "lastSend"
4) "1340192500"
5) "lastRRD"
6) "1340192400"
7) "lastDiskReadIoNum"
8) "3000" |
|
|