Redis
第一章 NoSQL概述
什么是NoSQL
NOSQL = Not Only SQL
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
虽然NoSQL的流行与火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动。尽管早期的堆栈代码只能算是一种实验,然而现在的系统已经更加的成熟、稳定。不过现在也面临着一个严酷的事实:技术越来越成熟——以至于原来很好的NoSQL数据存储不得不进行重写,也有少数人认为这就是所谓的2.0版本。该工具可以为大数据建立快速、可扩展的存储库。NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
为什么需要NoSQL
- High perforemance - 高并发读写
- Huge Store - 海量数据的高效率和访问
- High Scalability && High Availability - 高可拓展和高可用
- NoSQL数据库在以下的这几种情况下比较适用:
1、数据模型比较简单;
2、需要灵活性更强的IT系统;
3、对数据库性能要求较高;
4、不需要高度的数据一致性;
5、对于给定key,比较容易映射复杂值的环境。
NoSQL数据库的四大分类
键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.列存储数据库。
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.
因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。
四类NoSQL数据库比较
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
NoSQL的特点
- 易拓展
- 大数据量,高性能
- 灵活的数据模型
- 高可用
第二章 Redis概述
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis由c语言开发的一个高性能的,开源的,键值对的数据库,它通过提供多种键值类型来使用不同场景下的存储需求,目前Redis支持的键值类型有许多种。
* 字符创类型
* 散列类型
* 列表类型
* 集合类型
* 有序集合类型
Redis的应用场景
- 缓存
- 任务队列
- 应用排行榜
- 网站访问统计
- 数据过期处理
- 分布式集群架构中的session分离
第三章 Redis的安装
redis建议安装在linux服务器上运行测试,本教程使用linux虚拟机及ssh客户端进行功能测试。
3.1 搭建环境
- 虚拟机: VMware
- Linux系统: CentOS-6.5
- SSH客户端:SecureCRT 7.3
3.2 安装环境
redis是c语言开发,安装redis需要先将官网下载的源代码进行编译,编译依赖gcc环境。如果没有gcc环境,需要安装gcc:
yum install gcc-c++
如果提示是否下载,输入y。
安装完成。
3.3 Redis 安装
1). 下载安装包
* 将Windows下下载的压缩包文件上传到linux下。通过secureCRT进行上传。
* 使用wget命令下载安装包
2). 解压安装包
tar -zxvf redis-2.8.17.tar.gz
3). 编译redis(编译,将.c文件编译成.o 文件)
进入解压文件夹
cd redis-2.8.17.tar.gz
执行 make
make
如果没有安装gcc,编译将会出现错误提示。(如果安装失败,必须删除文件夹,重新解压)
4). 安装, 路径为 /usr/local/redis
make PREFIX=/usr/local/redis install
安装完成后,在/usr/local/redis/bin 下有几个可执行文件
redis-benchmark 性能测试工具
redis-check-aof AOF文件修复工具
redis-check-dump RDB文件检查工具(快照持久化文件)
redis-cli 命令行客户端
redis-server redis服务器启动命令
5). copy文件
redis 启动需要一个配置文件,可以修改端口号等信息。
在解压完的目录内执行以下命令:
cp redis.conf /usr/local/redis
6). 设置后台启动配置文件
修改新复制的配置文件
vim redis.conf
7). 启动Redis服务
./bin/redis-server ./redis.conf
8). 进入到客户端
./bin/redis-cli
尝试命令:
root@docker:/usr/local/redis/bin# ./redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name liuzq
OK
127.0.0.1:6379> get name
"liuzq"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
第四章 Jedis入门
Jedis介绍
- Jedis是Reids官方首选的Java客户端
- https:// github.com/xetorthio/jedis
使用的jar包版本:
commons-pool2-2.3.jar
jedis-2.7.0.jar
编码:
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
/**
* 单实例的测试
*/
@Test
public void test1() {
// 1. 设置IP地址和端口
Jedis jedis = new Jedis("192.168.25.158", 6379);
// 2. 保存数据
jedis.set("name", "imooc");
// 3. 获取数据
String value = jedis.get("name");
System.out.println(value);
// 4. 释放资源
jedis.close();
}
/**
* 连接池方式连接
*/
@Test
public void test2() {
// 1.获得连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 2.1 设置最大连接数
config.setMaxTotal(30);
// 2.2 设置最大空闲连接数
config.setMaxIdle(10);
// 3. 获取连接池
JedisPool jedisPool = new JedisPool(config, "192.168.25.158", 6379);
// 4. 获取核心对象
Jedis jedis = null;
try {
// 通过连接池获得连接
jedis = jedisPool.getResource();
// 设置数据
jedis.set("name","張三");
// 获取数据
String value = jedis.get("name");
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (jedis != null){
jedis.close();
}
if (jedisPool != null){
jedisPool.close();
}
}
}
}
第五章 Redis数据结构
五种数据类型:
- 字符串(String)
- 哈希(hash)
- 字符串列表(list)
- 字符串集合(set)
- 有序字符串集合(sorted set)
Key定义的注意点:
- 不要过短
- 统一的命名规范
存储String:
- 二进制安全的,存入和获取的数据相同
Value最多可以容纳的数据长度是512M
存储String常用命令:
赋值
- 取值
- 删除
- 数据增减
- 拓展命令
存储Hash:
- String Key和String Value的map容器
- 每一个Hash可以存储4294967295个键值对
存储Hash常用命令:
- 赋值
- 取值
- 删除
- 增加数字
- 自学命令
存储list:
- ArrayList使用数组方式
- LinkedList使用双向链接方式
- 双向链表中增加数据
- 双向链表中删除数据
存储list常用命令:
- 两端添加
- 两端弹出
- 查看列表
- 获取列表元素个数
- 拓展命令
存储Set:
- 和list类型不同的是,Set集合中不允许出现重复的元素
- Set可包含的最大元素数量是4294967295
存储set常用命令:
- 添加、删除元素
- 获得结合中的元素
- 集合中的差集运算
- 集合中的交集运算
- 集合中的并集运算
- 拓展命令
存储set使用场景:
- 跟踪一些唯一性数据
- 用于维护数据对象之间的关联关系
存储Sorted-Set常用命令:
- 添加元素
- 获取元素
- 删除元素
- 范围查询
- 拓展命令
存储Sorted-set
- Sorted-set和Set的区别
- Sorted-Set中的成员在集合中是有序的
应用场景
- 游戏的积分排行榜
大型游戏的排行榜,当玩家的积分发生变化的时候可以执行zadd命令,然后去更新玩家的数据。然后再通过zrange命令获取积分,多少积分的用户的信息,热可以通过range相关的命令,通过用户名开获得玩家的排行信息。 - 微博的热点话题
- 构建索引数据
第六章 Keys的通用操作
第七章 Redis特性
- 多数据库
- Redis事务
第八章 Redis持久化
两种方式持久化
- RDB方式
- AOP方式
持久化使用方式
- RDB持久化
在指定的时间间隔内将数据写入到磁盘上。
rgb每隔多长时间会将数据持久化到硬盘,优点是无需配置,但是有可能会出现数据丢失的问题,在持久化时间没到的时候丢失的数据无法找回。 - AOF持久化
以日志形式将操作redis的操作命令增删改查操作到日志中进而保存到硬盘上。默认是关闭状态,需要开启。保证再次启动时候数据的完整性。
AOF可以设置每当数据库有修改操作的时候就会向日志文件中记录一下,或者每秒钟记录一次,这样的话就算redis重启后还可以通过日志找回原来的数据。 - 无持久化
将redis持久化关闭,关闭后可以将redis看成一个缓存,用作缓存。 - 同时使用RDB和AOF
RDB
优点:
(1)可将数据库保存为一个文件,便于备份
(2)可方便移植
(3)性能最大化,可开启小的进程处理持久化操作
性能最大化,可以开启小的进程处理持久化操作、可以将数据保存为一个文件,便于备份、方便可移植性
缺点:
(1)不能保证数据完整性
(2)当数据过大,进程处理将会延迟几百到一千毫秒
可能会出现数据丢失的问题,在持久化时间没到的时候丢失的数据无法找回、当数据过大,进程处理将会延迟几百秒到一千毫秒
* 配置过程:*
(1)编辑redis.conf文件:vim redis.conf
(2)找到时间戳,可配置秒、分、时与之存储量
(3)rdb文件默认保存在redis安装目录
AOF
优点:
1. aof默认是不开启的
2. 同步写入频率高,效率低,方式最安全.
3. 写入模式采用append模式,追加模式, 不破坏写入日志数据,在redis中追加也不会破坏文件.如果在写入一半时候就出现崩溃问题,redis下次启动之前通过 redis-check-aof这个工具来帮助数据一致性问题
4. 当数据过大,可启动修改重写机制,redis采用append的这种机制,将新的修改的数据不短的写到老的磁盘文件当中,同时创建新的文件保存操作,保证修改数据的更新
5. 日志文件格式清晰,便于重建数据
缺点:
- 对于相同数据集aof文件比rdb文件大一些
- 根据同步策略不同,效率比rbd低.
配置过程:
1. 编辑redis.conf:vim redis.conf
2. 找到appendonly 未开启为no 需要改成yes(因为默认使用rdb方式所以)
- Redis的目录下会产生appendonly.aof这个文件,用来保存appendonly的之前的增删改操作,
- appendfsync always 没修改一次就同步到磁盘上
- appendfsync everysec 每秒会向硬盘中同步一次
- appendfsync no 不同步到硬盘中
- 停掉redis ./bin/redis-cli shutdown
- 重启redis ./bin/redis-servers ./redis.conf
- flushall 清空数据库 , 做缓存使用
- 进入appendonly.aof删除flushall可以恢复数据库