Redis基础篇 - 5总基本数据结构
- 前言:现在Java开发都要求会点中间件,Redis又是其中最普遍的。不会点Redis都不好意思说是个开发了。虽然可能一般用的不多,最多用来做个缓存。那些集群,哨兵,持久化,分布式锁和消息队列可能都没用到
但是总要有梦想是不是
大纲脑图:本文只了解基本数据结构
1. Redis是什么
- Redis是一款开源的,基于内存的,K-V结构的,“单线程”,支持持久化的非关系型数据
- 开源意味着免费使用。(别小看免费,要是MySQL和Oracle数据库一样也不会这么多人用了)
- 支持持久化,可以固化到内存
- 基于内存,K-V结构,利用hash查询,还在内存里面,查询非常高效
- 支持集群,能提供高可用
- 单线程,意味着线程安全,且代表了原子性。天生对事务友好,而且单线程意味着效率比较高(前提得是操作内存,如果是操作磁盘,单线程的程序估计就导致低效率了)
2. 五种基本数据结构
- Redis是基于K-V数据结构的,其K都是String类型,5中类型指的是V。
- 可以对比着Java的容器理解,K是容器实例名字用Hash举个例子,【hmset book book0 Java核心技术 book1 MySQL必知必会 book2 Redis深度历险】是不是很像HashMap,其中book是HashMap对象,book0 Java核心技术,book2 MySQL必知必会,book2 Redis是面的K-V数据
- 另外,Redis的字符串不用加引号
2.1 String
String字符串是最基本的数据结构
2.1.1 基本特点
- 动态字符串,用多少申请多少空间,可以扩展
- 最大512M(咱也没弄清楚为什么是512M,我猜测是如果超过了512M迁移起来很不方便,毕竟是单线程,如果String太大,迁移就可能卡顿)
- 小于1M的时候,扩展系数树 *2,也就是每次扩展放大一倍,当大于1M是,每次扩展是+1M (了解网络的的能知道,解决网络拥塞的算法里面,有个慢开始,拥塞避免算法。相当类似了)
2.1.2 应用场景
1.服务器存储Session
2.支持位图操作,可以用来存储签到数据
3. 分布式锁也是用的这个(不是利用其数据结构,什么数据结构都一样,里利用Redis的单线程特点)
2.1.3 CRUD语句
//增和改
set book Java核心技术
//批量处理
mset book1 Java核心技术 book2 Redis深度历险 book3 人生的智慧
//查询
get book
//批量查询
mget book1 book2
//删除
del book1 book2 book3
2.2 List(列表)
类比Java的LinkedList,是个双向链表
2.2.1 基本特点
- 两端都可以出队或入队
- 之前用的压缩列表(zipList)存储,后面改快速列表(quickList)
2.2.2 应用场景
- 消息队列(缺陷是不能重复消费,rpop之后数据就没了)
2.2.3 CRUD语句
//入队 往队尾添加和往队首添加
rpush book Java核心基础 Redis设计与实现原理 并发编程的艺术
lpush book MySQL技术内幕
//出队 队头弹出和队尾弹出
lpop book
rpop book
//删除 队列
del book
2.3 Hash(字典)
可以参考Java的HashMap基本是一致的,都是数组加链表的形式,不过扩容稍微有点不同
2.3.1 基本特点
- 与HashMap类似
- 元素较少时用压缩列表(zipList)存储
- 渐进式扩容:扩容时有两个Hash,将旧的数据新Hash插入,如果查询的数据在就Hash上,马上将其存到新Hash上,新存的数据都放在新Hash上
- 如果Hash变小,当容量小于数组的10%时,提供会缩小以节省空间
- siphash算法(就认为是个很好的hash算法,细节咱暂不清楚,,,)
2.3.2 应用场景
- 用来存储具体的实例对象,各个属性以K-V结构存储(参考我下面的语句,实例名dog001,属性name的值为 小花 属性weight 为10kg 属性sound为 汪汪汪)
2.3.3 CRUD语句
//添加
hset dog001 name 小花
//批量添加
hmset dog001 weight 10kg sound 汪汪汪
//查询全部
hgetall dog001
//查询单个key
hget dog001 name
//批量查询
hmget dog001 name weight
//删除
del dog001
2.4 Set(集)
参考Java的HashSet理解
2.4.1 基本特点
- 不允许重复数据,利用Hash实现,只不过其value都是null
- 无序
2.4.2 应用场景
- 用来去重是极好的
- 用来统计访问人数
2.4.3 CRUD语句
//新增
sadd book Java核心技术 Java编程实现 MySQL实现原理
//变量
smembers book
//删除
del book
2.5 Zset(或者叫Sort Set,有序集)
这个有点坑,在不同的文章,叫法不一样。我最开始看的时候还以为Zset和SortSet是两种数据结构。我个人倾向Zset这种,因为其命令是Zadd这种
2.5.1 基本特点
- 在Set的基础上带有Score字段,带有权重
- 不允许重复
- 元素较少时用压缩列表存储
- 跳跃列表(咱还么看明白)实现查询
2.5.2 应用场景
- 有优先级的消息队列
- 统计用户一段时间的访问情况
2.5.3 CRUD语句
//添加
zadd book 50 Java核心技术 20 Redis深度历险 30 MySQL必知必会
//查询
zrange book 0 50
//删除
del book
3. 小结
- 一共有五种数据结构(针对V)
- K全部是String
- Hash一般用来存储对象 渐进式Hash
- List用的最多,可以做消息队列
- Zset也可以用来做带权重的的队列
语法记忆
- 删除语句是通用的 del
- 各个和名字官僚例如get语句 Hash 是H开头,List是L开头 Zset是Z开头
- 批量处理价m
- 一般都是 get,set add 的变种
吐槽:之前看的时候就觉得Redis的基础语句蛮简单的,后面我电脑到手。收到看了下。发现基础语句比我想象的要,,简单些。就类似于MarkDown语句。多用自然就熟悉了。而且有共性
这篇博客本来应该是昨天就搞完的。结果今天下午2020-4-2 18:07:34还没搞完
花间一壶酒,独酌不相亲。举杯邀明月,对影成三人
博主:五更依旧朝花落