1.string 字符串
在redis中string是可以修改de被称之为动态字符串.其中内部更像arraylist
内部维护一个字节数组,在其内部分配了一定的空间.
内存分配机制
当字符串的长度小于1m的时候,每次扩容都是加倍空间
当字符串长度超过1m的时候每次扩容只会扩张1m的空间
字符串的最大长度是512mb.
-
list 列表
Redis
中的list
和Java
中的LinkedList
很像,底层都是一种链表结构, list
的插入和删除操作非常快,时间复杂度为 0(1),不像数组结构插入、删除操作需要移动数据。
但list的数据结构可不是双向列表
当数据量较少的时候它的底层数据节后为一块连续的内存 被称为 ziplist
就是说底层所有元素紧挨着 分配的是一块连续的储存空间,当数据量较多的时候就会变成 quicklist(快速链表.) 可是由于链表的前后指针回prev和next会占用较多的内存 首先会占用空间其次会加重内存碎片化 在redis3.2之后都改成了ziplist+链表的混合结构
应用场景
由于list是一个按照顺序排列的列表所以应用场景一般是
队列功能比如消息队列.
朋友圈滇藏.评论列表排行榜每次通过lpush命令和lrange命令能实现最近新列表功能
3hash(字典)
redisd的hash结构和java的hashmap相识是数 数组加列表的结构 当发生hash碰撞的时候就会把新元素追加链表上 在redis中 hashdevalsh只能是字符串
hash和string都可以存储用户信息但不同的是hash可以对用户de信息每个字段进行单独的存储.除了大key还有hashde小key. String是存储整个字符串要修改要拿出整个值 解析成对象在存入 hash的话可以直接对某个字段进行修改 从而节省网络de流量.不过hashde内存占用大于string
应用场景
购物车 hsehde key field value 三个命令可以实现以用户的id 商品id为 field商品的数量为值value 恰好构成了购物车三要数.
第二个也可以用于存储对象 相当于吧string 序列后的jsen对象存储到hash的里面
4 set(无序集和)
redisd 的set和java中的hashset有些类似 内部的键值对是无序且唯一的 内部实现的话相当于一个特殊的字典,字典中的value相当于都是一个值 null 当集中最后一个元素呗移除后数据结构被回收删除
1好友关注 粉丝 感兴趣的的人集和
sinter命令可以获取的到a和b的共同好友
sismember命令可以判断a是否是b的好友
scard命令可以获取好友的数量
关注的实施smove命令可以将b从a的粉丝转移到a的好友集和.
2首页的随机展示:比如美团的首页有很多推荐的商家,并不能全部推荐 set适合存放所有的展示内容二srandmember命令可以随机获取几个展展示
存储活动中奖的id 因为set的值是不可重复得 可以保证不会重复中奖.
5zset
首先数据是一个set保证和数据的值唯一性 另外还可以给每个值value赋予一个 排序权重 内部是一种跳跃列表的结构.
应用场景的话可以用作排行榜但是和list不同的是做到一个动态排序 例如
value存储用户id score设置为关注时间就可以按关注时间排序.
zset还可以存学生的id score存考试de城市
标签:set,hash,list,Redis,列表,链表,五中,字符串,数据类型 From: https://www.cnblogs.com/zhangseekchu/p/17717676.html