当前位置:网站首页 > 数据科学与大数据 > 正文

NoSQL数据库(一)——redis的发展和特点 & Redis安装和配置文件redis.conf & redis命令行客户端

NoSQL数据库(一)——redis的发展和特点 & Redis安装和配置文件redis.conf & redis命令行客户端

NoSQL数据库

课程介绍

主要内容

  • Redis开发与实战(内存型)
  • Memcached入门(内存型)
  • MongoDb入门(存储型)

redis和memcached是同一类型,内存型。MongoDb是存储型。

着重讲解redis,存储性数据库还是mysql的天下。

学习目标

  • 掌握非关系性数据库的特点以及使用
  • 掌握NoSQL 技术在实际开发中的应用

NoSQL主要应用场景

专门应对高并发,需要高速读写的场景,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万次的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置。

  • 天猫双11
  • 抢红包,抢手机,抢火车票, 抢门票
  • ssr 服务端渲染

第一章 Redis

  • 特点
  • api
  • 结合nodejs应用

历史与发展

2008年,意大利的一家创业公司Merzia[ http://merzia.com]推出了一款基于MySQL的网站实时统计系统LLOOGG[ http://lloogg.com],然而没过多久该公司的创始人Salvatore Sanfilippo便开始对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望让更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。

特点

redis究竟有什么魅力,吸引了如此多的用户?

  • 存储结构特别-字典
  • 内存存储与持久化- 缓存
  • 功能丰富
  • 简单稳定- 简单可依赖
存储结构

Redis是 REmote DIctionary Server (远程字典服务器)的缩写,它以字典结构存储数据。

字典就是js中的object

在js中key只能是字符串

同大多数语言中的字典一样,Redis字典的键值除了可以是字符串,也可以是其他数据类型。

  • 字符串
  • 散列
  • 列表
  • 集合
  • 有序集合

字典: 类似 js中的object就是一种典型的字典结构。

ex:

我们在post变量中存储了一篇文章的数据 (标题, 正文, 阅读量)

post.titile = 'hello' post.content = 'balabala' post.views = 0 post.tags = ['php', 'java', 'nodejs'] 

假如需要通过tag检索出文章,关系型数据库mysql需要建3张表,而且查询非常复杂。

但是使用Redis可以对tags进行 交集,并集这样的集合运算操作。可以很轻易的实现对tags的各种查询要求。

内存存储与持久化

Redis数据库中所有的数据都存在内存中。一台普通的笔记本电脑,redis一秒可读写超过10万个键值对。

但是,数据存在内存中程序退出后会导致数据丢失。不过redis也提供了对数据持久化的支持。

在浏览器里面数据持久化可以理解为: localStorage, cookie

功能丰富

应用场景丰富,redis名副其实的多面手。

  • 缓存
  • 队列系统
  1. redis可以为每个key设置生存时间,到期会自动删除,这一功能配合出色的性能能让它作为缓存系统来使用。由于redis支持持久化和丰富的数据类型,也使其成为了Memcached的竞争者。

在这里插入图片描述

  1. 作为缓存系统,redis还可以限定数据占的最大空间,超过后自动删除不需要的key。
  2. redis的列表类型键还可以用来实现队列,并且支持阻塞式读取,可以很容易实现一个高性能的优先级队列。
  3. redis还支持"发布/订阅",可以基于此构建聊天室等系统。
简单稳定

即使功能再丰富,如果使用起来太复杂也很难吸引人。

  1. Redis直观的存储结构使得通过程序与Redis交互十分简单,在Redis中使用命令来读写数据,命令语句之于Redis就相当于SQL语言之于关系数据库。
ex:

在关系数据库中要获取posts表内id为1的记录的title字段的值可以使用如下SQL语句实现:

SELECT title FROM posts WHERE id=1 LIMIT 1 

redis这么读

HGET post:1 title 

其中HGET就是一个命令。Redis提供了一百多个命令(如图1-2所示),听起来很多,但是常用的却只有十几个,并且每个命令都很容易记忆,其实比SQL语句要简单很多。

在这里插入图片描述

  1. Redis使用C语言开发,代码量只有3万多行。这降低了用户通过修改Redis源代码来使之更适合自己项目需要的门槛。对于希望“榨干”数据库性能的开发者而言,这无疑是一个很大的吸引力。

Redis安装

  • Mac OS
brew install redis 

Brew 就是 homebrew

启动
redis-server 

默认端口6379,修改端口

redis-server --port 6389 
初始化配置文件

每次redis服务启动的时候都会读取 redis.conf

mac os的路径在/usr/local/etc/redis.conf

# Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 # 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid daemonize no # 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定 pidfile /var/run/redis.pid # 指定Redis监听端口,默认端口为6379 # 如果指定0端口,表示Redis不监听TCP连接 port 6379 # 绑定的主机地址 # 你可以绑定单一接口,如果没有绑定,所有接口都会监听到来的连接 bind 127.0.0.1 # 也就是本机 # 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能 timeout 0 # 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose # debug (很多信息, 对开发/测试比较有用) # verbose (many rarely useful info, but not a mess like the debug level) # notice (moderately verbose, what you want in production probably) # warning (only very important / critical messages are logged) loglevel verbose # 日志记录方式,默认为标准输出,如果配置为redis为守护进程方式运行,而这里又配置为标准输出,则日志将会发送给/dev/null logfile stdout # 设置数据库的数量,默认数据库为0,可以使用select <dbid>命令在连接上指定数据库id # dbid是从0到‘databases’-1的数目 databases 16  SNAPSHOTTING  # 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 # Save the DB on disk: # # save <seconds> <changes> # # Will save the DB if both the given number of seconds and the given # number of write operations against the DB occurred. # # 满足以下条件将会同步数据: # 900秒(15分钟)内有1个更改 # 300秒(5分钟)内有10个更改 # 60秒内有10000个更改 # Note: 可以把所有“save”行注释掉,这样就取消同步操作了 save 900 1 save 300 10 save 60 10000 # 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大 rdbcompression yes # 指定本地数据库文件名,默认值为dump.rdb dbfilename dump.rdb # 工作目录. # 指定本地数据库存放目录,文件名由上一个dbfilename配置项指定 #  # Also the Append Only File will be created inside this directory. #  # 注意,这里只能指定一个目录,不能指定文件名 dir ./ 
redis-cli简易使用

类似node命令,交互式命令行客户端。

redis-cli 

关闭连接

考虑到Redis有可能正在将内存中的数据同步到硬盘中,强行终止Redis进程可能会导致数据丢失。正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:

SHUTDOWN 

redis命令行客户端

redis-cli执行时会自动按照默认配置(服务器地址为127.0.0.1,端口号为6379)连接Redis,通过-h和-p参数可以自定义地址和端口号:

redis-cli -h 127.0.0.1 -p 6379 
ex:
  • ping
    PING 
  • Echo hi
    ECHO hi 
命令返回值
状态回复

PING

PONG

错误回复

随便输入一个不存在的命令

(error) ERR unknown command asdasd, with args beginning with:

整数回复

Redis Incr 命令将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

incr abc set abc 20 incr abc 
字符串回复
127.0.0.1:6379> get foo (nil) 
多行字符串回复
127.0.0.1:6379> keys * 
配置

也可以通过cli的方式去修改/usr/local/etc/redis.conf中的配置

config set loglevel warning 
多数据库
redis>SELECT 1 OK redis [1]>GET foo (nil) 

t loglevel warning

 多数据库 而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。 每个数据库对外都是以一个从0开始的递增数字命名,Redis默认支持16个数据库,可以通过配置参数databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库: ```shell redis>SELECT 1 OK redis [1]>GET foo (nil) 

然而这些以数字命名的数据库又与我们理解的数据库有所区别。首先Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外Redis也不支持为每个数据库己记录哪些数据库存储了哪些数据。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库存储B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于redis非常轻量级,一个空Redis实例占用的内存只有1MB左右,所以不用担心多个Redis实例会额外占用很多内存。

到此这篇NoSQL数据库(一)——redis的发展和特点 & Redis安装和配置文件redis.conf & redis命令行客户端的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • NoSQL数据库(二)01-Redis数据类型——字符串类型之赋值与取值、递增数字、增加指定浮点数、向尾部追加值、获取字符串长度、设置键值 & 散列类型命令之赋值与取值、获取键值、删除字段、增加数字2024-11-30 07:54:06
  • NoSQL数据库(二)02-Redis数据类型——实践-散列类型命令之散列存储逻辑、获取id、修改缩略名2024-11-30 07:54:06
  • NoSQL数据库(二)03-Redis数据类型——列表类型之介绍、命令-向列表两端增加元素、从列表两端弹出元素、获取列表中元素的个数、删除列表中指定的值2024-11-30 07:54:06
  • NoSQL数据库(二)04-Redis数据类型——集合类型之介绍、命令-增加和删除元素、获得集合中的所有元素、判断元素是否在集合中、集合间运算2024-11-30 07:54:06
  • NoSQL数据库(二)06——redis总结之发展、特点、安装、操作 & 数据类型之字符串数据类型、散列、列表、集合、有序集合2024-11-30 07:54:06
  • Node学习(九)062-管理系统之登录和注册-使用验证码——验证码插件-svg-captcha & 前端生成动态验证码图片 & 服务端验证验证码数据2024-11-30 07:54:06
  • Node学习(九)05-管理系统之英雄列表分页——分页的sql查询语句 & 服务端get接口写法、ajax请求数据之get请求写法 & Math.ceil()函数-返回大于或等于一个给定数字的最小整数2024-11-30 07:54:06
  • Node学习(九)04-管理系统之删除英雄——ajax请求数据之get请求写法完成删除、remove()移除DOM元素 & 服务端之完成删除的接口-sql中的delete语句2024-11-30 07:54:06
  • Node学习(九)032-管理系统之修改英雄——ajax请求数据之post请求写法-$.ajax() 方法 & 图片预览之URL.createObjectURL(文件对象) & 服务端post接口写法2024-11-30 07:54:06
  • Node学习(九)031-管理系统之修改英雄——服务端get接口写法之req.query可以获取到url上所有的参数 & ajax请求数据之get请求写法2024-11-30 07:54:06
  • 全屏图片