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名副其实的多面手。
- 缓存
- 队列系统
- redis可以为每个key设置生存时间,到期会自动删除,这一功能配合出色的性能能让它作为缓存系统来使用。由于redis支持持久化和丰富的数据类型,也使其成为了Memcached的竞争者。
- 作为缓存系统,redis还可以限定数据占的最大空间,超过后自动删除不需要的key。
- redis的列表类型键还可以用来实现队列,并且支持阻塞式读取,可以很容易实现一个高性能的优先级队列。
- redis还支持"发布/订阅",可以基于此构建聊天室等系统。
简单稳定
即使功能再丰富,如果使用起来太复杂也很难吸引人。
- 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语句要简单很多。
- 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命令行客户端的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/10812.html