一、Redis是什么?
Redis (Remote Dictionary Server),即远程字典服务。
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis是一个开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
二、redis五大基本类型
2.1 String(字符串)
1.String类型是redis的最基础的数据结构,也是最经常使用到的类型。
而且其他的四种类型多多少少都是在字符串类型的基础上构建的,所以String类型是redis的基础。
2.String 类型的值最大能存储 512MB,这里的String类型可以是简单字符串、
复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串
2.1.1 应用场景
1)缓存功能
String字符串是最常用的数据类型,不仅仅是redis,各个语言都是最基本类型,因此,利用redis作为缓存,配合其它数据库作为存储层,利用redis支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。
2)计数器
许多系统都会使用redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。
3)统计多单位的数量
eg,uid:gongming count:0 根据不同的uid更新count数量。
4)共享用户session
用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存cookie,这两种方式做有一定弊端,1)每次都重新登录效率低下 2)cookie保存在客户端,有安全隐患。这时可以利用redis将用户的session集中管理,在这种模式只需要保证redis的高可用,每次用户session的更新和获取都可以快速完成。大大提高效率。
2.2 List(列表)
1.list类型是用来存储多个有序的字符串的,列表当中的每一个字符看做一个元素
2.一个列表当中可以存储有一个或者多个元素,redis的list支持存储2^32次方-1个元素。
3.redis可以从列表的两端进行插入(pubsh)和弹出(pop)元素,支持读取指定范围的元素集,
或者读取指定下标的元素等操作。redis列表是一种比较灵活的链表数据结构,它可以充当队列或者栈的角色。
4.redis列表是链表型的数据结构,所以它的元素是有序的,而且列表内的元素是可以重复的。
意味着它可以根据链表的下标获取指定的元素和某个范围内的元素集。
2.2.1 应用场景
1)消息队列
reids的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过Lpush命令从左边插入数据,多个数据消费者,可以使用BRpop命令阻塞的“抢”列表尾部的数据。
2)文章列表或者数据分页展示的应用。
比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。
2.3 Set(集合)
1.redis集合(set)类型和list列表类型类似,都可以用来存储多个字符串元素的集合。
2.但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的,不存在元素下标。
3.redis的set类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,
并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。
2.3.1 应用场景
1)标签
比如我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。
2)共同好友功能,共同喜好,或者可以引申到二度好友之类的扩展应用。
3)统计网站的独立IP。
利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP。
2.4 ZSet(有序集合)
redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,
有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据。
2.4.1 应用场景
1)排行榜
有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。
2)用Sorted Sets来做带权重的队列。
比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
2.5 Hash(哈希)
redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,
有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据。
2.5.1 应用场景
1)存储关系型数据库中表记录。
由于hash数据类型的key-value的特性,用来存储关系型数据库中表记录,是redis中哈希类型最常用的场景。一条记录作为一个key-value,把每列属性值对应成field-value存储在哈希表当中,然后通过key值来区分表当中的主键。
2)经常被用来存储用户相关信息。
优化用户信息的获取,不需要重复从数据库当中读取,提高系统性能。
三、Redis三大特殊数据类型
3.1 geospatial(地理位置)
3.1.1 解析说明
1.geospatial将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。
2.sorted set使用一种称为Geohash的技术进行填充。经度和纬度的位是交错的,以形成一个独特的52位整数。
sorted set的double score可以代表一个52位的整数,而不会失去精度。(有兴趣的同学可以学习一下Geohash技术,使用二分法构建唯一的二进制串)
3.有效的经度是-180度到180度
有效的纬度是-85.05112878度到85.05112878度
3.1.2 应用场景
1)查看附近的人
2)微信位置共享
3)地图上直线距离的展示
3.2 Hyperloglog(基数)
3.2.1 解析说明
hyperloglog 是用来做基数统计的,其优点是:输入的提及无论多么大,hyperloglog使用的空间总是固定的12KB ,利用12KB,它可以计算2^64个不同元素的基数!非常节省空间!但缺点是估算的值,可能存在误差。其底层利用了伯努利试验的研究理论。
3.2.2 应用场景
1)网页统计UV
浏览用户数量,同一天同一个ip多次访问算一次访问,目的是计数,而不是保存用户。
传统的方式,set保存用户的id,可以统计set中元素数量作为标准判断。
但如果这种方式保存大量用户id,会占用大量内存,我们的目的是为了计数,而不是去保存id。
3.3 Bitmaps(位存储)
3.3.1 解析说明
Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作。
可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。
3.3.2 应用场景
1)两种状态的统计
两种状态的统计都可以使用bitmaps,例如:统计用户活跃与非活跃数量、登录与非登录、上班打卡等等。