目录
一、NoSQL介绍
1.1什么是NoSQL
1.2为什么会出现NoSQL技术
1.3NoSQL的类别
1.4传统的ACID是什么
1.5 CAP
1.5.1 经典CAP图
1.5.4 什么是BASE
二、Redis概述
2.1 什么是Redis
2.2 Redis能干什么
2.3 Redis的特点
2.4 Redis与memcached对比
2.5 Redis的安装
2.6 Docker安装
三、 基本操作
3.1.1 set
3.1.2set操作的选项
3.1.3 MSET
3.2.1 get
3.2.2 GETDEL
3.2.3 getrange
3.2.4 MGET
3.3 Append
3.4.1 DESC
3.4.2 DESCBY
3.5.1 INCR
3.5.2 INCRBY
3.5.3 INCRBYFLOAT
3.6 STRLEN
3.7 UBSTR
一、NoSQL介绍
1.1什么是NoSQL
1.2为什么会出现NoSQL技术
总结 : 传统的关系型数据库只能存储结构化数据,对于非结构化的数据支持不够完善。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
1.3NoSQL的类别
- 键值(Key-Value)存储数据库说明:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/Value模型对于IT系统来说优势在于简单、易部署。应用:内容缓存,主要用于处理大量数据的高访问负载。产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB优势:快速查询劣势:存储的数据缺少结构化
- 列存储数据库说明:这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列,这些列是由列家族来安排的。应用:分布式文件系统产品:Cassandra,HBase,Riak优势:查找速度快,可扩展性强,更容易进行分布式扩展劣势:功能相对局限
- 文档型数据库说明:该类型的数据模型 是版本化的文档, 半结构化的文档以特定的格式存储,如JSON。 文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。应用:Web应用产品:CouchDB,MongoDB优势:数据结构要求不严格劣势:查询性能不高,且缺乏统一的查询语法
- 图形(Graph)数据库说明:图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。 NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。 许多NoSQL数据库都有REST格式的数据接口或者查询API。应用:社交网络产品: Neo4j,InfoGrid,Infinite Graph优势:利用图结构相关算法劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案
1.4传统的ACID是什么
- A (Atomicity) 原子性指事务里的所有操作要么都成功,要么都失败。事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
- C (Consistency) 一致性指数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
- I (Isolation) 隔离性指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
- D (Durability) 持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库中,即使出现宕机也不会丢失。
1.5 CAP
Consistency(强一致性) Availability(可用性) Partition tolerance(分区容错性)
- CA传统Oracle数据库
- AP 大多数网站架构的选择
- CP Redis、Mongodb(强一致性、分区容错性(例如A数据库中会存放B...的副本))
注意:在做分布式架构的时候必须做出取舍。==一致性和可用性之间取一个平衡==。对于大多数web应用,其实并不需要强一致性。因此牺牲C换取P,这是目前分布式数据库产品的方向。
1.5.1 经典CAP图
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
1.5.4 什么是BASE
基本可用(Basically Available)软状态(Soft state)最终一致(Eventually consistent)
二、Redis概述
2.1 什么是Redis
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
2.2 Redis能干什么
- 内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
- 取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
- 模拟类似于HttpSession这种需要设定过期时间的功能
- 发布、订阅消息系统(类似于组播,在一个组中就能收到消息)
- 定时器、计数器
2.3 Redis的特点
- 性能极高:Redis 读的速度是 110000 次 /s,写的速度是 81000 次 /s 。
- 丰富的数据类型:Redis 支持二进制案例的 String,List,Hash,Set及 ZSet 数据类型操作。
- 原子性:Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。
- 数据持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- 其他特性:Redis 还支持 publish/subscribe 通知,key 过期等特性。
Redis 提供的API支持:C、C++、C#、Clojure、Java、JavaScript、Lua、PHP、Python、Ruby、Go、Scala、Perl等多种语言。
2.4 Redis与memcached对比
- 共同点无论是Memcached还是Redis底层都是使用C语言编写,都是基于key-value,存储的数据都是在内存中。
- 不同点Memcached支持的数据类型比较简单(String,Object);Redis 支持的数据类型比较丰富。Memcached默认一个值的最大存储不能超过1M;Redis一个值的最大存储1G。Memcached中存储的数据不能持久化,一旦断电数据丢失;Redis中存储的数据可以持久化。Memcached是多线程,支持并发访问;Redis是单线程,不支持并发访问。Memcached自身不支持集群环境;Redis从3.0版本之后自身开始提供集群环境支持。、
2.5 Redis的安装
1、准备安装环境
yum install -y gcc tcl gcc-c++ make
2、上传安装文件
3、解压安装文件
tar -zxvf redis-6.2.7.tar.gz
4、进入安装目录
cd redis-6.2.7
5、运行编译命令
make && make install
说明:如果在编译过程中出现 Jemalloc/jemalloc.h:没有那个文件 没有的错误,在确保 gcc 安装成功后,可执行 make distclean 进行清除后再次安装。
- redis-server:它是 redis 的服务端启动脚本
- redis-cli:它是 redis 提供的客户端启动脚本
- redis-sentinel:它是 redis 提供的哨兵启动脚本
- redis-benchmark:性能测试工具,可以在自己电脑上运行来查看性能
- redis-check-aof:修复有问题的AOF文件
- redis-check-dump:修复有问题的dump.rdb文件
6、前台启动
redis-server
查看Redis服务:
ps -ef | grep redis关闭Redis服务:
pkill redis-server kill 进程号 单实例关闭:redis-cli shutdown 多实例关闭:redis-cli -p 6379 shutdown
7、后台启动
cp /usr/local/redis/redis.conf /etc/
vim /etc/redis.conf # 修改daemonize no
8、验证服务
redis-cli -p 6379
127.0.0.1:6379> ping
PONG
9、关闭服务
redis-cli shutdown
ps -ef | grep redis
注意:也可以进入终端后再关闭:127.0.0.1:6379> shutdown
10、相关知识
2.6 Docker安装
1、拉取镜像
// 拉取最新
docker pull redis
//拉取指定版本
docker pull redis:6.2.7
2、查看镜像
docker images
3、运行容器
docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 000415
参数说明:
–restart=always:总是开机启动 –log:配置日志 -p 6379:6379:将6379端口挂载出去 –name:给这个容器取一个名字 -v:数据卷挂载
/home/redis/myredis/myredis.conf:/etc/redis/redis.conf:这里是将 liunx 路径下的myredis.conf 和redis下的redis.conf 挂载在一起。 /home/redis/myredis/data:/data:这个同上 -d redis:表示后台启动redis redis-server /etc/redis/redis.conf:以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的/home/redis/myredis/myredis.conf –appendonly yes:开启redis 持久化 –requirepass 000415:设置密码 (如果你是通过docker 容器内部连接的话,可设可不设。但是如果想向外开放的话,一定要设置)
4、查看容器
docker ps
5、连接容器
docker exec -it myredis redis-cli
6、测试容器
set name zs
get name
三、 基本操作
3.1.1 set
格式:
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
示例:
127.0.0.1:6379> set mykey1 "hello"
OK
3.1.2set操作的选项
EX seconds -- 设置指定的过期时间,以秒为单位。
PX milliseconds -- 设置指定的过期时间,以毫秒为单位。
EXAT timestamp-seconds -- 设置指定的 Unix 时间,以秒为单位,该时间点时键将过期。
PXAT timestamp-milliseconds -- 设置指定的 Unix 时间,以毫秒为单位,该时间点时键将过期。
NX -- 仅在键不存在时设置键。
XX -- 仅在键已存在时设置键。
KEEPTTL -- 保留与键关联的过期时间。
GET -- 返回键旧的字符串值,如果键不存在则返回 nil。如果键存储的值不是字符串,则返回错误并中止 SET 操作。
示例:
127.0.0.1:6379> set mykey1 "hello"
#为键mykey1设置值“hello”
OK
127.0.0.1:6379> set mykey2 2 EX 5
#为mykey2设置过期时间5秒
OK
127.0.0.1:6379> set mykey2 2 PX 5000
#为mykey2设置过期时间5000毫秒
OK
127.0.0.1:6379> set mykey4 4 EXAT 5
#为mykey4设置unix时间,以秒为单位
OK
127.0.0.1:6379> set mykey5 5 EXAT 5000
#为mykey5设置unix时间,以毫秒为单位
OK
127.0.0.1:6379> set mykey6 6 NX
#为mykey6设置value 当mykey6不存在时创建
OK
127.0.0.1:6379> set mykey7 7 XX
#为mykey7设置value 当mykey7存在时创建(这里很明显创建失败)
(nil)
127.0.0.1:6379> set mykey6 8 GET
"6"
#返回旧键即mykey中的字符串,如果不存在则返回nil,相当于get操作
3.1.3 MSET
格式:
MSET key [key ...]
示例:
127.0.0.1:6379> mset mykey200 200 mykey300 300
#一次性创建多个键值对
OK
3.2.1 get
格式:
GET Key
127.0.0.1:6379> get mykey1
#查找一个存在的键
"hello"
127.0.0.1:6379> get mykey100
#查找一个不存在的键
(nil)
3.2.2 GETDEL
格式:
GETDEL key
示例:
127.0.0.1:6379> set mykey10 100
#新建一个mykey10键并且赋值
OK
127.0.0.1:6379> getdel mykey10
#找到并且删除该mykey10
"100"
127.0.0.1:6379> get mykey10
#再查看就查不到了
(nil)
3.2.3 getrange
格式:
GETRANGE key start end
示例:
127.0.0.1:6379> getrange mykey1 2 8
#指定查看的键为mykey1 起始位置为2 结束到8
"llo wor"
3.2.4 MGET
格式:
MGET key [key ...]
示例:
127.0.0.1:6379> mget mykey200 mykey300
1) "200"
2) "300"
3.3 Append
APPEND key value
示例:
127.0.0.1:6379> append mykey1 " world"
#为mykey1后面追加“ world”
(integer) 11
127.0.0.1:6379> get mykey1
#查看
"hello world"
3.4.1 DESC
DECR key
示例:
127.0.0.1:6379> set mykey8 1
OK
127.0.0.1:6379> decr mykey8
(integer) 0
127.0.0.1:6379> decr mykey8
(integer) -1
注意:
(1)desc 能够自减的对象必须是一个数值型数据
(2)desc只能进行自减一的操作
3.4.2 DESCBY
格式:
DECRBY key decrement
示例:
127.0.0.1:6379> decrby mykey8 10
#自减并且指定偏移量为10
(integer) -11
3.5.1 INCR
格式:
INCR key
示例:
127.0.0.1:6379> incr mykey8
(integer) -10
3.5.2 INCRBY
INCRBY key increment
127.0.0.1:6379> incrby mykey8 20
(integer) 10
3.5.3 INCRBYFLOAT
INCRBYFLOAT key increment
示例:
127.0.0.1:6379> incrbyfloat mykey8 0.1
#incrbyfloat 可以使用浮点数自增
"10.1"
3.6 STRLEN
格式:
STRLEN key
示例:
127.0.0.1:6379> strlen mykey1
#获取指定键中的值的长度
(integer) 11
3.7 UBSTR
格式:
SUBSTR key start end
示例:
127.0.0.1:6379> substr mykey1 0 7
#获取指定键子串 起始0 结束到7
"hello wo"