1. NoSQL 数据库简介
1.1. 技术发展
就不讲了
1.2. NoSQL数据库
1.2.1. NoSQL数据库概述
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。
NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。
1. 不遵循SQL标准。
2. 不支持ACID。
3. 远超于SQL的性能。
1.2.2. NoSQL适用场景
1. 对数据高并发的读写
2. 海量数据的读写
3. 对数据高可扩展性的
1.2.3. NoSQL不适用场景
需要事务支持
基于sql的结构化查询存储,处理复杂的关系,需要即时查询。
(用不着sql的和用了sql也不行的情况,请考虑用NoSql)
1.2.4. Memcache
很早出现的NoSql数据库
数据都在内存中,一般不持久化
支持简单的key-value模式,支持类型单一
一般是作为缓存数据库辅助持久化的数据库
1.2.5. Redis
几乎覆盖了Memcached的绝大部分功能
数据都在内存中,支持持久化,主要用作备份恢复
除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。
一般是作为缓存数据库辅助持久化的数据库
1.2.6. MongoDB
高性能、开源、模式自由(schema free)的文档型数据库
数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能
支持二进制数据及大型对象
可以根据数据的特点替代RDBMS(关系型数据库) ,成为独立的数据库。或者配合RDBMS,存储特定的数据。
1.3. 行式存储数据库(大数据时代)
比如有个user表,字段名为id,name ,值为:1 张三 2 李四 3 王五
1.3.1. 行式数据库
存储格式为:user:{id=1,name=张三}
1.3.2. 列式数据库
存储格式为:user:id{1,2,3} user:name{张三,李四,王五}
1.3.2.1. Hbase
HBase是Hadoop项目中的数据库。它用于需要对大量的数据进行随机、实时的读写操作的场景中。
HBase的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过10亿行数据,还可处理有数百万列元素的数据表。
1.3.2.2. Cassandra[kəˈsændrə]
Apache Cassandra是一款免费的开源NoSQL数据库,其设计目的在于管理由大量商用服务器构建起来的庞大集群上的海量数据集(数据量通常达到PB(1PB(Petabyte 千万亿字节 拍字节)=1024TB)级别)。在众多显著特性当中,Cassandra最为卓越的长处是对写入及读取操作进行规模调整,而且其不强调主集群的设计思路能够以相对直观的方式简化各集群的创建与扩展流程。
2. Redis概述安装
Redis是一个开源的key-value存储系统。
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,Redis支持各种不同方式的排序。
与memcached一样,为了保证效率,数据都是缓存在内存中。
区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
并且在此基础上实现了master-slave(主从)同步。
针对以上特别解释下redis的原子性
原子性
原子性是数据库的事务中的特性。在数据库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
对于Redis而言:
所谓原子操作是指不会被线程调度机制打断的操作;
这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。
(1)在单线程中, 能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于指令之间。
(2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。
Redis单命令的原子性主要得益于Redis的单线程。
案例:
java中的i++是否是原子操作?不是(因为java是多线程)
i=0;两个线程分别对i进行++100次,值是多少? (2-200)
2.1. 应用场景
2.1.1. 配合关系型数据库做高速缓存
- 高频次,热门访问的数据,降低数据库IO
- 分布式架构,做session共享
2.1.2. 多样的数据结构存储持久化数据
2.2. Redis安装
官网:http://redis.io
中文官网:http://redis.cn/
2.2.1. 安装版本
- 6.2.1 for Linux(redis-6.2.1.tar.gz)
- 不用考虑在windows环境下对Redis的支持
2.2.2. 安装步骤
2.2.2.1. 准备工作:下载安装最新版的gcc编译器
安装C 语言的编译环境
yum install centos-release-scl scl-utils-build
yum install -y devtoolset-8-toolchain
scl enable devtoolset-8 bash
测试 gcc版本
gcc --version
2.2.2.2. 下载redis-6.2.1.tar.gz放/user/local目录
2.2.2.3. 解压命令:tar -zxvf redis-6.2.1.tar.gz
2.2.2.4. 解压完成后更改目录名称:mv redis-6.2.1/ redis 进入目录:cd redis
2.2.2.5. 在redis目录下再次执行make命令(只是编译好):make
2.2.2.6. 如果没有准备好C语言编译环境,make 会报错—Jemalloc/jemalloc.h:没有那个文件
2.2.2.7. 解决方案:运行make distclean
2.2.2.8. 在redis目录下再次执行make命令(只是编译好)
2.2.2.9. cd /redis/src 目录下执行:make install
2.2.2.10. cd redis/ 创建2个目录 mkdir etc 和mkdir bin
2.2.2.11. mv redis.conf /usr/local/redis/etc/
2.2.2.12. cd src/ 目录后执行:mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server /usr/local/redis/bin/
2.2.3. 安装目录:/usr/local/redis/bin
查看默认安装目录下文件的作用:
redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口
2.2.4. 前台启动(不推荐)
前台启动,命令行窗口不能关闭,否则服务器停止
2.2.5. 后台启动(推荐)
2.2.5.1. 备份redis.conf
cp redis.conf myredis.conf
2.2.5.2. 后台启动设置daemonize no改成yes
修改redis.conf(128行)文件将里面的daemonize no 改成 yes,让服务在后台启动
2.2.5.3. Redis启动
进入bin目录下
redis-server /user/local/redis/etc/redis.conf
2.2.5.4. 用客户端访问:
- 直接连接redis-cli
- 如果想指定ip和端口时可用:redis-cli -h xxxx -p 6379
- 如果需要密码连接时再执行:auth pwd
**2.2.5.6. 测试验证: **
输入:ping
输出结果为:PONG
看到redis连接成功
2.2.5.7. Redis关闭
关闭:redis-cli shutdown
也可以进入终端后(终端指连接上redis服务器)再关闭:shutdown
2.2.6. Redis介绍相关知识
端口6379 从何而来:Alessia Merz
默认16个数据库,类似数组下标从0开始,初始默认使用0号库
使用命令 select 来切换数据库。如: select 8
统一密码管理,所有库同样密码。
dbsize 查看当前数据库的key的数量
flushdb 清空当前库
flushall 通杀全部库
Redis是单线程+多路IO复用技术
单线程指的是执行redis命令 时还是用的单线程,
多路io复用?
3. 常用五大数据类型
哪里去获得redis常见数据类型操作命令http://www.redis.cn/commands.html
3.1. Redis键(key)
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通杀全部库
3.2. Redis字符串(String)
3.2.1. 简介
String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
3.2.2. 常用命令
set 添加键值对 语法:set a1 v1
*NX:当数据库中key不存在时,可以将key-value添加数据库 语法:set a1 v1 nx
*XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥 语法:set a1 v1 xx
*EX:key的超时秒数 语法:set a1 v1 ex 10
*PX:key的超时毫秒数,与EX互斥 语法:set a1 v1 px 10
get 查询对应键值 语法:get a1
append 将给定的 追加到原值的末尾 语法:set a1 hhhh 最后get a1 输出的结果为v1hhhh
strlen 获得值的长度 语法:strlent a1
setnx 只有在 key 不存在时 设置 key 的值 语法:setnx a1 v2 重新get a1 时发现 值还是原值v1
incr 将 key 中储存的数字值增1 ,只能对数字值操作,如果为空,新增值为1 语法:注意只能是数字类型的才可以使用参数。且是(原子操作)set a2 5 incr a2
decr 将 key 中储存的数字值减1 只能对数字值操作,如果为空,新增值为-1语法: decr a2
incrby / decrby <步长>将 key 中储存的数字值增减。自定义步长。语法:incrby a2 3 或 decrby a2 3
mset 同时设置一个或多个 key-value对 语法:mset a1 v1 a2 v2
mget 同时获取一个或多个值 语法:mget a1 a2
msetnx 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 语法:msetnx a1 v2
getrange <起始位置><结束位置> 获得值的范围,类似java中的substring,前包,后包 语法:getrange a8 0 4
setrange <起始位置> 用 覆写所储存的字符串值,从<起始位置>开始(索引从0开始)。语法:setrange a8 4 apple
setex <过期时间> 设置键值的同时,设置过期时间,单位秒。语法:setex a9 10 v9
getset 以新换旧,设置了新值同时获得旧值。语法:getset a1 v9 结果为a1的旧值v1
3.2.3. 数据结构
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配.
如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
3.3. Redis列表(List)
3.3.1. 简介
单键多值
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
3.3.2. 常用命令
lpush/rpush … 从左边/右边插入一个或多个值。语法:lpush a1 v1 v2 v3 成功之后的循序为 v3 v2 v1
lpop/rpop 从左边/右边吐出一个值。值在键在,值光键亡。语法:lpush a1 结果为v3
rpoplpush a1 a2 从a1列表右边吐出一个值,插到a2列表左边。
lrange 语法:lrange a1 0 -1 查询所有
lindex 按下标获取元素 语法:lindex a1 0
llen 获得列表长度 语法:llen a1
linsert a1 before v2 v9 在key a1的值v2前插入v9
linsert a1 after v2 v10