Redis是一个key-value存储系统,它支持存储的value类型包括string字符串、list链表、set集合、sorted Set有序集合和hash哈希等数据类型。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的,支持各种不同方式的排序。为了保证效率,Redis将数据都缓存在内存中,并周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,在此基础上实现master-slave(主从)同步。
Redis的应用场景 数据类型应用场景StringString是最常用的一种数据类型,普通的key/value存储都可以归为此类。List关注列表、粉丝列表、消息队列等。SetSet提供一个与 List类似的列表功能,特殊之处在于Set会自动排序、去重,当需要存储一个列表数据,又不希望有重复数据时,Set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
1.使用Set存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合;
2.可以对集合取交集、并集、差集,应用到好友推荐、共同关注等。
3.还可以利用唯一性,统计访问网站的所有独立IP。
SortedSetSortedSet与Set的使用场景类似,是不允许重复项的String集合。
1.SortedSet可以通过提供一个优先级(score)的参数为成员排序,并且是插入有序的,即自动排序,可以应用于积分排行榜等。
2.如果需要一个有序且不重复的集合列表,可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
3.用SortedSet做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务,让重要的任务优先执行。
Hash 存储一个学生信息对象数据,字段包括:id、姓名、班级、年龄等,通过id可以获取/修改任意的字段。
这里要先提一下 内存和缓存的区别 :
内存是物理上的,是一种物理存储介质。
缓存是逻辑上的概念,是一种数据结构,可以是PHP语言里面的一种数据结构,也可以是Redis里面的一种数据结构。比如:用PHP数组存一些数据,每次有需求就直接从数组中读取;用PHP语言设计了一个缓存,用一个数组做队列,设计了一个基于先进先出策略的缓存;调用Redis的一些数据结构来存储数据。
内存叫做RAM,随机可读存储器,硬盘一般叫做ROM,随机只读存储器。
缓存包括cpu的一二级缓存、纯内存结构的缓存、半内存缓存、磁盘缓存,它们的速度是一层比一层慢。当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找,程序里面的各种数据结构、变量等等,都是运行在内存里面,而不是在硬盘上。
假设有一个场景,比如历史用户日志访问数据,就是access_log,让你去统计都有哪些用户登录了这个网站,当然现在还有用户在持续登录着。这个时候你是不是要先去从access_log里面读取日志,然后提取出日志里面的userId,存到数组里面再去重。当新用户来的时候,你只需要和你数组里面的用户进行比较即可,就不需要再读取access_log文件了。这样就不用每次读取文件,只需要读取数组即可,速度回更快。 同理用Redis,也是因为当我们需要读取数据时,先从Redis查找,如果有就直接返回,不用再从mysql查找,速度会很快。
从原理上讲,PHP里面的数据结构用的是纯内存,而Redis是需要走网络的;
从速度上讲,纯内存的速度肯定是比先走网络、再从内存中读取的速度快。
虽然Redis作为半内存缓存,没有直接内存结构的数据结构速度快,但Redis除了数据结构丰富外,还适合高并发场景,对高并发处理效率极高,此外可以做到集群式、可持久化。
Redis支持String、List、Set、Sorted Set、Hash等。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。