小言_互联网的博客

redis入门到应用

264人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场