redis 和 memcached的区别?

1)redis 相比 memcached 能支持更丰富的数据操作,除了简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

2)在 redis3.x 版本中,便能支持 cluster 模式,而 memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。

3)redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis。

4) Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存图片、视频等等。 

5)过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定

6)memcache挂掉后,数据会丢失,而redis可以定期保存到磁盘(aof、rdb两种方式)

redis 效率为什么高?

1)纯内存操作。

2)核心是基于非阻塞的 IO 多路复用机制。

3)C 语言实,执行速度相对会更快。

4)单线程避免了多线程的频繁上下文切换问题,预防了多线程可能产生的竞争问题。

Redis数据类型及使用场景

string

Strings数据类型是最常用、简单的key-value类型,value可以是字符串、数字,甚至可以把一个图片文件的内容作为string来存储。Redis的string可以完全实现目前memcached的功能,并且效率更高。

常用命令: set,get,decr,incr,mget

应用场景:

字符串和数字直接存取。

可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。

存放session key,实现一个分布式session系统。Redis的key可以方便地设置过期时间,用于实现session key的自动过期。

SetNx,仅当key不存在时才Set。可以用来实现分布式锁夺。

GetSet, 设置新值,返回旧值。比如实现一个计数器,可以用GetSet获取计数并重置为0。

Append/SetRange/GetRange/StrLen,对文本进行扩展、替换、截取和求长度。

Hash

Hash将对象的各个属性存入Map里,可以只读取/更新对象的某些属性。

常用命令:hget,hset,hgetall

应用场景:

存放结构化数据,比如商品信息。

Redis提供了接口(hgetall)可以直接取到全部的属性数据,如果内部Map的成员很多,会涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时。

List

List是一个双向链表,支持双向的Pop/Push。

常用命令:lpush,rpush,lpop,rpop,lrange

应用场景:

各种列表,最新消息排行等。

消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出执行。

利用LRANGE可以很方便的实现list内容分页的功能。

取最新N个数据的操作,LTRIM用来限制列表中的数据条数。

Set

是一种无序的集合,集合中的元素没有先后顺序,将重复的元素放入Set会自动去重。

常用命令:

sadd,spop,smembers,sunion

应用场景:

某些需要去重的列表

可以存储一些集合性的数据,Redis为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

Sorted Set

简介:有序集合,元素放入集合时还要提供该元素的分数,可根据分数自动排序。

常用命令:

zadd,zrange,zrem,zcard

使用场景:

存放一个有序的并且不重复的集合列表

排行榜相关:ZADD key score value。 得到前100名高分用户:ZREVRANGE key 0 99