Redis学习笔记

NoSQL的概述

什么是NoSQL

         NoSQL = Not Only SQL,非关系型数据库

为什么需要NoSQL

        High performance - 高并发读写

        Huge Storage - 海量数据的高效率存储和访问

        High Scalability && High Avaliability - 高可扩展性和高可用性

NoSQL数据库的四大分类

        键值(Key-Value)存储

        列存储

        文档数据库

        图形数据库

四类NoSQL数据库比较

分类

相关产品

典型应用

数据模型

优点

缺点

键值(Key-Value)

Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

内容缓存,主要用于处理大数据的高访问负载

一系列键值对

快速查询

存储的数据缺少结构化

列存储数据库

Cassandra、HBase、Riak

分布式的文件系统

以列簇式存储,将同一列数据存在一起

查找速度快,可扩展性强,更容易进行分布式扩展

功能相对局限

文档性数据库

CouchDB,MongoDb

Web应用(与key-value类似,Value是结构化的)

一系列键值对

数据结构要求不严格

查询性能不高,而且缺乏统一的查询语法。

图形(Graph)数据库

Neo4J,InfoGrid,Infinite Graph

社交网络,推荐系统等。专注于构建关系图谱

图结构

利用图结构相关算法

需要对整个图做计算才能得出结果,不容易做分布式的集群方案

NoSQL的特点

        1、 易扩展

        2、灵活的数据模型

        3、大数据量,高性能

        4、高可用

 

Redis的概述

高性能键值对数据库,支持的键值数据类型:

1、字符串类型      2、散列类型               3、列表类型

4、集合类型          5、有序集合类型

 

Redis的应用场景

1、缓存(最主要应用场景)    2、任务队列       3、网站访问统计    4、数据过期处理

5、应用排行榜                              6、分布式集群结构中session分离

 

Redis的安装和使用

搭建环境

1、虚拟机   VMWARE

2、Linux系统:Centos

3、SSH客户端:SecureCRT 7.3,SecureFX 7.3

 

Redis的安装

redis是C语言开发,安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境。如果没有gcc环境,需要安装gcc;

yum install gcc-c++

Redis学习笔记

tar -zxvf redis-4.0.9.tar.gz

Redis学习笔记

进入redis目录,执行make

Redis学习笔记

安装   make PREFIX=/usr/local/redis install

Redis学习笔记

 

Redis学习笔记

redis-benchmark                  性能测试的工具

redis-check-aof                     aof修复工具

redis-check-dump                 rdb文件检查的工具

redis-cli                                   命令行的客户端

redis-server                            redis启动服务的命令

Redis学习笔记

前端启动模式,但这样就不能操作其他命令

Redis学习笔记

修改配置文件  redis.conf

Redis学习笔记

启动redis-server

./bin/redis-server ./redis.conf

Redis学习笔记

 

Redis学习笔记

关闭redis

./bin/redis-cli shutdown

Redis学习笔记

重新启动redis服务,启动客户端

Redis学习笔记

 

Redis学习笔记

 

 

Jedis的入门

Jedis介绍

1、Jedi是Redi官方首选的Java客户端开发包

2、https://github.com/xetorthio/jedis

 

可下载jar的地址

http://mvnrepository.com/artifact/redis.clients/jedis

http://mvnrepository.com/artifact/org.apache.commons/commons-pool2

 

* 提示time out错误 需要再iptables防火墙上添加上6379端口 并重启防火墙服务

* 提示connection refuse错误 需要注释掉redis.conf 文件中的 bind 127.0.0.1

* 提示JedisDataException错误 需要将redis.conf文件中的protect-mode 置为no

Redis学习笔记

 

 

/**

*Jedis的测试

*CreatedbyAdministratoron2018/6/6/006.

*/

publicclassJedisDemo1{

 

@Test

/**

*单实例的测试

*/

publicvoiddemo1(){

//1、设置IP地址

Jedisjedis=newJedis("192.168.79.128",6379);

//2、保存数据

jedis.set("name","caijx");

//3、获取数据

Stringvalue=jedis.get("name");

System.out.println(value);

//4、释放资源

jedis.close();

}

 

@Test

/**

*使用连接池的方式

*/

publicvoiddemo2(){

//获得连接池的配置对象:

JedisPoolConfigconfig=newJedisPoolConfig();

//设置最大的连接数

config.setMaxTotal(30);

//设置最大的空闲连接数

config.setMaxIdle(10);

 

//获得连接池

JedisPooljedisPool=newJedisPool(config,"192.168.79.128",6379);

 

//获得核心对象

Jedisjedis=null;

try{

//通过连接池来获得连接

jedis=jedisPool.getResource();

//设置数据

jedis.set("name","caijx");

//获取数据

Stringvalue=jedis.get("name");

System.out.println(value);

}catch(Exceptione){

e.printStackTrace();

}finally{

//释放资源

if(jedis!=null){

jedis.close();

}

if(jedisPool!=null){

jedisPool.close();

}

}

}

 

}

 

Redis的数据类型

五种数据类型

1、字符串(String)      2、字符串列表(list)     3、有序字符串集合(sorted set)

4、哈希(hash)             5、字符串集合(set)

Key定义的注意点

1、不要过长                      2、不要太短                     3、统一的命名规范

 

Redis的数据结构——字符串

存储String

1、二进制安全的,存入和获取的数据相同

2、Value最多可以容纳的数据长度是512M

存储String常用命令

1、赋值                2、删除            3、取值                       4、数值增减         5、扩展命令

 

1、set key value

设置key的value值

2、get key

获取key的value值

3、getset key value

先获取key的value值,再重新赋值

4、del key

删除key键

5、incr key

为key的value值+1,若key不存在,则把value赋值为0后+1;若value数据类型不为integer,则报错。

6、decr key

为key的value值-1,若key不存在,则把value赋值为0后-1;若value数据类型不为integer,则报错。

7、incrby key integer

为key的value值+integer,若key不存在,则把value赋值为0后+integer;若value数据类型不为integer,则报错。

8、decrby key integer

为key的value值-integer,若key不存在,则把value赋值为0后-integer;若value数据类型不为integer,则报错。

9、append key val

为key的原来的value值后拼接 字符串val。

10、keys *

获取所有的keys列表

Redis学习笔记

 

Redis学习笔记

 

Redis的数据结构——哈希

存储Hash

1、String Key和String Value的map容器

2、每一个Hash可以存储4294967295个键值对

存储Hash常用命令

1、赋值    2、删除   3、取值   4、增加数字     5、自学命令

存储k/v : hset key k v

取k对应的v: hget key k

删除键k:hdel key k

对k加上一个增量(可以为负): hincrby key k delta

对k加上一个浮点数(可以为负): hincrbyfloat key k delta

存储多个k/v对: hmset key k1 v1 k2 v2 ... kn vn

取多个k对应的值: hmset key k1 k2 ... kn

取所有的k/v对: hgetall

取所有的键的值:hvals key

取键值对的个数:hlen key

取所有键名:hkeys key

判断是否存在k:hexists key k

 

Redis学习笔记

 

Redis学习笔记

 

Redis的数据结构——List

存储list:

        1、ArrayList使用数组方式

        2、LinkedList使用双向链接方式

        3、双向链表中增加数据

        4、双向链表中删除数据

存储list常用命令:

        1、两端添加      2、查看列表      3、两端弹出         4、获取列表元素个数     5、扩展命令

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

TIP:消息队列

rpoplpush使用场景

Redis学习笔记

lpush key str1,str2……strn 从左侧添加数据 若key不存在 为其创建一个list

rpush key str1,str2……strn 从右侧添加数据 若key不存在 为其创建一个list

lrange key start,end 查看指定角标之间的元素 角标可为负数,-1为最后一个元素,以此类推

lpop key 弹出左侧第一个元素 

rpop key 弹出右侧第一个元素

llen key 获取列表中元素个数

lpushx key val 向列表头部插入val 仅当key存在时可用 返回值为lit的长度

lrem key count val 删除列表中count个值为val的元素 count>0从头向尾遍历 count<0 从尾向前 若 count =0 删除所有值为val的元素

lset key index val 将列表中角标为index的元素的值设为val

linsert key before val str 在指定元素val前插入数据str

linsert key after val str 在指定元素val后插入数据str

rpoplpush key1 key2 将列表1中的右侧第一个元素弹出从左侧加入到列表2中

 

Redis的数据结构——set

存储Set

        1、和List类型不同的是,Set集合中不允许出现重复的元素

        2、Set可包含的最大元素数量是4294967295

 

存储set常用命令

      1、添加/删除元素                2、获得集合中的元素

      3、集合中的差集运算         4、集合中的交集运算

      5、集合中的并集运算         6、扩展命令

 

Redis学习笔记

 

Redis学习笔记

 

存储Set使用场景

           1、跟踪一些唯一性数据

           2、用于维护数据对象之间的关联关系

 

跟踪一些具有唯一性的数据,访问某一博客的唯一ip地址的信息,每次访问该博客的信息存入redis中,set数据类型就会自动保证这些ip地址的唯一性,还可以充分利用set类型的服务器端聚合操作的方便高效的一些特性呢可以用于维护数据对象之间的一些关联关系,比如我们所有购买某一个电子设备的客户的id被存储到一个指定的set当中,而购买另外一种电子产品客户的id呢存储在另一个set当中,如果此时我们想获取有哪些客户同事购买了这两种商品,我们就可以使用他俩的交集。

 

Redis的数据结构——sorted-set

存储Sorted-Set

        1、Sorted-Set和Set的区别

        2、Sorted-Set中的成员在集合中的位置是有序的

应用场景:游戏的排名上,微博的热点话题等

 

存储Sorted-set常用命令

1、添加元素       2、获得元素     3、删除元素     4、范围查询        5、扩展命令

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

 

Sorted-Set使用场景

       1、如大型在线游戏积分排行榜

       2、构建索引数据

 

keys的通用操作

Redis学习笔记

 

Redis学习笔记

 

Redis的特性

       1、多数据库

       2、Redis事务

一个redis实例最多可以提供16个数据库,下标分别从0-15,客户端默认连接的是第0号数据库

选择数据库  select  序号

Redis学习笔记

移动myset到1号数据库

Redis学习笔记

进行事务处理的三个命令  multi   exec   discard

Redis学习笔记

 

Redis的持久化

所有的数据都存在内存中,从内存当中同步到硬盘上,这个过程叫做持久化过程。

持久化操作,两种方式:rdb方式、aof方式,可以单独使用或者结合使用。

使用方法:

1、rdb持久化方法:在指定的时间间隔写入硬盘

2、aof方式:将以日志,记录每一个操作,服务器启动后就构建数据库。

3、配置可以禁用 持久化功能。

4、也可以同时使用两种方式。

 

Redis的持久化的RDB的方式

优势:

1、一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

2、对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

3、 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

4、相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

劣势

1、 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

2、由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

配置:

Redis学习笔记

save 900 1              #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 10            #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

每900秒至少有一个key发生变化,会持久化一次。

每300秒至少有10个key发生变化,会持久化一次。

每60秒至少有10000个key发生变化,会持久化一次。

Redis学习笔记

rdb保存的文件名和路径

 

Redis的持久化的AOF的方式

优势:

1、 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。

2、由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

3、如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

4、AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

劣势:

1、对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

2、根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。

配置:

在Redis的配置文件中存在三种同步方式,它们分别是:

Redis学习笔记

appendfsync always     #每次有数据修改发生时都会写入AOF文件。

appendfsync everysec  #每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync no          #从不同步。高效但是数据不会被持久化。

Redis学习笔记

需要打开aof则将no修改为yes

 

Redis学习笔记

 

Redis学习笔记

 

Redis学习笔记

关闭redis

Redis学习笔记

打开appendonly.aof文件,删除最后一行flashall

Redis学习笔记

启动redis,看到数据又被还原了

Redis学习笔记