一、“5种基础”数据类型
Redis有望所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash
1.1Redis数据结构简介
Redis基础文章非常多,关于基础数据结构类型,我推荐你先看下官方网站内容(opensnewwindow),然后再看下面的小结
首先对redis来说,所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。
1.2基础数据结构详解
内容其实比较简单,我觉得理解的重点在于这个结构怎么用,能够用来做什么?所以我在梳理时,围绕图例,命令,执行和场景来阐述
1.2.1String字符串
String是redis中最基本的数据类型,一个key对应一个value。
String类型是二进制安全的,意思是redis的string可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
图例
下图是一个String类型的实例,其中键为hello,值为world
命令使用
命令执行
.0.0.1:sethelloworldOK.0.0.1:gethello"world".0.0.1:delhello(integer)1.0.0.1:gethello(nil).0.0.1:getcounter"2".0.0.1:incrcounter(integer)3.0.0.1:getcounter"3".0.0.1:incrbycounter(integer).0.0.1:getcounter"".0.0.1:decrcounter(integer).0.0.1:getcounter""
实战场景
缓存:经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
session:常见方案springsession+redis实现session共享
1.2.2List列表
Redis中的List其实就是链表(Redis用双端链表实现List)。
使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存放在List中,然后工作线程再用POP操作将任务取出进行执行。
图例
命令使用
使用列表的技巧
lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpush+ltrim=CappedCollection(有限集合)
lpush+brpop=MessageQueue(消息队列)
命令执行
.0.0.1:lpushmylist12lllsmem(integer)5.0.0.1:lrangemylist0-11)"mem"2)"ls"3)"ll"4)5)"1".0.0.1:lindexmylist-1.0.0.1:lindexmylist10#index不在mylist的区间范围内(nil)
实战场景微博
TimeLine:有人发布微博,用lpush加入时间轴,展示新的列表信息。
消息队列
1.2.3Set集合
Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
图例
命令使用
命令执行
.0.0.1:saddmysethaohao1xiaohaohao(integer)3.0.0.1:smembermyset1)"xiaohao"2)"hao1"3)"hao".0.0.1:sismembermysethao(integer)1
实战场景
标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐