文章目录
1. 关系型数据库(SQL)
1.1 特点
数据与数据之间,表和字段之间,表和表之间存在关系。关系型数据库适合处理一般量级的数据,并且需要保证安全的数据。
1.2 优点
- 数据之间有关系,进行数据的增删改查时很方便
- 关系型数据库有事务操作,可以保证数据的完整性
1.3 缺点
- 因为数据与数据之间有关系,关系是由底层大量算法保证的,简单运行一个select语句,底层就需要调用大量算法。大量算法会拉低系统运行速度,会消耗系统资源
- 海量数据的增删改查时会显得无力,很可能宕机
- 海量数据环境下对数据表进行维护和扩展,不论是对数据维护还是对数据表的结构维护,都会会显得无力,很可能直接宕机,维护失败
2. 非关系型数据库(NOSQL)
2.1 特点
为了处理海量数据,需要将关系型数据库的关系去掉。非关系型数据库的出现就是为了替代关系型数据库。非关系型数据库适合处理海量数据,要求处理数据的效率要高,但不一定是安全的数据。简而言之,不重要、不怕丢的数据保存在非关系型数据库中。
2.2 优点
- 海量数据的增删改查,非常轻松应对
- 海量数据的维护非常轻松
2.3 缺点
- 数据与数据之间没有关系,所以不能一目了然
- 非关系型数据库没有关系的存在,没有强大的事务保证数据的完整性和安全性
2.4 两种数据库的结合
项目中的数据分批保存,重要的数据放在关系型数据中,不重要的海量操作的数据放在非关系型数据中。
3. 非关系型数据库产品
非关系型数据库分为四大类:
3.1 键值存储数据库
键值存储数据库相关产品有Redis、Tokyo Cabinet/Tyrant、Voldemort、Berkeley DB,主要用于处理大数据的高访问负载,优势是查询速度快、稳定性强。
3.2 列存储数据库
列存储数据库的相关产品有HBase、Cassandra、Riak,它是一种分布式文件系统,以列列簇式存储式存储,将同一列数据存在一起。优势是查询速度快,可扩展性强,更容易进行分布式扩展。缺点是功能相对局限,使用极大的内存才可以调配。它会不停地在内存中分表分块,对内存的占用是极大的。
3.3 文档数据库(淘汰)
文档数据库的相关产品有CouchDB、MongoDB,可用于Web应用(与key-value类似,value是结构化的)。数据类型是一系列的键值对,优势是数据结构要求不严格。缺点是查询性能不高,而且缺乏统一的查询语法。
3.4 图像数据库
相关数据库有Neo4J、InfoGrid、Infinite Graph,一般应用于社交网,数据类型是图结构。它的优势是利用图结构相关算法,缺点是需要对整个图计算才能得到结果,不容易做分布式的集群方案,局限性强。
4. redis的使用环境
① 可以作为关系型数据库的缓存,缓解关系数据库的压力
② 可以做任务队列
③ 可以做集合的大量数据运算,这是关系型数据做不到的
④ 可以做大量数据的排行榜
5. redis的安装与启动
5.1 安装
redis下载页:https://redis.io/download,redis是c语言开发的,安装redis需要先将源码包进行编译,编译依赖于gcc环境。
# 如果没有gcc,首先需要安装gcc
[root@instance-mtfsf05r ~]# yum install gcc -y
# 下载源码包
[root@instance-mtfsf05r ~]# wget http://download.redis.io/releases/redis-5.0.5.tar.gz
# 解压缩
[root@instance-mtfsf05r ~]# tar -zxf redis-5.0.5.tar.gz
# 进入redis目录中
[root@instance-mtfsf05r ~]# cd redis-5.0.5
# 编译
[root@instance-mtfsf05r redis-5.0.5]# make
# 安装到指定的目录,我这里安装到/usr/local/redis/
[root@instance-mtfsf05r redis-5.0.5]# make PREFIX=/usr/local/redis/ install
安装之后,在/usr/local/redis/bin目录下有下面几个文件:[root@instance-mtfsf05r ~]# ls /usr/local/bin/
redis-benchmark # 性能测试工具
redis-check-aof # AOF文件修复工具
redis-check-rdb # RDB文件检查工具(快照持久化文件)
redis-cli # 命令行客户端
redis-server # redis服务器启动命令
redis-sentinel
sqlite3
将配置文件redis.conf复制到/usr/local/redis/目录下:
[root@instance-mtfsf05r redis-5.0.5]# cp redis.conf /usr/local/redis/
注意:如果没有这个配置文件redis也可以启动,不过将启用默认配置,这样不方便我们修改端口号等信息。
5.2 前端启动
# 进入redis服务器目录
[root@instance-mtfsf05r ~]# cd /usr/local/redis/
# 开启redis服务
[root@instance-mtfsf05r redis]# ./bin/redis-server
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.5 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 7268
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
# 新开一个ssh连接,切换到redis安装目录下
[root@instance-mtfsf05r ~]# cd /usr/local/
# 运行客户端程序,连接本地的redis服务器
[root@instance-mtfsf05r local]# ./bin/redis-cli
127.0.0.1:6379>
# 在客户端可以进行简单的操作
127.0.0.1:6379> set username thanlon
OK
127.0.0.1:6379> get username
"thanlon"
127.0.0.1:6379>
前端启动是无法部署集群的。集群的意思是把若干台计算机连接到一起,组成集群。集群如果运算能力不足,可以再添加一台计算机。集群里的每台计算机都安装redis,形成redis集群。集群比一台同等能力的大型计算机容错性要高,集群中某些计算机出现问题,不会影响集群中的其它计算机。但是大型机如果挂掉,就完了。
./bin/redis-cli
(等价于./bin/redis-cli -h 127.0.0.1 -p 6379
)这条命令会默认连接本机的6379端口,如果机器处于外网或者端口号不是默认端口,写全一点是./bin/redis-cli -h 10.0.0.2 -p 6390
5.3 后端启动(推荐)
修改配置文件:
# 切换到redis目录下
[root@instance-mtfsf05r redis]# cd /usr/local/redis/
# 编辑redis配置文件
[root@instance-mtfsf05r redis]# vim redis.conf
# 修改配置文件,我这里修改端口、守护进程的状态和绑定的ip
port 6370 =>port 6390
daemonize no =>daemonize yes
bind 127.0.0.1 =>bind 0.0.0.0
启动时指定配置文件:
# 启动服务器
[root@instance-mtfsf05r redis]# ./bin/redis-server ./redis.conf
9401:C 05 Oct 2019 07:46:03.257 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
9401:C 05 Oct 2019 07:46:03.257 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=9401, just started
9401:C 05 Oct 2019 07:46:03.257 # Configuration loaded
# 查看进程状态信息
[root@instance-mtfsf05r redis]# ps -ef|grep redis
root 7268 1 0 07:14 ? 00:00:03 ./bin/redis-server *:6379
root 9402 1 0 07:46 ? 00:00:00 ./bin/redis-server 0.0.0.0:6390
root 9474 7365 0 07:47 pts/1 00:00:00 grep --color=auto redis
这种方式可以使用多个端口来运行redis服务,方便集群。
5.4 关闭
方式一:找到redis的PID,然后杀死进程(断电,非正常关闭。一般不使用,因为可能造成数据丢失)
# 查看进程的PID
[root@instance-mtfsf05r redis]# ps -ef|grep redis
root 7268 1 0 07:14 ? 00:00:03 ./bin/redis-server *:6379
root 9402 1 0 07:46 ? 00:00:00 ./bin/redis-server 0.0.0.0:6390
root 9474 7365 0 07:47 pts/1 00:00:00 grep --color=auto redis
# 杀死京城
[root@instance-mtfsf05r redis]# kill -9 9402
方式二(推荐):正常关闭(数据保存)
[root@instance-mtfsf05r redis]# ./bin/redis-cli -h 127.0.0.1 -p 6390 shutdown
,如果是默认端口可以直接使用[root@instance-mtfsf05r redis]# ./bin/redis-cli shutdown
,这种方式是使用客户端发起关闭redis服务的。
6. redis的数据类型
redis使用键值对保存数据,没有表的概念,类似于python中的字典和java中的map。redis中的key都是字符串,value有5种数据类型:
String:"thanlon,kiku"
hash:{username:'thanlon',age:'23'}
list:[1,2,3,4,5,6]
set:['thanlon','kiku']
Zset:[1000 'thanlon',100 'kiku']
注意:key的名字不要太长,不然会影响使用效率。如果key中有aaa、aaaa、aaaaa,我们需要aaaaa,但是它会先搜索到aaa,再搜索到aaaa,最后才是我们想要的aaaaa。所以,key名不要太常。key名也要有意义,见名知意最好。
7. String
7.1 String类型介绍
字符串类型是redis中最为基础的、常用的数据存储类型,字符串在redis中是二进制安全的,这便意味着改类型存入和获取的数据相同。在redis中字符串的value最多可以容纳的数据长度为512MB。
7.2 二进制安全
二进制安全和数据安全是没有关系的,在mysql数据库中二进制数据不安全,在redis数据库中二进制数据是安全的。
① mysql中二进制数据不安全
频繁地编解码浪费大量的系统资源,很可能因为码表不同导致乱码。
② redis中二进制数据安全
redis中编码和解码只会在客户端进行,没有频繁的编解码,执行效率很高,也不会造成乱码。
7.3 赋值
set key value:设定key持有指定的字符串value,如果key存在则进行覆盖。
127.0.0.1:6390> set username thanlon
OK
127.0.0.1:6390> set username kiku
OK
127.0.0.1:6390> get username
"kiku"
7.4 取值
get key:获取key的value值。如果key不存在返回(nil)
127.0.0.1:6390> get username
"kiku"
127.0.0.1:6390> get age
(nil)
7.5 删除
del key:删除指定的key,返回值是integer类型(整型),表示删除了几条数据。
127.0.0.1:6390> del username
(integer) 1
127.0.0.1:6390> del username
(integer) 0
7.6 扩展
getset key value:先获该key的值,再设置key的值
127.0.0.1:6390> set username thanlon
OK
127.0.0.1:6390> getset username kiku
"thanlon"
127.0.0.1:6390> get username
"kiku"
incr key:将指定的key的value递减1。如果key不存在,其初始值为0,再incr之后其值加1。如果value的值不能转成整型,则改操作值执行失败并返回失败的信息。相当于java中的++i。
127.0.0.1:6390> set num 1
OK
127.0.0.1:6390> incr num
(integer) 2
127.0.0.1:6390> incr num2
(integer) 1
127.0.0.1:6390> set num thanlon
OK
127.0.0.1:6390> incr num
(error) ERR value is not an integer or out of range
decr key:将指定的key的value递减1。如果key不存在,其初始值为0,再incr之后其值减1。如果value的值不能转成整型,则改操作值执行失败并返回失败的信息。相当于java中的–i。
127.0.0.1:6390> set num 1
OK
127.0.0.1:6390> decr num
(integer) 0
127.0.0.1:6390> decr num2
(integer) 0
127.0.0.1:6390> set num thanlon
OK
127.0.0.1:6390> decr num
(error) ERR value is not an integer or out of range
注意:incr和decr只能对字符串是数字的值进行操作。
append key value:用于拼凑字符串,如果key存在,则在原有的value中追加该值。如果key不存在,则重新创建一个key-value。
127.0.0.1:6390> set love "thanlon love "
OK
127.0.0.1:6390> append love "kiku"
(integer) 17
127.0.0.1:6390> get love
"thanlon love kiku"
127.0.0.1:6390> append age 23
(integer) 2
127.0.0.1:6390> get age
"23"
7.7 使用环境
String主要用于保存json格式的字符串,使用json格式是有好处的。例如,前端要向数据库查询一系列数据,redis一开始没有,会到关系型数据库中查询。关系型数据库成功返回数据之后,redis中也就有这条数据,并且这条数据是以json格式存储的。那样,前端再次获取一系列数据时,只需要再redis返回这个json字符串即可。
8. Hash
8.1 Hash类型介绍
redis中的hash类型可以看成具有String key和String Value的map容器。所以,该类型非常适合于存储值对象的信息,如:username,password,age,sex等。如果hash中包含很少的字段,那么该类型的数据也将仅占用很少磁盘空间。每个hash可以存储4294967295个键值对,可以对应java中的javabean。hash->{username:‘thanlon’,age:‘23’,sex:‘man’},这种数据类型看似和json格式的字符串一样的,但是如果使用字符串存储,占用的空间会大一些,如果使用hash存储,占用的磁盘空间会小一些。hash的特点是占用的磁盘空间极少。
8.2 赋值
赋值:
- haset key field value:为指定的key设置field/value键值对
# {username:"thanlon"}
127.0.0.1:6390> hset hash1 username thanlon
(integer) 1
# 这种方式下不能修改username的value
127.0.0.1:6390> hset hash1 username thanlon
(integer) 0
# 这种方式下不能修改username的value
127.0.0.1:6390> hset hash1 username kiku
(integer) 0
- hmset key field value [field2 value2…]:设置key中的多个field/value键值对
# 为key设置多个值:{username:"thanlon",age:"23",sex:"man"}
127.0.0.1:6390> hmset hash2 username thanlon age 23 sex man
OK
# 可以修改设置一个值的数据为多个值
127.0.0.1:6390> hmset hash1 username thanlon age 23 sex man
OK
8.3 取值
- hget key field:返回指定的key中的field值
127.0.0.1:6390> hget hash1 username
"thanlon"
- hmget key field:获取key中的多个field的值
127.0.0.1:6390> hmget hash2 username age
1) "thanlon"
2) "23"
- hgetall key:获取key中的所有field-value
127.0.0.1:6390> hgetall hash2
1) "username"
2) "thanlon"
3) "age"
4) "23"
5) "sex"
6) "man"
8.4 删除
- hdel key field [field…]:可以删除一个或多个字段,返回值是被删除的字段个数。
# 如果返回的结果是0,则删除的字段不存在
127.0.0.1:6390> hdel hash1 username
(integer) 1
需要注意的是如果hash1中没有字段了,整个key-value会被删掉。
- del key:删除这个键值对(这是一个通用的命令)
127.0.0.1:6390> del hash1
(integer) 1
# 已经被删除的,再次执行删除操作,返回0表示什么也没有删除
127.0.0.1:6390> del hash2
(integer) 0
8.5 扩展
- hincrby key field increment:设置key中field的值增加increment,如age增加3
127.0.0.1:6390> hmset hash1 username thanlon age 23 sex man
OK
127.0.0.1:6390> hincrby hash1 age 3
(integer) 26
- hexitsts key field:判断指定的key中的field是否存在
# 判断hash1中是否有username字段
127.0.0.1:6390> hexists hash1 username
(integer) 1
- hlen key:获取key所包含的field的数量
127.0.0.1:6390> hlen hash1
(integer) 3
- hkeys key:获取所有字段名
127.0.0.1:6390> hkeys hash1
1) "username"
2) "age"
3) "sex"
- hvals key:获取所有字段值
127.0.0.1:6390> hvals hash1
1) "thanlon"
2) "29"
3) "man"
9. List
①②③④⑤⑥⑦⑧⑨⑩
转载:https://blog.csdn.net/Thanlon/article/details/101925916