Redis的数据结构及应用场景

一. 谈谈对redis的理解,它的应用场景。

Redis是一个key-value存储系统,它支持存储的value类型包括string字符串、list链表、set集合、sorted Set有序集合和hash哈希等数据类型。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的,支持各类不一样方式的排序。为了保证效率,Redis将数据都缓存在内存中,并周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,在此基础上实现master-slave(主从)同步。css

Redis的应用场景 数据类型应用场景StringString是最经常使用的一种数据类型,普通的key/value存储均可以归为此类。List关注列表、粉丝列表、消息队列等。SetSet提供一个与 List相似的列表功能,特殊之处在于Set会自动排序、去重,当须要存储一个列表数据,又不但愿有重复数据时,Set是一个很好的选择,而且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。mysql

1.使用Set存储一些集合性的数据,好比在微博应用中,能够将一个用户全部的关注人存在一个集合中,将其全部粉丝存在一个集合;redis

2.能够对集合取交集、并集、差集,应用到好友推荐、共同关注等。sql

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能够获取/修改任意的字段。数据结构

二. 既然通常的语言也能支持string、list、hash等数据结构,为何还要用redis呢?

这里要先提一下内存和缓存的区别

内存是物理上的,是一种物理存储介质。

缓存是逻辑上的概念,是一种数据结构,能够是PHP语言里面的一种数据结构,也能够是Redis里面的一种数据结构。好比:用PHP数组存一些数据,每次有需求就直接从数组中读取;用PHP语言设计了一个缓存,用一个数组作队列,设计了一个基于先进先出策略的缓存;调用Redis的一些数据结构来存储数据。

内存叫作RAM,随机可读存储器,硬盘通常叫作ROM,随机只读存储器。

缓存包括cpu的一二级缓存、纯内存结构的缓存、半内存缓存、磁盘缓存,它们的速度是一层比一层慢。当CPU要读取一个数据时,首先从一级缓存中查找,若是没有找到再从二级缓存中查找,若是仍是没有就从三级缓存或内存中查找,程序里面的各类数据结构、变量等等,都是运行在内存里面,而不是在硬盘上。

假设有一个场景,好比历史用户日志访问数据,就是access_log,让你去统计都有哪些用户登陆了这个网站,固然如今还有用户在持续登陆着。这个时候你是否是要先去从access_log里面读取日志,而后提取出日志里面的userId,存到数组里面再去重。当新用户来的时候,你只须要和你数组里面的用户进行比较便可,就不须要再读取access_log文件了。这样就不用每次读取文件,只须要读取数组便可,速度回更快。 同理用Redis,也是由于当咱们须要读取数据时,先从Redis查找,若是有就直接返回,不用再从mysql查找,速度会很快。

从原理上讲,PHP里面的数据结构用的是纯内存,而Redis是须要走网络的;

从速度上讲,纯内存的速度确定是比先走网络、再从内存中读取的速度快。

虽然Redis做为半内存缓存,没有直接内存结构的数据结构速度快,但Redis除了数据结构丰富外,还适合高并发场景,对高并发处理效率极高,此外能够作到集群式、可持久化。

三. 具体讲一下Redis的数据结构,尽量的举出他们的应用场景。

Redis支持String、List、Set、Sorted Set、Hash等。

  • String类型是二进制安全的,能够用来缓存一些静态文件,如图片、视频、css文件等。支持incr操做,能够用做计数器,好比统计网站访问次数等。
  • 微博中“关注、粉丝”、论坛中全部回帖的ID用的就是list列表,还有消息队列,也是列表。
  • Set能够快速查找元素是否存在,用于记录一些不能重复的数据。例如: 在网站注册帐号时,用户名不能重复,使用Set记录注册用户,若是注册的用户名已经存在于Set中,就拒绝该用户注册。或者用于记录作过某些事情。例如: 在某些投票系统中,每一个用户一天只能投票一次,就能够用Set来记录某个用户的投票状况。
  • 顺便给你们推荐一个Java架构群:834962734 里面会分享一些资深架构师录制的视频资料:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多!
  • Set能作的事Sorted Set也能作,Sorted Set还能完成一些Set不能作的事情。例如:使用Sorted Set构建一个具备优先级的队列。
  • Hash适用于存储对象,好比把用户的信息存到hash里,以用户id为key,用户的详细信息为value。
相关文章
相关标签/搜索