Hash数据结构
- Hash类型是String类型的field和value映射表,或者说是一个String集合,它特别适合存储对象,相比较而言,
将一个对象类型存储在Hash类型里要比存储在String类型类,占用更小的内存空间,并方便存取整个对象。
在Redis中,哈希类型是指键值本身又是一个键值对结构,形如:value={{field1,value1},{field2,value2},{fieldN,valueN}}
Redis键值对和哈希类型二者的关系,如下图所示:
Hash结构
Hash应用场景
1. 对象缓存
- hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相 似,也可以用来存储对象。
在介绍string类型的应用场景时有所介绍,string + json也是存储对象的一种方式,那么存储对象时,
到底用string +json还是用hash呢?两种存储方式的对比如下表所示。
- 当对象的某个属性需要频繁修改时,不适合用string+json,因为它不够灵活,
每次修改都需要重新将整个对象序列化并赋值,如果使用hash类型,则可以针对某个属性单独修改,没有序列化,
也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,
就适合存储在hash类型里。
2. 购物车
- 以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素,如下图所示。
Hash结构的优缺点
List数据结构
- list类型是用来存储多个有序的字符串的,列表当中的每一个字符看做一个元素,一个列表当中可以存储有一个或者多个元素,redis的list支持存储2^32次方-1个元素。redis可以从列表的两端进行插入(pubsh)和弹出(pop)元素,支持读取指定范围的元素集,或者读取指定下标的元素等操作。redis列表是一种比较灵活的链表数据结构,它可以充当队列或者栈的角色。
- redis列表是链表型的数据结构,所以它的元素是有序的,而且列表内的元素是可以重复的。意味着它可以根据链表的下标获取指定的元素和某个范围内的元素集。
List应用场景
- 栈:LPUSH +LPOP -->FILO
先进后出原则:LPUSH从队列左边进入d,c,b,a, LPOP从队列左边出来a,b,c,d - 队列: LPUSH+RPOP
先进先出原则:LPUSH从队列左边进入d,c,b,a, RPOP从队列右边出d,c,b,a - 阻塞队列: LPUSH+BRPOP
LPUSH+BRPOP是在LPUSH+RPOP的基础上多了阻塞和等待的功能,
BRPOP实际上就是等于Blocking+RPOP,当队列中的数据为空时,
会一直监听消息队列,直到获得消息
- 微博消息和微信公众号消息