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

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实例会额外占用很多内存。

猜你喜欢

转载自blog.csdn.net/weixin_44867717/article/details/131628762