redis是面试中最常问的中间件,关于数据结构主要集中在列举和用法。下面我们就数据结构和主要的使用方式做一个描述。redis五种数据结构 大家都知道redis的几种数据结构,包括string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)。下面我们来列举一下关于这几种结构的常用命令和一些使用场景。1、string结构 string是redis的最基本的数据类型。 string类型是二进制安全的,也就是说string里可以包含任何的数据类型。 string类型的值最大能存储512MB常用命令SETkeyvalue设置指定key的值MSETkeyvalue〔keyvalue。。。〕批量设置keyvalueSETNXkeyvalue当key不存在时才存入valueGETkey获取key的值MGETkey〔key。。。〕批量获取key的值DELkey〔key〕删除keyEXPIREkeyseconds设置key的过期时间INCRkey将key中存储的数字值加一DECRkey将key中存储的数字值减一INCRBYkeyincrement将key存储的值加上指定的增量incrementDECRBYkeyincrement将key存储的值减去指定的增量increment应用场景 1、普通的单值缓存 2、对象数据缓存(json格式) 3、分布式锁的应用 4、计数器的使用,使用INCR和DECR2、hash结构 redishash是一个string类型的field(字段)和value(值)的映射表,很适合存储对象。常用命令HSETkeyfieldvalue将字段field的值设置为valueHSETNXkeyfieldvalue当field字段不存在时设置值valueHMSETkeyfiledvalue〔fieldvalue。。。〕批量设置字段field的值为valueHGETkeyfield获取指定field的值HMGETkeyfield〔field。。。〕批量获取field的值HDELkeyfield〔field。。。〕删除fieldHLENkey获取字段的数量HGETALLkey获取指定key的所有field(字段)和value(值)HINCRBYkeyfieldincrementfield字段加上增量increment应用场景 hash最适合的就是做对象缓存3、list结构 list是redis的字符串列表,可以选择将值插入到头部或尾部。常用命令LPUSHkeyvalue〔value。。。〕将一个或多个值插入列表头部RPUSHkeyvalue〔value。。。〕将一个或多个值插入列表尾部LPOPkey移除并返回key列表的头元素RPOPkey移除并返回key列表的尾元素LRANGEkeystartstop获取start和stop范围内的元素BLPOPkey〔key。。。〕timeout移除并返回key列表的头元素,没有会阻塞或等待到超时BRPOPkey〔key。。。〕timeout移除并返回key列表的尾元素,没有会阻塞或等待到超时应用场景 1、可以利用list的头部尾部增删属性实现栈和队列 2、可以用来实现时间轴模型,根据时间依次插入数据,使用LPUSH插入和LRANGE获取最近范围的数据4、set结构 set是redis的无序集合,是通过哈希表实现的,因此任何操作(添加、删除和测试成员的存在性等)的时间复杂度是O(1)。(无论集合中包含多少元素,时间都是常量)常用命令SADDkeymember〔member。。。〕向集合添加一个或多个元素SREMkeymember〔member。。。〕移除元素SMEMBERSkey获取key的所有元素SCARDkey获取key的个数SISMEMBERkeymember判断member是否在key的集合内SRANDMEMBERkey〔count〕从集合中选出count个元素,不删除元素SPOPkey〔count〕从集合中选出count个元素,并删除元素SINTERkey〔key。。。〕交集运算SINTERSTOREdestinationkey〔key。。。〕计算交集将结果存入新集合destinationSUNIONkey〔key。。。〕并集运算SUNIONSTOREdestinationkey〔key。。。〕计算并集将结果存入新集合destinationSDIFFkey〔key。。。〕差集运算SDIFFSTOREdestinationkey〔key。。。〕计算差集将结果存入新集合destination应用场景 1、可以根据set集合的不可重复的特性,统计一些像网站访问IP啊,访问用户啊这些信息,无论访问多少次,SADD加入的都只有一条。 2、也可以使用SRANDMEMBER和SPOP获取数据的随机性,做一些抽奖的小程序等随机功能 3、作为集合,可以利用交并运算等计算一些复杂的逻辑关系,比如说人物关系之间的网络关系。5、ZSet有序集合结构 ZSet和set类似,都是字符串的非重复集合。不同之处在于,ZSet的每个成员都与分数相关,分数是用来进行排序的。然后可以使用分数来取一个范围内的数常用命令ZADDkeyscoremember〔〔scoremember〕。。。〕添加一个或多个元素ZREMkeymember〔member。。。〕删除元素ZSCOREkeymember返回member的分数值ZINCRBYkeyincrementmember增加increment增量ZCARDkey获取成员数ZRANGEkeystartstop〔WITHSCORES〕通过指定区间内的成员ZREVRANGEkeystartstop〔WITHSCORES〕倒序通过指定区间内的成员ZUNIONSTOREdestkeynumkeyskey〔key。。。〕计算并集ZINTERSTOREdestkeynumkeyskey〔key。。。〕计算交集 应用场景: ZSet是有序的集合,可以使用它来做一个排行榜。