NOSQL数据库之 REDIS

一、NOSQL

1、简介

NoSQL ,(Not Only SQL),泛指非关系型数据库。

特点:

NoSQL 通常是以key-value形式存储,

不支持SQL语句,

没有表结构

2、优缺点:

优点:

高并发读写的性能

大数据量的扩展(分布式存储)

配置简单

灵活、高效的操作与数据模型

低廉的成本

不足之处:

没有统一的标准

没有正式的官方支持

各种产品还不算成熟

3、常见nosql产品

redis算nosql吗 redis是nosql数据库吗_操作系统

redis算nosql吗 redis是nosql数据库吗_数据库_02

二、redis介绍

1、概述

(1)Redis是Remote Dictionary Server(远程数据服务)的缩写.

由意大利人antirez(Salvatore Sanfilippo)开发的一款内存高速缓存数据库

(2)该软件使用C语言编写,它的数据模型为key-value

(3)它支持存储的value类型很多,包括string(字符串)、hash(哈希)、list(链表)set(集合)、Zset(有序集合)

(4)为了保证效率数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。

2、特点

1)高速读取数据(in-memory)

2)减轻数据库负担

3)有集合计算功能(优于普通数据库和同类别产品)

4)多种数据结构支持

3、适合场合及其优势

1)[Sort Set]排行榜应用,取top n操作,例如sina微博热门话题

2)[List]获得最新N个数据 或 某个分类的最新数据

3)计数器应用

4)[Set]sns(social network site)获得共同好友

5)[Set]防攻击系统(ip判断)等等

 

4、与memcache比较说明

redis与memcache比较

(1)数据类型:memcache支持的数据类型就是字符串,redis支持的数据类型有字符串,哈希,链表,集合,有序集合。

(2)持久化:memcache数据是存储到内存里面,一旦断电,或重启,则数据丢失。redis数据也是存储到内存里面的,但是可以持久化,周期性的把数据给保存到硬盘里面,导致重启,或断电不会丢失数据。

(3)数据量:memcahce一个键存储的数据最大是1M,而redis的一个键值,存储的最大数据量是1G的数据量。

三、安装启动

1、安装软件

(1)下载软件,并上传到linux的服务器

Redis的官方下载站是http://redis.io/download

redis算nosql吗 redis是nosql数据库吗_redis_03

redis算nosql吗 redis是nosql数据库吗_操作系统_04

 

(2)解压软件:

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_05

 

redis算nosql吗 redis是nosql数据库吗_操作系统_06

(3)进入解压的目录

redis算nosql吗 redis是nosql数据库吗_操作系统_07

 

(4)无需配置,直接编译

直接执行:make

redis算nosql吗 redis是nosql数据库吗_redis_08

(5)执行安装,

注意:在安装时,指定安装目录

make PREFIX=/usr/local/redis install

redis算nosql吗 redis是nosql数据库吗_大数据_09

安装完成后,会在redis的 安装目录下面创建一个bin目录,该目录里面有5个文件。

redis算nosql吗 redis是nosql数据库吗_数据库_10

redis-benchmark命令性能测试命令

redis-check-aof和redis-check-dump是日志检测工具

redis-server是服务器端启动的命令。

redis-cli是客户端连接服务器的命令。

(6)复制配置文件

从 redis的解压目录里面把redis.conf配置文件复制到redis的安装目录下面。

redis算nosql吗 redis是nosql数据库吗_大数据_11

2、启动

(1)使用vim打开配置文件redis.conf,修改如下参数:

redis算nosql吗 redis是nosql数据库吗_操作系统_12

(2)启动redis服务

语法:命令  配置文件

redis-server(路径)   redis.conf(路径)

注意:此处命令与配置文件,可以写相对路径或绝对路径。

比如使用绝对路径写法:  /usr/local/redis/bin/redis-server  /usr/local/redis/redis.conf

redis算nosql吗 redis是nosql数据库吗_redis_13

查看是否启动成功:启动成功后,默认的端口是6379

netstat –tunpl | grep 6379

 

(3)客户端连接redis服务

语法: 连接命令   -h  主机ip  -p端口号

如果是连接到本地,则直接输入连接命令即可。

redis-cli是客户端连接服务器的命令

redis算nosql吗 redis是nosql数据库吗_大数据_14

(4)关闭redis的服务

停止Redis实例

我们可以使用/usr/local/redis/bin/redis-cli  shutdown

也可以使用pkill redis-server

killall redis-server

redis算nosql吗 redis是nosql数据库吗_数据库_15

 

四、数据类型讲解

1、字符串(string)

string是redis最基本的类型

redis的string可以包含任何数据。包括jpg图片或者序列化的对象。

单个value值最大上限是1G字节, 如果只用string类型,redis就可以被看作加上持久化特性(服务器重启之后,数据不丢失)的memcache

 

(1)set

设置键,值

语法:set  键名称  值

例如:我们添加一个name=“xiaoqian”的键值对。

注意:重新设置则直接覆盖。

redis算nosql吗 redis是nosql数据库吗_数据库_16

(2)get

获取key对应的string值,如果key不存在返回 nil,

语法:get 键值

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_17

(3)incr

对key的值做加加操作,并返回新的值,每执行一次值加1,值类型要是数据类型。

语法:incr  key

redis算nosql吗 redis是nosql数据库吗_数据库_18

(4)incrby

执行加法的命令,可以指定相加的值,

redis算nosql吗 redis是nosql数据库吗_redis_19

2、hash

hash可以用来存储对应的mysql中一行的数据,类似于关联数组。

(1)hset

设置哈希里面的field和vlaue的值。

语法:

hset  哈希的名称(键名称)  field   value

redis算nosql吗 redis是nosql数据库吗_数据库_20

(2)hget

获取哈希里面的field的值

语法:hget 哈希的名称(键名称) 指定的field

redis算nosql吗 redis是nosql数据库吗_大数据_21

注意:user:id:1  名称里面的:符号,就表示一个普通符号,没有任何含义。

(3)hmset

一次性设置多个field和value

语法: hmset  哈希的名称   field1  value1  field2  value2……

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_22

 

(4)hmget

一次性获取 多个field的value

语法:hmget  哈希的名称   field1  field2…….

redis算nosql吗 redis是nosql数据库吗_操作系统_23

(5)hgetall

获取指定哈希中所有的field和value

语法:

hgetall  哈希的名称

redis算nosql吗 redis是nosql数据库吗_大数据_24

 

3、链表(list)

list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。

这使得list既可以用作栈,也可以用作队列。

上进上出 :栈  ,特点:数据 先进后出

redis算nosql吗 redis是nosql数据库吗_redis_25

下进上出 :队列,特点:数据 先进先出

redis算nosql吗 redis是nosql数据库吗_数据库_26

(1)lpush

从链表的头部添加元素

语法: lpush  链表的名称(键的名称) 元素

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_27

(2)lrange

获取链表里面的元素

语法:

lragne 链表的名称  开始下标   结束下标

注意:如果开始下标是0结束下标是-1则是返回链表中所有的元素。

注意:链表里面的元素是序号的(从0开始数),类似于索引数组。

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_28

redis算nosql吗 redis是nosql数据库吗_redis_29

(3)rpush

从链表的尾部添加元素

语法: rpush  链表的名称(键的名称) 元素

redis算nosql吗 redis是nosql数据库吗_操作系统_30

(4)ltrim

保留指定范围的元素

语法:ltrim 链表的名称   开始下标    结束下标

redis算nosql吗 redis是nosql数据库吗_redis_31

(5)lpop

从链表的头部删除一个元素,返回删除的元素

语法:lpop  链表的名称

redis算nosql吗 redis是nosql数据库吗_操作系统_32

比如如下案例:一个网站中,想要获取最新登录的10个用户。

使用传统的方法解决,查询用户表,根据登录时间排序,截取前10位。

类似于如下sql语句

select * from  user  order by   login_time  desc  limit   10;

以上sql语句,如果用户数量庞大,则执行效率比较低,可以把登录的用户存储到redis的链表里面,

 

 

         如果通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。每次就可以从链表中直接获得需要的数据。极大节省各方面资源消耗

 

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_33

 

4、集合(set)

redis的set是string类型的无序集合。

set元素最大可以包含(2的32次方-1)(整型最大值)个元素。

关于set集合类型除了基本的添加、删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。

sina公司的好友关注关系就大量使用了set集合类型。

注意:每个集合中的各个元素不能重复。

redis算nosql吗 redis是nosql数据库吗_操作系统_34

该类型应用场合:qq好友推荐。

 

tom朋友圈(与某某是好友):mary  jack  xiaoming  wang5  wang6

linken朋友圈(与某某是好友):yuehan  daxiong  luce  wang5  wang6

(1)sadd

向集合中添加元素

语法:

sadd  集合名(键名) 元素名称

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_35

(2)smembers

获取集合中的元素

语法:

smembers 集合名

redis算nosql吗 redis是nosql数据库吗_大数据_36

 

(3)sdiff

获取集合中的差集(在集合1中存在,不在集合2中存在的元素)

语法:sdiff 集合1  集合2

redis算nosql吗 redis是nosql数据库吗_数据库_37

(4)sinter

获取交集(在两个集合中都存在的元素)

语法:sinter 集合1  集合2

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_38

 

(5)sunion

求并集(两个集合合并后,去掉重复的元素)

语法:sunion  集合1  集合2

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_39

(6)scard

获取集合中元素的个数

语法:scard 集合名称

redis算nosql吗 redis是nosql数据库吗_数据库_40

 

5、(有序集合)zset

sorted set是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。操作中的key理解为zset的名字。

 

(1)zadd

向有序集合中添加元素。如果该元素存在,则更新其顺序。

语法:zadd  集合名  序号  内容

redis算nosql吗 redis是nosql数据库吗_数据库_41

(2)zrange

(把集合排序后,返回名次[start,stop]的元素

默认是升续排列

Withscores 是把score也打印出来

)

按序号升序获取有序集合中的内容,

语法:zrange 集合名称 开始下标  结束下标

redis算nosql吗 redis是nosql数据库吗_redis_42

 

 

(3)zrevrange

按序号降序获取有序集合中的内容。

语法:zrevrange 集合名称 开始下标(索引) 结束下标(索引)

redis算nosql吗 redis是nosql数据库吗_操作系统_43

 

五、Redis常用命令

redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在linux终端使用。

1、键值相关的命令

2、服务器相关命令

(1)keys

返回当前数据库里面的键,可以使用通配符,* 表示:任意多个,?任意一个字符。

redis算nosql吗 redis是nosql数据库吗_大数据_44

(2)exists

判断一个键是否存在。

语法:exists  键名称

redis算nosql吗 redis是nosql数据库吗_redis_45

(3)del

删除指定的键

语法: del  键名称

redis算nosql吗 redis是nosql数据库吗_大数据_46

(4)expire

设置键的有效期

语法:expire  key  有效期(秒数)

redis算nosql吗 redis是nosql数据库吗_数据库_47

(5)ttl

返回一个键剩余的过期时间.

redis算nosql吗 redis是nosql数据库吗_redis_48

redis算nosql吗 redis是nosql数据库吗_操作系统_49

(6)type

返回数据类型

语法: type  key

redis算nosql吗 redis是nosql数据库吗_操作系统_50

(7)select

选择数据库,在redis里面默认有0-15号数据库,默认是0号数据库,

可以通过redis.conf配置文件进行设置。

redis算nosql吗 redis是nosql数据库吗_操作系统_51

切换数据库语法:select  数据库的编号

redis算nosql吗 redis是nosql数据库吗_redis_52

(8)dbsize

返回当前数据库里面键的个数

redis算nosql吗 redis是nosql数据库吗_操作系统_53

(9)flushdb

清空当前数据库里面所有的键,(慎重使用)

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_54

(10)flushall

清空所有数据库里面的所有的键,(慎重使用)

redis算nosql吗 redis是nosql数据库吗_操作系统_55

六、安全认证

设置客户端连接后进行任何其他操作前需要使用的密码。

方法:打开redis的配置文件(redis.conf)

(1)#requirepass   设置的密码

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_56

注意:设置的密码是明文的,因此要对redis.conf配置文件,进行严格的授权。

(2)重启redis服务,让密码生效。

关闭redis服务   pkill redis-server

 

启动   /usr/local/redis/bin/redis-server   /usr/local/redis/redis.conf

 

(3)客户端验证方式:

注意:如果没有通过验证,则无法操作:

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_57

方式一:

通过客户端登录到服务器时,添加  -a 选项。语法:redis-cli    –a 密码

redis算nosql吗 redis是nosql数据库吗_大数据_58

方式二;

登录到服务器端后,使用auth命令来完成验证。语法auth  密码。

redis算nosql吗 redis是nosql数据库吗_数据库_59

持久化机制

 

redis为了内存数据的安全考虑,会把内存中的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。

数据保存到硬盘的过程就称为“持久化”效果。

redis支持两种持久化方式:

(1)snapshotting(快照)默认方式

(2)append-only file(缩写aof)的方式

1、snapshotting快照方式持久化

该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中(备份文件名字默认是dump.rdb),如果数据非常多(10-20G)就不适合频繁进行该持久化操作。

(1)如何开启,默认开启,有自己的触发条件:

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_60

        

redis算nosql吗 redis是nosql数据库吗_操作系统_61

注意:屏蔽该触发条件,即可关闭快照方式。

(2)可以设置保存位置,和备份的文件名

备份文件名字默认是dump.rdb,我们也可以自己修改,

可以通过配置文件,来完成修改。

redis算nosql吗 redis是nosql数据库吗_redis_62

3)手动发起快照:

两种方式完成手动保存。

方式一:在登录状态:

则直接执行bgsave即可。

redis算nosql吗 redis是nosql数据库吗_redis算nosql吗_63

方式二 :在没有登录状态

./redis-cli bgsave 手动发起一次快照保存操作

redis算nosql吗 redis是nosql数据库吗_redis_64

(4)缺点:

由于快照方式是在一定间隔做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。

2、append-only-file  追加方式持久化AOF

本质:把用户执行的每个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令而已。

 

(1)如何开启

appendonly   yes         //启用 aof 持久化方式

appendfilename  appendonly.aof   //保存命令的文件(可以指定路径)

打开redis.conf配置文件,进行打开配置。

redis算nosql吗 redis是nosql数据库吗_redis_65

(2)触发条件

# appendfsync always   //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用

appendfsync everysec   //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐

# appendfsync no   //完全依赖 os,性能最好,持久化没保证

打开配置文件进行如下修改。

redis算nosql吗 redis是nosql数据库吗_操作系统_66

redis算nosql吗 redis是nosql数据库吗_redis_67

(3)aof文件的重写:

例如:可以把多个incr指令换为一个set指令

问题:

每个命令重写一次aof,如果某个key操作100次,产生100行记录,aof文件会很大,怎么解决?

比如,当执行多次incr  number操作,aof 文件中会保存多次incr number的命令。这样会增大aof文件容量,我们可以对aof文件重写,把里面重复的命令压缩成一条命令。

就比如执行10次incr number 压缩成set number 11

执行重写的命令是:

执行重写可以在登录状态下执行,直接输入bgrewriteaof,也可以在未登录状态下执行,

语法:./bin/redis-cli –a  密码   bgrewriteaof

redis算nosql吗 redis是nosql数据库吗_数据库_68

注意点:如果两种持久化方式都开启,则以aof为准。