我们先复习一下java容器框架:LinkedList与hashset。
LinkedList是一种采用双向链表实现的列表,适用于实现顺序访问,删除与增加数据。了解一下linkedlist双向链表的数据结构模型:
每一个结点的内容分为三部分:与前驱结点相连的指针,当前结点值,与后继结点相连的指针。
而hashset就是数学里的集合,不允许有重复元素,且元素存放的规则是无序的。
redis里的List数据类型与linkedList差不多:比起普通的LinkedList列表,需要的每一个存储值的结点之间都存在一对前后指针,指针就占有了很大的内存空间,所以将几个结点组成一个ZipList之后再将一个ZipList作为一个结点,而这每一个zipList就相当于我们redis数据库中的一个List数据类型,由一个个ZipList链接起来的列表叫做quickList,Ziplist列表内部的索引对应的元素之间没有指针,就像是带方向的数组一样 ,注意lpush创建列表是头插法插入(左插),rpush创建列表是尾插法插入(右插)。对于查找来说都是从左到右,属于从头到尾。元素较少时可以实现类似数组一样的索引查值。
set集合,插入无序,查询定位极快,利用hash表的散列原理随机存放集合元素(再优质的哈希散列函数也会产生哈希冲突),每一个元素key都对应一个哈希值、底层原理是哈希字典,是一个键值对集合,特别适合存储序列化的java对象信息。
下面是两个链接同一个redis的客户端,我们实验发布与订阅测试。
订阅就像是关注公众号一样,用户关注这个公众号,公众号发布文章所有订阅它的用户都能收到,不订阅就收不到,且发布的信息并不存储在数据库中,这就是利用了redis的特殊功能IO多路复用。
订阅命令 SUBSCRIBE channel(频道名 如:channel1 或者 channel2 等等)
发布命令 publish 频道名 消息
是不是感觉很神奇呢?我第一次接触也感觉这玩意好像是好多生活中的功能的底层?近期将会学习利用redis实现手机验证码的发送,这个就比较好玩了。