之前一直有听说
Redis
,但是一直没有使用和学习过,而项目上关于缓存数据库的知识用到的只有一点Memcached
的客户端使用,没有深入学习缓存数据库的原理。因此,作为一个小白,有必要写一篇比较基础的入门笔记,方便自己“温故而知新”。
所以呢……就有此文啦,也欢迎各位朋友多多指点!
NoSQL
What
什么是NoSQL?
其实对NoSQL,即便是我这样没有接触过的小白也是耳濡目染了。NoSQL的全称是Not Only SQL,指的是一类非关系型的数据库。
与关系型数据库相对,结构简单,数据之间不存在关联关系是其特点。
它拥有简单的结构,不需要维护数据之间复杂的关联关系,单从这两点看,就可以看出它的性能上是有很大提升的。
Why
为什么需要使用Nosql?
正所谓“存在即合理”。虽然大家都在用,但也不能盲从,必须要了解其原因。
我想,既然已经存在Oracle、MySQL等关系型数据库了,为什么不能使用已有的数据库来做呢?想来是有什么场景是它们做不到的,所以才会出现NoSQL。
下面来看一下关系型数据库的瓶颈:
-
无法应对每秒上万次的读写请求,无法处理大量集中的高并发操作。关系型数据是IO密集的应用,系统性能的瓶颈往往会出现在硬盘IO上。
-
表中存储记录有限,横向可扩展能力有限,一张表最多200多列。纵向数据可承受能力也是有限的,一张表数据达到百万级,读写速度就会下降。在大数据的场景下,必须使用主从复制、分库分表等方法来解决问题。但与此同时,这些解决方法也会给维护增加难度。
-
无法简单地通过增加硬件、服务节点来提高系统性能。数据整体存储在一个数据库内,多个服务器之间没有很好的办法来完成数据的复制。
-
关系型数据库大多是收费的(我想这里主要指的是Oracle),对硬件要求高。软硬件成本较高。
NoSQL的优劣势
优势:
-
大数据量,高性能(数据的无关性大大提高了缓存性能)
-
灵活的数据模型(数据结构的可变性能够很好的适应快速迭代的需求)
-
高可用(在不太影响性能的情况下,就可以方便的实现高可用架构)
-
低成本(这是大多数分布式数据库的特点,开源软件的优势)
劣势:
-
数据无关性(没有关联关系会造成一定程度上的数据冗余,也就是常说的“空间换时间”)
-
不支持标准SQL,没有公认的NoSQL标准
-
没有关系型数据库的约束,大多数也没有索引的概念
-
没有事务,不能依靠事务实现
ACID
ACID是数据库事务正确执行的四个基本要素的缩写,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有ACID特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
-
没有丰富的数据类型(数值、日期、字符、二进制、大文本等)
Redis简介
Redis 是当今非常流行的基于KV结构的作为Cache使用的NoSQL数据库。
Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的 Key-Value 数据库。Key 字符类型,Value 可以是字符串(String),哈希(Map),列表(list),集合(sets) 和 有序集合(sorted sets)等类型,每种数据类型有自己的专属命令。所以它通常被成为数据结构服务器。
Redis之父:Salvatore Sanfilippo
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" contenteditable="true" cid="n56" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">来自意大利的西西里岛,现居卡塔尼亚。供职于 Pivotal公司(Pirvotal是Spring框架的开发团队)。</pre>
客户端:支持多种语言,Java客户端包括aredis、JDBC-Redis、Jedipus、Jedis、JRedis等,其中Jedis中的方法名和redis的命令是一致的,使用更加方便。
Redis安装和使用
Windows上安装Redis
Windows版本的Redis是Microsoft的开原部门提供的Redis。这个版本的Redis适合开发人员学习使用,生产环境下使用Linux系统的Redis。
下载
启动
-
启动
redis-server.exe
-
若启动窗口一闪而过,使用
CMD
命令窗口,在当前目录下执行redis-server.exe redis.conf
在Linux环境下,redis配置文件名默认为
redis.conf
-
-
启动
redis-client.exe
- 客户端启动,默认链接本机的
redis
,默认端口号6379
。
- 客户端启动,默认链接本机的
-
测试
-
输入
set k1 v1
,回车后显示OK
-
输入
get k1
,回车后显示"v1"
-
Linux上安装Redis
下载与解压
下载
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
使用tar命令解压
tar -zxvf redis-3.2.9.tar.gz -C /usr/local
tar命令:
- 压缩命令:
tar -zcvf
压缩文件名.tar.gz
被压缩文件名
- 解压缩命令:
tar -zxvf
压缩文件名.tar.gz
在redis目录下有两个重要的配置文件:
redis.conf
: reids
配置文件
sentinel.conf
:哨兵配置文件
编译Redis文件
Redis
是使用 C 语言编写的,所以还需要使用 gcc
编译器对 .c 源文件进行编译。
gcc
是GNU compiler collection
的缩写,是Linux下一个编译器集合(相当于javac),是 c 或 c++ 程序的编译器。
在 redis
目录下执行make命令
make命令可能会出现的报错:
gcc
命令找不到,是由于没有安装gcc
导致* 安装 `gcc` 编译器解决 * `yum -y install gcc`
error:jemalloc/jemalloc.h:No such file or directory
* 解决方式: `make MALLOC=libc`
编译完成后,src
下会生成一些文件
redis-server
: redis
服务端程序
redis-cli
: redis
客户端程序
启动
-
前台启动
./redis-server
-
后台启动
./redis-server &
(在末尾加一个地址符“&”,感觉类似nuhup命令)
关闭
-
使用
redis
客户端关闭-
切换到
src
目录,执行./redis-cli shutdown
命令- 推荐,
redis
会先执行完数据操作,再关闭。
- 推荐,
-
-
使用
kill
命令杀掉进程- 简单粗暴,但有可能丢失数据。
Redis
客户端
命令行客户端
命令行客户端 redis-cli
( Redis Commend Line Interface
)是 Redis
自带的基于命令行的客户端,用于服务端交互。
连接方式
-
直接连接本地
- 在
redis
的src
目录下,执行./redis-cli
- 在
-
指定
IP
和端口连接-
./redis-cli -h IP地址 -p 端口号
- 例如:
./redis-cli -h 127.0.0.1 -p 6379
- 例如:
-
远程客户端
Redis Desktop Manager
: C++ 编写,响应迅速,性能好。
官网地址:https://redisdesktop.com/
github
:https://github.com/uglide/RedisDesktopManager
使用文档:http://docs.redisdesktop.com/latest/
远程访问
redis
需要注意两点
- 关闭防火墙
* `systemctl status firewalld`
redis
自身的安全机制默认是不允许外界访问的* 修改 `redis.conf` 配置文件 * `bind ip` 绑定 `ip` ,将此行注释掉 * `protected-mode yes` 保护模式改为 `no` * 修改完成后,启动 `redis` 时,指定配置文件路径 * 例如: `./redis-server ../redis.conf`
编程客户端
编程客户端有很多种,这里只介绍最受欢迎的一种客户端 Jedis
。
Jedis
redis
的 Java 编程客户端,Redis
官方首选推荐使用 Jedis
,jedis
是一个很小但很健全的 redis
的 Java 客户端。因为 jedis
中的方法名和 Redis
的命令是保持一致的,所以完全不用担心会有额外的学习成本,简直太爽了!因此,通过 Jedis
可以像使用 Redis
命令行一样使用 Redis
。
jedis
完全兼容redis
2.8.x and 3.x.x
Jedis
源码:https://github.com/xetorthio/jedis
笔记小结
通过这篇文章,应该可以对 Redis
的概念、优劣势、诞生的原因有一定的了解了。此外,还get到了 Redis
在Windows和Linux环境下的安装与使用,掌握了 Redis
三种客户端的使用方式。
下一节,我会对 Redis
的命令使用做一下整理。希望我们都能保持空杯心态,继续加油!
网友评论