关于近期redis学习记录
一、redis的数据类型及其内部结构对应关系
存储类型 | string | List | Hash | Set | ZSet |
---|---|---|---|---|---|
内部结构 | SDS(simple dynamic string) | ZipList (数据较少) LinkedList(数据较多)quickList(3.2引入) | ZipList(数据较少)其他Dict | Dict | Dict + shipList |
实现原理 | embstr(44字节以内) raw(44字节以外) | Dict由两个HashTable组成,一个存值,一个扩容 |
针对上述表格内容详细表述
- String对应redis内部的SDS(simple dynamic string),并且在44个字节以内以embstr实现,超过44个字节则以raw存储
- List在数据较少的时候对应着zipList,在数据较多的时候对应着LinkedList,并且在redis的3.2之后版本引入了quickList
- Hash在数据量少的时候对应着ZipList,其他对应着Dict
- Set内部结构对应着Dict
- ZSet对应着Dict+shipList
- 其中Dict的实现是有两个TableList,一般来说一个值,一个在扩容的时候需要
二、针对5类数据类型详细记录与java的类型做对应记忆
- String:针对需要高频访问且不易更改的数据作为缓存使用,对排序、结构无需求的数据
- List:约等于java中的LinkedList(链表),可作为栈、队列使用
- Hash:是经典的key-value结构,与java中的HashMap类似,但不同的是java1.8之后链表在节点数量和总数量达到一定值的时候会变成红黑树,在redis中则一直为链表,redis中的Hash的value只能是字符串,所以不存在嵌套
- Set:可以与java中的HashSet联合记忆,java中的HashSet底层是HashMap,redis中的Set实现是一种特殊的Hash。java中的HashMap的value是new Object,但是redis中的Hash的value是null。两者特性一直,数据都是无序且唯一的,适合作为去重使用。
- ZSet:在Set的无序且唯一上添加了score,代表这个value的权重,即又增加了排序功能,场景使用适合各种排行榜等
三、理论结合业务实际使用
例如某商城项目中redis的各类数据类型与实际业务结合使用
- 利用redis中的string数据类型对数据库中一些不常改变且高频访问的数据做缓存例如店铺的基本信息,这些信息很少更改但访问频率高,在有人更改时候,同步刷新缓存数据即可
- 在产品列表中,我会使用List,接收数据库的数据并进行展示
- 使用Hash记录商品(key为商品id)和对应的商品详情和对应的用户(key是用户Id)的一些行为
- 在首页的商品推荐中,我会使用ZSet来给每个商品多个纬度评分,并记录成score,然后以此来做排名