Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存,可持久化的日志型、高性能的Key-Value数据库,并提供多种语言的API,同时也是key-value存储系统,最主要的还支持主从同步。
巧计及理解redis的各类技术名词和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove以及取交集,并集和差集等多种丰富操作,而且这些操作都是原子性的。
01使用redis有哪些好处?
1.速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
2.支持丰富数据类型,支持string,list,set,sortedset,hash
1)String
常用命令:set、get、decr、incr、mget等。
应用场景:string类型的incr和decr命令的作用,是将key中储存的数字值加、减,这两个操作具有原子性,总能安全地进行加减操作,因此可以用string类型进行计数,如微博的评论数、点赞数、分享数,抖音作品的收藏数,京东商品的销售量、评价数等。
实现方式:String在redis内部存储,默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作时,会转成数值型进行计算,此时redisObject的encoding字段为int。
2)Hash
常用命令:hget、hset、hgetall等。
应用场景:我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID,我们希望获取该用户的姓名或者年龄或者生日。如购物车,以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素,如下图所示。
hash购物车实现方式:Redis的Hash,实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。Key是用户ID,value是一个Map。这个Map的key是成员的属性名,value是属性值。这样对数据的修改和存取,都可以直接通过其内部Map的Key(Redis里称内部Map的key为field),也就是通过key(用户ID)+field(属性标签),就可以操作对应属性数据。
当前HashMap的实现有两种方式:当HashMap的成员比较少时,Redis为了节省内存,会采用类似一维数组的方式,来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap;当成员数量增大时,会自动转成真正的HashMap,此时encoding为ht。
3)List
常用命令:lpush、rpush、lpop、rpop、lrange等;
实现方式:Redislist的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
应用场景:
1》消息队列
list类型的lpop和rpush(或者反过来,lpush和rpop),能实现队列的功能,故而可以用Redis的list类型,实现简单的点对点的消息队列。不过,不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然没必要去重复造轮子。
2》排行榜
list类型的lrange命令,可以分页查看队列中的数据。可将每隔一段时间,计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等,酷狗音乐“K歌擂台赛”的打擂金曲排行榜,每日计算一次,存储在list类型中,接口访问时,通过page和size分页获取打擂金曲。
但是,并不是所有的排行榜,都能用list类型实现,只有定时计算的排行榜,才适合使用list类型存储,与定时计算的排行榜,相对应的是实时计算的排行榜,list类型不能支持实时计算的排行榜,之后在介绍有序集合sortedset的应用场景时会详细介绍实时计算的排行榜的实现。
3》最新列表
list类型的lpush命令,和lrange命令能实现最新列表的功能,每次通过lpush命令,往列表里插入新的元素,然后通过lrange命令,读取最新的元素列表,如朋友圈的点赞列表、评论列表。
4)Set
常用命令:sadd、spop、smembers、sunion等;
实现方式:set的内部实现,是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
应用场景:
1》好友、