Redis的数据结构及应用场景

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

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可以获取/修改任意的字段。

二. 既然一般的语言也能支持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。

你可能感兴趣的