视频链接:【编程不良人】适合后端编程人员的Redis实战教程、redis应用场景、分布式缓存、Session管理、面试相关等已完结!_哔哩哔哩_bilibili
1. NoSQL的引言
NoSQL(Not Only SQL
),意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类早期就有人提出,发展至2009年趋势越发高涨。
关系型数据库(RDBMS):通过SQL语句操作 存储数据 如:MySQL、Oracle等
非关系型数据库:不一定通过SQL语句操作 存储数据
2. 为什么是NoSQL?
随着互联网网站的兴起,传统的关系数据库在应付动态网站,特别是超大规模和高并发的纯动态网站已经显得力不从心,暴露了很多难以克服的问题。如商城网站中对商品数据频繁查询
(缓存)、对热搜商品的排行统计
(统计)、订单超时问题
(过期自动超时)、以及微信朋友圈(音频,视频)存储
((存储)等相关使用传统的关系型数据库实现就显得非常复杂,虽然能实现相应功能但是在性能上却不是那么乐观。nosql这个技术门类的出现,更好的解决了这些问题,它告诉了世界不仅仅是sql,提出了对问题的新的解决方案。
3. NoSQL的四大分类
3.1 键值对(Key-Value)存储数据库
# 1.说明: - 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。 - 类似Java中的Map<key,value> # 2.特点 - Key/value模型对于IT系统来说的优势在于简单、易部署。 - 但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。 - key value:如10000中查询/更新2个,需要遍历,找到才能操作,效率低 # 3.相关产品 - Tokyo Cabinet/Tyrant, - `Redis` key value 基于内存 速度快(运行软件---内存---操作) 使用广泛 - `SSDB` key value 基于硬盘(运行软件---磁盘---内存---操作) - Voldemort - Oracle BDB
3.2 列存储数据库
# 1.说明 - 这部分数据库通常是用来应对分布式存储的海量数据。 # 2.特点 - 键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。 - 一键指向多列 - key rouingkey # 3.相关产品 - Cassandra、`HBase`、Riak.
3.3 文档型(Document)数据库
# 1.说明 - 文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似,该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,而且文档型数据库比键值数据库的查询效率更高。 # 2.特点 - 以文档形式存储 - {"id":"1","name":"zhangsan","age":"20","tags":["学生","帅哥","学霸"]} - {"id":"1","name":"zhangsan","age":"20"} - 类似json格式 查询快,使用灵活,没有严格的库表结构,支持复杂的数据存储 # 3.相关产品 - `MongoDB`、CouchDB、 MongoDb(4.x). 国内也有文档型数据库SequoiaDB,已经开源。 - ↑ - BSON格式,事务支持不好
3.4 图形(Graph)数据库
# 1.说明 - 图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。 - 二进制存储 # 2.特点 - NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。 # 3.相关产品 - Neo4J、`InfoGrid`、 Infinite Graph、
4. NoSQL应用场景
-
数据模型比较简单
-
需要灵活性更强的IT系统(系统设计灵活、性能要求比较高)
-
对数据库性能要求较高
-
不需要高度的数据一致性(NoSQL产品对事务支持不是特别良好)
5. 什么是Redis?
官网:Redis
中文网站:CRUG网站 ,软件更新速度较慢
旧版:
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.
新版:
Redis:开源 遵循BSD 基于内存(RAM,读写快、断电立即消失) 数据存储 被用于作为数据库、缓存、消息中间件
持久化机制:定期将内存中数据写入到磁盘(ROM,数据持久化)中,保证数据不丢失
数据库:硬盘存储---内存---操作
总结:redis是一个内存型的数据库
6. Redis特点
-
Redis是一个高性能key/value内存型数据库
-
Redis支持丰富的数据类型(String、List、Set、Zset、Hash),相比于Memcache(字符串,对象) 丰富
-
Redis支持持久化,可将内存中数据持久化到磁盘中
-
Redis单线程、单进程,借鉴了Memcache(多线程、线程锁),效率高,不支持并发,不存在线程安全问题:Redis实现分布式锁
7. Redis安装
视频链接:2.Redis的下载和安装_哔哩哔哩_bilibili
# 0.准备环境 - vmware15.x+ - centos7.x+ # 1.下载redis源码包 - https://redis.io/
# 2.下载完整源码包 - redis-4.0.10.tar.gz
# 3.将下载redis资料包上传到Linux中(拖进去)
# 4.解压缩文件 [root@localhost ~]# tar -zxvf redis-4.0.10.tar.gz [root@localhost ~]# ll
# 5.安装gcc - yum install -y gcc # 6.进入解压缩目录执行如下命令 - make MALLOC=libc # 7.编译完成后执行如下命令 - make install PREFIX=/usr/redis # 8.进入/usr/redis目录启动redis服务 - ./redis-server
# 9.Redis服务端口默认是 6379 # 10.进入bin目录执行客户端连接操作 - ./redis-cli –p 6379
# 11.连接成功出现上面界面连接成功
关于Redis安装在Linux(默认安装包就是安装在Linux系统上的)还是Windows系统上的区别:
8. Redis数据库相关指令
视频链接:3.Redis细节以及key的操作指令_哔哩哔哩_bilibili
8.1 数据库操作指令
# 1.Redis中库说明 - 使用redis的默认配置器动redis服务后,默认会存在16个库,编号从0-15 - 可以使用select 库的编号 来选择一个redis的库 # 2.Redis中操作库的指令 - 清空当前的库 FLUSHDB(Tab键提示且自动变大写) - 清空全部的库 FLUSHALL # 3.redis客户端显示中文 - ./redis-cli -p 7000 --raw
8.2 操作key相关指令
# 1.DEL指令 - 语法 : DEL key [key ...] - 作用 : 删除给定的一个或多个key 。不存在的key 会被忽略。 - 可用版本: >= 1.0.0 - 返回值: 被删除key 的数量。 - 举例:del name # 2.EXISTS指令 - 语法: EXISTS key - 作用: 检查给定key 是否存在。 - 可用版本: >= 1.0.0 - 返回值: 若key 存在,返回1 ,否则返回0。 - 举例:exists name,存在返回1,不存在返回0 - exists name age bir,存在几个返回几,都不存在返回0(key可指定多个) # 3.EXPIRE指令(解决超时问题) - 语法: EXPIRE key seconds - 作用: 为给定key 设置生存时间,当key 过期时(生存时间为0 ),它会被自动删除。 - 可用版本: >= 1.0.0 - 时间复杂度: O(1) - 返回值:设置成功返回1 。 - 举例:expire name 10,设置name的有效期为10秒 # 4.KEYS - 语法 : KEYS pattern - 作用 : 查找所有符合给定模式pattern的key 。 - 语法: KEYS *:匹配数据库中所有key 。 KEYS h?llo:?表示匹配一个字符,匹配hello ,hallo 和hxllo等。 KEYS h*llo:*表示匹配0到任意多个字符,匹配hllo 和heeeeello 等。 KEYS h[ae]llo :[]表示匹配一个,匹配a或者e,匹配hello 和hallo ,但不匹配hillo 。特殊符号用 "\" 隔开 KEYS h[a][e]llo - 可用版本: >= 1.0.0 - 返回值: 符合给定模式的key 列表。 # 5.MOVE - 语法 : MOVE key db - 作用 : 将当前数据库的key 移动到给定的数据库db当中。 - 可用版本: >= 1.0.0 - 返回值: 移动成功返回1 ,失败则返回0。 - 举例:move name 1,将key对应name的键值对移到1号库 # 6.PEXPIRE - 语法 : PEXPIRE key milliseconds - 作用 : 这个命令和EXPIRE命令的作用类似,但是它以毫秒为单位设置key的生存时间,而不像EXPIRE命令那样,以秒为单位。 - 可用版本: >= 2.6.0 - 时间复杂度: O(1) - 返回值:设置成功,返回1;key不存在或设置失败,返回0 - 举例:pexpire name 10 # 7.PEXPIREAT - 语法 : PEXPIREAT key milliseconds-timestamp - 作用 : 这个命令和EXPIREAT命令类似,但它以毫秒为单位设置key的过期unix时间戳,而不是像EXPIREAT那样,以秒为单位。 - 可用版本: >= 2.6.0 - 返回值:如果生存时间设置成功,返回1。当key不存在或没办法设置生存时间时,返回0。(查看EXPIRE命令获取更多信息) - 举例:pexpireat name 5000,设置name的有效期为5000毫秒,即5秒 # 8.TTL - 语法 : TTL key - 作用 : 以秒为单位,返回给定key的剩余生存时间(TTL, time to live)。 - 可用版本: >= 1.0.0 - 返回值: 当key不存在时,返回-2 。 当key存在但没有设置剩余生存时间时(永久存储),返回-1。 否则,返回>=0的数,以秒为单位,返回key的剩余生存时间。 - Note : 在Redis 2.8以前,当key不存在,或者key没有设置剩余生存时间时,命令都返回-1。 - 举例:ttl name # 9.PTTL - 语法 : PTTL key - 作用 : 这个命令类似于TTL命令,但它以毫秒为单位返回key的剩余生存时间,而不是像TTL命令那样,以秒为单位。 - 可用版本: >= 2.6.0 - 返回值: 当key 不存在时,返回-2 。当key存在但没有设置剩余生存时间时,返回-1。 - 否则,以毫秒为单位,返回key 的剩余生存时间。 - 注意 : 在Redis 2.8以前,当key不存在,或者key没有设置剩余生存时间时,命令都返回-1。 - 举例:ttl name # 10.RANDOMKEY - 语法 : RANDOMKEY - 作用 : 从当前数据库中随机返回(不删除) 一个key 。 - 可用版本: >= 1.0.0 - 返回值:当数据库不为空时,返回一个key 。当数据库为空时,返回nil。 - 举例:randomkey name,随机返回一个key # 视频链接:https://www.bilibili.com/video/BV1jD4y1Q7tU?p=4 # 11.RENAME - 语法 : RENAME key newkey - 作用 : 将key改名为newkey。当key和newkey相同,或者key不存在时,返回一个错误。当newkey已经存在时,RENAME命令将覆盖旧值。 - 可用版本: >= 1.0.0 - 返回值: 改名成功时提示OK,失败时候返回一个错误。 - 举例:rename name username # 12.TYPE - 语法 : TYPE key - 作用 : 返回key所储存的值的类型。 - 可用版本: >= 1.0.0 - 返回值: none (key 不存在) string (字符串) list (列表) set (集合) zset (有序集) hash (哈希表) - 举例:type name
8.3 String类型
8.3.1 内存存储模型
8.3.2 常用操作命令
命令 | 说明 |
---|---|
set 键名 值 | 设置一个key/value |
get 键名 | 根据key获得对应的value |
mset(more set) 键名1 值1 键名2 值2 键名3 值3 | 一次设置多个key value |
mget(more get) 键名1 键名2 键名3 | 一次获得多个key的value |
getset 键名 新值 | 获得原始key的值,同时设置新值 |
strlen 键名 | 获得对应key存储value的长度 |
append 键名 值追加内容 | 为对应key的value追加内容 |
getrange(索引从0开始,最后索引可用-1代替) 键名 起点 终点 | 截取指定范围value的内容 |
setex 键名 存活时间(秒) 值;ttl 键名(查看存活时间) | 设置一个key存活的有效期(秒) |
psetex键名 存活时间(毫秒) 值;pttl 键名(查看存活时间) | 设置一个key存活的有效期(毫秒) |
setnx(set not exists)键名 值 | 存在,不做任何操作;不存在,执行添加操作 |
msetnx(原子操作:只要有一个存在不做任何操作,要都不存在才执行) 键名1 值1 键名2 值2 键名3 值3 | 可以同时设置多个key,只要有一个存在就不做任何处理 |
decr 键名 | 进行数值类型的-1操作 |
decrby 键名 步长 | 根据提供的数据进行减法操作 |
incr 键名 | 进行数值类型的+1操作 |
incrby 键名 步长 | 根据提供的数据进行加法操作 |
Incrbyfloat 键名 小数步长(精度保留17位) | 根据提供的数据加入浮点数 |
8.4 List类型
list:列表,相当于java中list 集合
特点:元素有序且可以重复
8.4.1 内存存储模型
一键对应多值
8.4.2 常用操作指令
命令 | 说明 |
---|---|
lpush 列表名 值1 值2 值3(从左侧放) | 将某个值加入到一个key列表头部 |
lpushx(lpush exists) 列表名 值1 值2 值3(从左侧放) | 同lpush,但是必须要保证这个key存在(不能创建列表,列表已经被创建时才能使用) |
rpush 列表名 值1 值2 值3(从右侧放) | 将某个值加入到一个key列表末尾 |
rpushx(rpush exists) 列表名 值1 值2 值3(从右侧放) | 同rpush,但是必须要保证这个key存在(不能创建列表,列表已经被创建时才能使用) |
lpop 列表名 | 返回和移除列表左边的第一个元素 |
rpop 列表名 | 返回和移除列表右边的第一个元素 |
lrange 列表名 起点(从0开始) 终点(-1表示末尾) 【遍历时:0 -1】 | 获取某一个下标区间内的元素 |
llen 列表名 | 获取列表元素个数 |
lset 列表名 索引 值 | 设置某一个指定索引的值(索引必须存在) |
lindex 列表名 索引 | 获取某一个指定索引位置的元素 |
lrem 列表名 重复元素个数 值(从左侧开始匹配,重复时删除) | 删除重复元素 |
ltrim 列表名 索引起点 索引终点(索引从0开始) | 保留列表中特定区间内的元素 |
linsert 列表名 before/after 值 新值 | 在某一个元素之前/之后插入新元素 |
8.5 Set类型
视频链接:6.Set类型和Zset类型_哔哩哔哩_bilibili
特点:Set类型 Set集合 元素无序 不可以重复
8.5.1 内存存储模型
一键(String)对多值
8.5.2 常用命令
命令 | 说明 |
---|---|
sadd 键名 值1 值2 值 | 没有集合时会先创建集合,然后为集合添加元素 |
smembers 键名 | 显示集合中所有元素,无序 |
scard 键名 | 返回集合中元素的个数 |
spop 键名 | 随机返回一个元素,并将元素在集合中删除 |
smove 键名1 键名2 值 | 从一个集合中向另一个集合移动元素,必须是同一种类型 |
srem 键名 值 | 从集合中删除一个元素 |
sismember 键名 值 | 判断一个集合中是否含有这个元素,有就返回1,没有返回0 |
srandmember 键名 元素个数 | 随机返回元素,不删除 |
sdiff 键名1 键名2 键名3 ... | 去掉第一个集合中其它集合含有的相同元素 |
sinter 键名1 键名2 键名3 ... | 求交集(去重) |
sunion 键名1 键名2 键名3 ... | 求和集 |
8.6 ZSet类型
特点: 可排序的set集合 排序 不可重复
ZSET 官方 可排序SET sortSet
8.6.1 内存模型
8.6.2 常用命令
命令 | 说明 |
---|---|
zadd 键名 分数1 值1 分数2 值2 分数3 值3 | 没有集合时创建集合,然后添加集合元素,元素有序且不重复 |
zcard 键名 | 返回集合的元素个数 |
zrange(升序)/zrevrange(降序 ) 键名 下标起点 下标终点 (withscores 带此参数时显示分数) | 返回一个范围内的元素 |
zrangebyscore 键名 分数起点 分数终点 withscores limit 页码 显示条数 | 按照分数查找一个范围内的元素 |
zrank 键名 值 | 返回排名(正序) |
zrevrank 键名 值 | 倒序排名 |
zscore 键名 值 | 显示某一个元素的分数 |
zrem 键名 值1 值2 值3........ | 移除某一个或多个元素 |
zincrby 键名 加分值 值 | 给某个特定元素加分 |
8.7 hash类型
视频链接:7.Hash类型及可视化工具使用_哔哩哔哩_bilibili
redis :key(string)、value(map)
特点: value是一个map结构,存在key、value,且key是无序的
一key一map
即:[ 外key, [ 内key , 内value ] ]
8.7.1 内存模型
8.7.2 常用命令
命令 | 说明 |
---|---|
hset 外key 内key 内value | 设置一个key/value对 |
hget 外key 内key | 获得一个key对应的value |
hgetall 外key | 获得所有的key/value对 |
hdel 外key 内key | 删除某一个key/value对 |
hexists 外key 内key | 判断一个key是否存在 |
hkeys 外key | 获得所有的key |
hvals 外key | 获得所有的value |
hmset 外key 内key1 内value1 内key2 内value2...... | 设置多个key/value |
hmget 外key 内key1 内key2 ...... | 获得多个key的value |
hsetnx 外key 新内key 新内value | 设置一个不存在的key的值,内key不存在时添加,存在时不添加 |
hincrby 外key 内key 增量 | 为value进行加法运算,value必须为数值类型才可以 |
hincrbyfloat 外key 内key 增量 | 为value加入浮点值,value必须为数值类型才可以 |
9. redis桌面可视化工具
RedisDesktopManager(自行安装,下一步):
ok即可,进行连接redis服务器
双击进行查看,按照文字进行操作: