Redis与Memcached的区别与比较
- Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。
- Redis支持数据的备份,即master-slave模式的数据备份。
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。
- redis的速度比memcached快很多。
- Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的IO复用模型。
Redis与Memcached的选择
- 使用Redis的String类型做的事,都可以用Memcached替换,以此换取更好的性能提升; 除此以外,优先考虑Redis。
使用Redis有哪些好处?
- 速度快:因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 。
- 支持丰富数据类型:支持string,list,set,sorted set,hash 。
- 支持事务:操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 。
- 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除。
Redis 常见的性能问题及解决方法?
-
Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件。
-
如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次。
-
为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内。
-
尽量避免在压力很大的主库上增加从库。
Redis 最适合的场景
- 会话缓存(Session Cache)
最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。 - 全页缓存(FPC)
- 队列
- 排行榜/计数器
- 发布/订阅
Redis的并发竞争问题如何解决?
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:
- 客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
- 服务器角度,利用setnx实现锁。
对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题。