所有笔记基于狂神的Redis课程,为了加强理解而进行的总结
此处附上狂神的视屏地址,有需要的小伙伴可以直接去看视屏学习:
https://www.bilibili.com/video/BV1S54y1R7SB?p=1
一、什么是Redis
Redis(Remote Dictionary Server,远程字典服务器)
Redis是开源免费的,使用C语言编写,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行,所以读写速度很快(读:110000次/s,写80000次/秒)。它还支持数据的持久化(RDB,AOF)。
二、Redis的五大数据类型
(1)String(字符串类型)
单值单value
String是redis最基本的类型,一个key对应一个value,value不仅可以是string,还可以是数字。这个value最多可以存储512M数据。
String类型是二进制安全的,这代表string可以包含任何数据,比如jpg图片或者序列化的对象。
String类型的简单应用:常规key-value缓存应用,常规计数:网站访问人数,浏览次数等
(2)Lsit(列表)
单值多value
List列表是简单的字符串列表,按照插入顺序排序,先进的后出,后进的先出,添加的元素会被放在列表的头部(左侧)或者尾部(右侧),他的底层实际是个链表。left和right都可以添加元素,如果键不存在,会创建一个新的链表,如果键已存在,会向其中插入内容。如果将List中的值全部移除,那么,这个list也就消失了。在操作链表的头部和尾部时,效率是很高的,但是如果对中间的元素进行操作,效率会变低,因为一旦一个元素新增或者删除,其他元素的下标都会重新进行一次排序。
List的简单应用:list就是链表,使用list结构,我们可以轻松的实现最新消息排行等功能。lsit的另一个应用就是消息队列,可以利用list的push操作,将任务存在list中,然后工作线程再用pop操作将任务取出进行执行。Redis还提供了操作list中某一段的api,可以根据下标直接查询或是删除list中的某一段元素。
(3)Set(集合)
单值多value
redis的set是String类型的无序集合,他是通过HashTable实现的。
set类型的简单应用:在微博中,可以将用户所有关注的人存在一个集合中,将其所有粉丝存在一个集合。Redis为集合提供了求交集、并集,差集等操作,可以非常方便的实现如共同关注,共同喜好,二度好友等功能。对以上进行的所有操作,我们还可以使用不同的命令将结果返回给客户端或者存入一个新的集合
(4)Zset(sorted set:有序集合)
redis的zset和set是一样的,也是String类型的集合,只不过相较于set,它具有有序不可重复的特点。在set的基础上,加一个score值,用于排序。set是set key1 v1 v2 v3,现在zset是key1 score1 v1 score2 v2。
和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按照score进行有序排列,比如一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。可以用sorted set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务,让重要的任务优先执行。
zset的简单应用:对会员充值金额进行排序,取充值金额大于X的
(5)Hash(哈希,k-v模式不变,但v是一个键值对,类似java里的Map)
hash是一个String类型的field和value的映射表,hash特别特别适合用于存储对象,类似java里的Map<String,Object>
Hash的简单应用:存储部分变更数据,如用户信息等
三、除了五大基本数据类型以外,Redis还提供了三种特殊的数据类型
(1)GEO地理位置
Redis的GEO特性在Redis3.2版本中推出,这个功能可以将用户的地理位置信息存储起来,并对这些信息进行操作。来实现诸如附近的人,摇一摇,等依赖于地理位置信息的功能。geo的数据类型为zset。
(2)HyperLogLog
Redis在2.8.9版本中添加了HyperLogLog结构。
HyperLogLog是用来做基数统计的算法,优点是,在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的,并且是很小的。在Redis里,每个HyperLogLog键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数,这和计算基数时,元素越多就越耗费内存的集合形成鲜明对比。
HyperLogLog作为一种算法,他提供了不精确的去重计算方案。
举个例子:假如我要统计网页的UV(浏览用户数,一天内同一个用户的多次访问只算做一次),传统的解决方案是使用set来保存用户id,然后统计set中的元素数量来获取页面的UV。但是这种方案只能承载少量的用户,一旦用户数量过多就需要消耗大量的空间来存储id。我们的目的是统计用户数量而非保存用户,这简直是个吃力不讨好的方案。而使用Redis的HyperLogLog最多只需要12k就可以统计大量的用户数,尽管他大概有0.81%的错误率,但是对于统计UV这种不需要很精确的数据是可以忽略不计的。
什么是基数?
比如数据集{ 1 2 3 1 2 3 },那么这个数据集的基数为{ 1 2 3 },基数(不重复元素)为3
(3)BitMap
在开发中可能会遇到这种情况:需要统计用户的某些信息,比如活跃不活跃,登录或者不登录;又如需要记录员工一年内的打卡情况,打了卡是1,没有打卡是0,如果使用普通的key-value存储,则要记录365条数据,如果用户量很大,需要的空间也会很大。所以Redis提供了BitMap这种数据结构,Bitmap就是通过操作二进制位来进行记录,即为0和1;如果要记录365天的打卡情况,使用Bitmap表示的形式大概如下:011110000101010........,这样的好处就是节省内存,365天相当于365个bit,1kb等于8bit,所以相当于使用46个字节即可。
BitMap就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应的元素本身,实际上底层也是通过对字符串的操作来实现。