一.初识Redis
Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上。Redis的数据结构致力于帮助用户解决问题,而不是像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制,持久化和客户端分片等特性,用户可以很方便地将Redis扩展成一个能够包含数百GB数据,每秒处理上百万次请求的系统。
1.Redis简介
Redis是一个速度非常快的非关系数据库,它可以存储key与5种不同类型的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分配来扩展写性能。
2.Redis与memcached的对比
提到Redis,很多人会拿memcached进行对比,那么Redis和memcached有什么相同点和不同点呢?
如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:
(1)Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
(2)Redis支持数据的备份,即master-slave模式的数据备份。
(3)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。Redis只会缓存所有的 key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计 算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的。同时由于Redis将内存中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个 操作,直到子线程完成swap操作后才可以进行修改。
当 从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。 这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。这种策略在客户端的数量较小,进行 批量操作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。所以Redis运行我们设置I/O线程 池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。
关于两者的性能对比,一般认为memcached性能会稍好一些,不过事实上两者的性能都非常好,而且这方面还是要看具体场景具体分析,一般来说性能不是选择两者的主要原因,具体性能好坏一定要通过实际测试才能下结论。
由于Redis功能更加强大,支持多种数据结构,且支持复制,持久化,客户端分配等特性,所以这里推荐使用Redis。通常我们使用Redis或者memcached多数是用来做缓存,所以使用Redis的效果更好一些。
此外网上博客说两者使用场景也有区别: Redis除了作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。
还有在内存分配上,两者实现方式也有很大区别,这里不再详细介绍了。
3.Redis数据结构介绍
如前所述,Redis的一个很重要的特点就是支持多种数据结构,Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串),List(列表),Set(集合),Hash(散列),ZSet(有序集合),下面简单介绍下这5种数据结构。
(1)String:程序员对String应该都不会感到陌生,Redis中的String存储的值可以是字符串,整数或者浮点数,支持的功能包括对整个字符串或者字符串的其中一部分执行操作,对整数或者浮点数执行自增或自减操作。
(2)List:Redis中的List存储的是一个链表,链表上的每个节点都包含了一个字符串,支持的功能包括从链表的两端推入或者弹出元素,根据偏移量对链表进行修剪,读取单个或者多个元素,根据值查找或者移除元素。
(3)Set:Redis中的Set存储包含字符串的无序收集器,并且被包含的每个字符串都是独一无二的。支持的功能包括添加,获取,移除单个元素,检查一个元素是否存在于集合中,计算交集,并集,差集,从集合随机获取元素。
(4)Hash:存储包含键值对的无序散列表。支持的功能包括添加,获取,删除单个键值对,获取所有键值对。
(5)ZSet:存储字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定。支持的功能包括添加,获取,删除单个元素,根据分值范围或者成员来获取元素。
这里面涉及很多具体命令,在这就不详细介绍了,命令学习参考https://redis.io/commands 强烈建议在自己安装redis实际操作