没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
Redis 6 ⼊⻔到精通 超详细 教程
0. 基础
0.1 NoSQL 数据库
0.1.1 NoSQL 概述
NoSQL(NoSQL = Not Only SQL),意即“不仅仅是 SQL ”,泛指⾮关系型的数据库。 NoSQL 不依赖业务逻辑⽅式存
储,⽽以简单的 key-value 模式存储。因此⼤⼤的增加了数据库的扩展能⼒。
不遵循SQL标准。
不⽀持ACID。
远超于SQL的性能。
0.1.2 NoSQL 适⽤场景
对数据⾼并发对读写
海量数据的读写
对数据⾼扩展性的
0.1.3 NoSQL 不适⽤场景
需要事务⽀持
基于 sql 的结构化查询存储,处理复杂的关系,需要即席查询
(⽤不着 sql 的和⽤了 sql 也不⾏的情况,请考虑⽤ NoSQL )
0.1.4 ⼏种 NoSQL 的对⽐
Memcache
Redis
MongoDB
- 很早出现的 NoSql 数据库
- 数据都在内存中,⼀般不持久化
- ⽀持简单的 key-value 模式,⽀持类型单⼀
- ⼀般是作为缓存数据库辅助持久化的数据库
- ⼏乎覆盖了 Memcached 的绝⼤部分功能
- 数据都在内存中,⽀持持久化,主要⽤作备份恢复
- 除了⽀持简单的 key-value 模式,还⽀持多种数据结构的存储,⽐如 list、set、hash、zset等。
- ⼀般是作为缓存数据库辅助持久化的数据库
1. Redis 概述
1.1 Redis 介绍
Redis 是⼀个开源的 key-value 存储系统。
和 Memcached 类似,它⽀持存储的 value 类型相对更多,包括 string (字符串)、list (链表)、set (集合)、
zset ( sorted set –有序集合) 和 hash(哈希类型)。
这些数据类型都⽀持 push / pop、add / remove 及取交集并集和差集及更丰富的操作,⽽且这些操作都是原
⼦性的。
在此基础上,Redis ⽀持各种不同⽅式的排序。
与 memcached ⼀样,为了保证效率,数据都是缓存在内存中。
区别的是 Redis 会周期性的把更新的数据写⼊磁盘或者把修改操作写⼊追加的记录⽂件。
并且在此基础上实现了 master-slave (主从) 同步。
1.2 应⽤场景
配合关系型数据库做⾼速缓存
⾼频次,热⻔访问的数据,降低数据库 IO。
分布式架构,做 session 共享。
- ⾼性能、开源、模式⾃由(schema free)的⽂档型数据库
- 数据都在内存中, 如果内存不⾜,把不常⽤的数据保存到硬盘
- 虽然是 key-value 模式,但是对 value(尤其是 json )提供了丰富的查询功能
- ⽀持⼆进制数据及⼤型对象
- 可以根据数据的特点替代 RDBMS,成为独⽴的数据库。或者配合 RDBMS,存储特定的数据。
多样化的数据结构存储持久化数据
1.3 相关技术
Redis 使⽤的是单线程 + 多路 IO 复⽤技术;
多路复⽤是指使⽤⼀个线程来检查多个⽂件描述符(Socket)的就绪状态,⽐如调⽤ select 和 poll 函数,传
⼊多个⽂件描述符,如果有⼀个⽂件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进⾏真正的操
作可以在同⼀个线程⾥执⾏,也可以启动线程执⾏(⽐如使⽤线程池)。
串⾏ vs 多线程 + 锁( memcached ) vs 单线程 + 多路 IO 复⽤ (Redis)
(与 Memcache 三点不同:⽀持多数据类型,⽀持持久化,单线程 + 多路 IO 复⽤) 。
2. Redis 数据类型
2.0 Redis 键(key)
2.1 Redis 字符串(String)
2.1.1 概述
String 是 Redis 最基本的类型,你可以理解成与 Memcached ⼀模⼀样的类型,⼀个 key 对应⼀个 value。
String 类型是⼆进制安全的。意味着 Redis 的 string 可以包含任何数据。⽐如 jpg 图⽚或者序列化的对象。
String 类型是 Redis 最基本的数据类型,⼀个 Redis 中字符串 value 最多可以是 512M。
2.1.2 常⽤命令
- keys * 查看当前库所有 key (匹配:keys *1)
- exists key 判断某个 key 是否存在
- type key 查看你的 key 是什么类型
- del key 删除指定的 key 数据
- unlink key 根据 value 选择⾮阻塞删除
仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
- expire key 10 10秒钟:为给定的key设置过期时间
- ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期
- select 命令切换数据库
- dbsize 查看当前数据库的 key 的数量
- flushdb 清空当前库
- flushall 通杀全部库
2.1.3 数据结构
String 的数据结构为简单动态字符串 ( Simple Dynamic String , 缩写 SDS),是可以修改的字符串,内部结构实现
上类似于 Java 的 ArrayList,采⽤预分配冗余空间的⽅式来减少内存的频繁分配。
如图中所示,内部为当前字符串实际分配的空间 capacity ⼀般要⾼于实际字符串⻓度 len。当字符串⻓度⼩于 1M
时,扩容都是加倍现有的空间,如果超过 1M,扩容时⼀次只会多扩 1M 的空间。需要注意的是字符串最⼤⻓度为
512M。
2.2 Redis 列表(List)
2.2.1 概述
单键多值:Redis 列表是简单的字符串列表,按照插⼊顺序排序。你可以添加⼀个元素到列表的头部(左边)或者
尾部(右边)。它的底层实际是个双向链表,对两端的操作性能很⾼,通过索引下标的操作中间的节点性能会较
差。
- set <key><value> 添加键值对
- get <key> 查询对应键值
- append <key><value> 将给定的 <value> 追加到原值的末尾
- strlen <key> 获得值的⻓度
- setnx <key><value> 只有在 key 不存在时设置 key 的值
- incr <key>
! 将 key 中储存的数字值增 1
! 只能对数字值操作,如果为空,新增值为 1
- decr <key>
! 将 key 中储存的数字值减 1
! 只能对数字值操作,如果为空,新增值为 -1
- incrby / decrby <key><步⻓> 将 key 中储存的数字值/减。⾃定义步⻓。
- 以上操作具有原⼦性。所谓原⼦操作是指不会被线程调度机制打断的操作;这种操作⼀旦开始,就⼀直运⾏到结束,
中间不会有任何 context switch(切换到另⼀个线程)。
- mset <key1><value1><key2><value2> ... 同时设置⼀个或多个 key-value 对 !
- mget <key1><key2><key3> ... 同时获取⼀个或多个 value !
- msetnx <key1><value1><key2><value2> ... 同时设置⼀个或多个 key-value 对,当且仅当所有给定
key 都不存在。
原⼦性,有⼀个失败则都失败
- getrange <key><起始位置><结束位置> 获得值的范围,类似 java 中的 substring,前包,后包
- setrange <key><起始位置><value> ⽤ <value> 覆写 <key> 所储存的字符串值,从 <起始位置> 开始
(索引从0开始)。
- setex <key><过期时间><value> 设置键值的同时,设置过期时间,单位秒。
- getset <key><value> 以新换旧,设置了新值同时获得旧值。
2.2.2 常⽤命令
2.2.3 数据结构
List 的数据结构为快速链表 quickList。
⾸先在列表元素较少的情况下会使⽤⼀块连续的内存存储,这个结构是 ziplist,也即是压缩列表。它将所有的
元素紧挨着⼀起存储,分配的是⼀块连续的内存。
当数据量⽐较多的时候才会改成 quicklist。因为普通的链表需要的附加指针空间太⼤,会⽐较浪费空间。⽐
如这个列表⾥存的只是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next。
Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使⽤双向指针串起来使⽤。这样既满
⾜了快速的插⼊删除性能,⼜不会出现太⼤的空间冗余。
2.3 Redis 集合(Set)
2.3.1 概述
Redis set 对外提供的功能与 list 类似,是⼀个列表的功能,特殊之处在于 set 是可以⾃动排重的,当你需要
存储⼀个列表数据,⼜不希望出现重复数据时,set 是⼀个很好的选择,并且 set 提供了判断某个成员是否在
⼀个 set 集合内的重要接⼝,这个也是 list 所不能提供的。
Redis 的 set 是 string 类型的⽆序集合。它底层其实是⼀个 value 为 null 的 hash 表,所以添加,删除,查找
的复杂度都是 O(1)。
⼀个算法,随着数据的增加,执⾏时间的⻓短,如果是 O(1),数据增加,查找数据的时间不变。
2.3.2 常⽤命令
- lpush/rpush <key><value1><value2><value3> ... 从左边/右边插⼊⼀个或多个值。
- lpop/rpop <key> 从左边/右边吐出⼀个值。值在键在,值光键亡。
- rpoplpush <key1><key2> 从 <key1> 列表右边吐出⼀个值,插到 <key2> 列表左边。
- lrange <key><start><stop> 按照索引下标获得元素(从左到右)
- lrange mylist 0 -1 ! 0左边第⼀个,-1右边第⼀个,(0-1表示获取所有)
- lindex <key><index> 按照索引下标获得元素(从左到右)
- llen <key> 获得列表⻓度
- linsert <key> before <value><newvalue> 在 <value> 的后⾯插⼊值 <newvalue>
- lrem <key><n><value> 从左边删除 n 个 value (从左到右)
- lset <key><index><value> 将列表 key 下标为 index 的值替换成 value
剩余35页未读,继续阅读
啊啊嗯嗯
- 粉丝: 15
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论10