Linux redis mysql 数据库 非关系型数据库

redis:

关系型数据库:  表格  表结构    sql语句     mysql   mariadb    oracle海量

非关系型数据库:不采用关系模型        键值对     

关系型数据库:二维表格  表结构  

非关系型数据库:不采用关系模型   键值对

 

1.1初识redis

Redis(Remote dictionary server)是一个开源(BSD许可),是一种基于键值对(key-value)的NoSQL数据库,是内存存储的数据结构服务器,可用作高速缓存和消息队列代理。与很多键值对数据库不同的是,redis支持字符串(string)、哈希表(hash)、列表(list)、集合(set)、有序集合(zset),位图(bitmaps),HyperLogLogs、GEO等数据结构和算法组成,因此redis可以满足很多的应用场景,而且以内redis会将所有的数据都存放在内存中,所以读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供键过期、流水线、哨兵、内置复制、Lua脚本、LRU收回、事务,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

2008年, Redis的作者Salvatore Sanfilippo在开发一个叫LLOOGG的网站时,需要实

现一个高性能的队列功能,最开始是使用MySQL来实现的,但后来发现无论怎么优化SQL语句都不能使网站的性能提高上去,再加上自己囊中羞涩,于是他决定自己做一个专属于LLOOGG的数据库,这个就是Redis的前身。后来, Salvatore Sanfilippo将Redis 1.0的源码!开放到GitHub上,可能连他自己都没想到, Redis后来如此受欢迎。

假如现在有人问Redis的作者都有谁在使用Redis,从Redis的官方公司统计来看,有很多重量级的公司都在使用Redis,如国外的Twitter, Instagram, Stack Overflow, GitHub等,国内就更

多了,如果单单从体量来统计,新浪微博可以说是全球最大的Redis使用者,除了新浪微博。还有像阿里巴巴、腾讯、百度、搜狐、优酷土豆、美团、小米、唯品会等公司都是Redis的,使用者。

1.2  Redis特性

Redis之所以受到如此多公司的青睐,必然有过人之处,那我们来说一说Redis的8个特性。

1、速度快     数据4M  纳秒级别    4M  S

正常情况下, Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒.当然这也取决于机器的性能,但这里先不讨论机器性能上的差异,只分析一下是什么造就了Redis如此之快的速度,可以大致归纳为以下三点:

(1)把数据放在内存中是Redis速度快的最主要原因。

(2)Redis是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度相对会更快。

(3)Redis使用了单线程架构,预防了多线程可能产生的竞争问题。

 2、基于键值对的数据结构服务器

几乎所有的编程语言都提供了类似字典的功能,例如Java里的map, Python里的dict,

类似于这种组织数据的方式叫作基于键值的方式,与很多键值对数据库不同的是, Redis中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能够提高开发效率。Redis的全称是REmote Dictionary Server,它主要提供了5种数据结构:字符串、哈希、列表、集合、有序集合,同时在字符串的基础之上演变出了位图( Bitmaps)和HyperLogLog两种神奇的“数据结构”,并且随着LBS ( Location Based Service,基于位置服务)的不断发展, Redis 3.2版本中加人有关GEO (地理信息定位)的,功能,总之在这些数据结构的帮助下,开发者可以开发出各种“有意思”的应用。

3、丰富的功能

除了5种数据结构, Redis还提供了许多额外的功能:

(1)提供了键过期功能,可以用来实现缓存。

(2)提供了发布订阅功能,可以用来实现消息系统。

(3)支持Lua脚本功能,可以利用Lua创造出新的Redis命令。

(4)提供了简单的事务功能,能在一定程度上保证事务特性。

(5)提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少了

网络的开销。

 4、简单稳定

Redis的简单主要表现在三个方面。首先, Redis的源码很少,早期版本的代码只有2万

行左右, 3.0版本以后由于添加了集群特性,代码增至5万行左右,相对于很多NoSQL数据库来说代码量相对要少很多,也就意味着我们完全可以“吃透”它。其次, Redis使用单线程模型,这样不仅使得Redis服务端处理模型变得简单,而且也使得客户端开发变得简单。最后, Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖libevent这样的系统类库), Redis自己实现了事件处理的相关功能。

Redis虽然很简单,但是不代表它不稳定。

5、客户端语言多

Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,并且由于Redis受到社区和各大公司的广泛认可,所以支持Redis的客户端语言也非常多,几乎涵盖了主流的编程语言,例如Java、PHP、Python、C、C++、 Nodejs等

6、持久化

通常看,将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化方式:RDB和AOF,即可以用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性。

7、主从复制

Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。

8、高可用和分布式

Redis从2.8版本正式提供了高可用实现Redis Sentinel,它能够保证Redis节点的故障发现和故障自动转移。Redis从3.0版本正式提了分布式实现Redis Cluster,它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性。

1.3 Redis使用场景

我们已经了解了Redis的很多特性,那么我们来看一下Redis的典型应用场景有哪些?

1.3.1  Redis可以做什么

1、缓存

缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速

度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够为一个网站的稳定保驾护航。

2、排行榜系统

排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。

3、计数器的应用

计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保

证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

4、社交网络

赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据, Redis提供的数据结构可以相对比较容易地实现这些功能。

5、消息列队系统

消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务肖峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够强大,但是对于一般的消息队列功能基本可以满足。

1.3.2 Redis不可以做什么

实际上和任何一门技术一样,每个技术都有自己的应用场景和边界,也就是说Redis并不是万能的,有很多适合它解决的问题,但是也有很多不合适它解决的问题。我们可以站在数据规模和数据冷热的角度来进行分析。

站在数据规模的角度看,数据可以分为大规模数据和小规模数据,我们知道Redis的数

据是存放在内存中的,虽然现在内存已经足够便宜,但是如果数据量非常大,例如每天有几亿的用户行为数据,使用Redis来存储的话,基本上是个无底洞,经济成本相当的高。

站在数据冷热的角度看,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为冷数据。例如对于视频网站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,而用户的观看记录不一定是经常需要访问的数据,这里暂且不讨论两者数据规模的差异,单纯站在数据冷热的角度上看,视频信息属于热数据,用户观看记录属于冷数据。如果将这些冷数据放在Redis中,基本上是对于内存的一种浪费,但是对于一些热数据,可以放在Redis中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。

所以, Redis并不是万能的,相信随着我们对Redis的逐步学习,能够清楚Redis真正的使用场景。

redis特点:

1.redis非关系型数据库,基于键值对存储数据,单个键值对最大可以 存储512M数据

2.redis是开源,跨平台的软件,并支持多种连接方式

3.redis运行在内存中,I/O性能好

4.可以通过RDB或者AOF两种方式实现数据的持久化

5.redis支持多种数据类型,根据这些数据类型可以开发出多种功能

6.redis支持主从复制,支持哨兵实现自动故障转移

7.redis支持集群的部署

8.redis可以部署动态数据缓存服务器

安装redis:

[root@localhost ~]# tar -zxf redis-4.0.6.tar.gz

[root@localhost ~]# mv redis-4.0.6 /usr/local/redis

[root@localhost ~]# cd /usr/local/redis/

[root@localhost redis]# make && make install

[root@localhost redis]# redis-server /usr/local/redis/redis.conf

下面有警告信息    当然在实际环境当中  警告需要解决    在平常实验中  警告可以忽略    解决警告的方法

第一个警告

[root@localhost redis]# echo 511 > /proc/sys/net/core/somaxconn    临时修改  临时更改内核连接量   如果重启主机  就会失效

永久修改

[root@localhost redis]# vim /etc/sysctl.conf

net.core.somaxconn = 1024

[root@localhost redis]# sysctl -p

net.core.somaxconn = 1024

第二个警告

[root@localhost redis]# vim /etc/sysctl.conf

vm.overcommit_memory = 1   #防止内存不足的情况下   后台save保存失败

[root@localhost redis]# sysctl -p

net.core.somaxconn = 1024

vm.overcommit_memory = 1

第三个警告

临时

[root@localhost redis]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

开启能够让redis尽可能使用最大的内存   防止redis使用内存延迟

永久

[root@localhost redis]# vim /etc/rc.local    #启动主机后执行命令的文件

echo never > /sys/kernel/mm/transparent_hugepage/enabled

[root@localhost redis]# redis-server  /usr/local/redis/redis.conf

阻塞终端是正常启动   

前台运行   

后台运行   一般都会使用后台运行

[root@localhost redis]# vim /usr/local/redis/redis.conf

  69 bind 192.168.2.10  本机ip

 136 daemonize yes  #开启后台运行

[root@localhost redis]# redis-server /usr/local/redis/redis.conf

[root@localhost redis]# netstat -anput | grep redis

tcp        0      0 192.168.2.10:6379       0.0.0.0:*               LISTEN      63416/redis-server  

redis--库--键值对

redis16个库 (0-15)

[root@localhost redis]# redis-cli -h 192.168.2.10 -p 6379

192.168.2.10:6379> select 1切换数据库

OK

192.168.2.10:6379[1]> set name aa  #创建键值对

OK

192.168.2.10:6379[1]> get name   #查看键值对

"aa"

192.168.2.10:6379[1]> mset one 1 two 2   #创建多个键值对

OK

192.168.2.10:6379[1]> dbsize   #统计键值对的个数

(integer) 3

192.168.2.10:6379[1]> keys *    #查看该库中所有的键值对

1) "two"

2) "one"

3) "name"

192.168.2.10:6379[1]> del name   #删除

(integer) 1

192.168.2.10:6379[1]> flushall   #删除所有的减值对

OK

192.168.2.10:6379[1]> keys *

(empty list or set)

redis持久化    redis数据存在内存当中   可以使用持久化的方式写入到硬盘

RDB:快照持久化  也就是对于存储的数据拍摄快照  形成快照文件存在硬盘当中,当redis重启会去读取快照文件当中的内容

启动rdb的持久化  (默认就是开启)  save  bgsave

[root@localhost redis]# vim /usr/local/redis/redis.conf

200 #   save <seconds> <changes>   #在指定时间内,数据更新数量满足条件会自动拍摄快照文件

218 save 900 1   #900s之内   发生一个数据的更新  就会拍摄快照

 219 save 300 10

 220 save 60 10000

 241 rdbcompression yes

 250 rdbchecksum yes

253 dbfilename dump.rdb  生成快照的文件名

 263 dir ./   快照文件保存在安装目录下  /usr/local/redis

创建快照的文件工具

save:通过save创建快照文件时,由redis主进程完成这个任务,redis主进程在创建快照时处于阻塞的状态,无法接收数据读写请求,当快照创建完成后,redis主进程将取消阻塞,可以实现正常数据读写

bgsave:通过bgsave创建快照时,redis的主进程会派生一个子进程来完成快照创建任务,主进程派生子进程期间处于阻塞的状态,子进程派生完成后,主进程取消阻塞的状态,可以接受读写的请求,当快照创建完成后,子进程从内存释放。

如何使用bgsave

[root@localhost redis]# vim /usr/local/redis/redis.conf

200 #   save <seconds> <changes>   #在指定时间内,数据更新数量满足条件会自动拍摄快照文件

218 save 900 1   #900s之内   发生一个数据的更新  就会拍摄快照

如果想要配置bgsave保存快照   只需要把save改成bgsave就可以

改完后要重启服务

killall   -9    redis-server

redis-server   /usr/local/redis/redis.conf

[root@localhost redis]# pwd

/usr/local/redis

[root@localhost redis]# ls    #每次在关闭redis时候   会自动拍摄快照

00-RELEASENOTES  dump.rdb

自动拍摄快照    

  1. 关闭redis数据库会自动创建快照文件      
  2. 达到配置文件中的条件会自动拍摄快照
  3. 主从集群如果从对主是全量复制(第一次复制数据)也会自动拍摄快照

手动拍摄快照    

[root@localhost redis]# redis-cli -h 192.168.2.10 -p 6379

执行save或bgsave的命令

默认拍摄快照就使用的是bgsave   如果想要使用save就直接在命令行输入save

就会拍摄新的快照

[root@localhost redis]# redis-cli -h 192.168.2.10 -p 6379

192.168.2.10:6379> save

OK

AOF append  only   file   只追加文件

按照顺序将redis数据库中执行过的增删改查的命令记录到文件当中  当redis重启时会按照顺序从头到尾执行一遍即可恢复数据

aof和rdb同时开启   会优先使用aof

启动aof持久化

[root@localhost redis]# vim /usr/local/redis/redis.conf

672 appendonly yes   #启动aof

 676 appendfilename "appendonly.aof"   会在安装目录下生成appendonly.aof的文件

701 # appendfsync always

 702 appendfsync everysec  

703 # appendfsync no

#数据写入持久化文件的频率,always表示redis每执行一条语句就向aof当中写入一条

everysec 每秒记录一次,no表示安装linux的文件系统数据同步的频率来进行记录

[root@localhost redis]# killall -9 redis-server

[root@localhost redis]# redis-server /usr/local/redis/redis.conf

[root@localhost redis]# pwd

/usr/local/redis

[root@localhost redis]# ls

00-RELEASENOTES  INSTALL          runtest-sentinel

appendonly.aof

[root@localhost ~]# killall -9 redis-server

[root@localhost ~]# redis-server /usr/local/redis/redis.conf

如果在其他目录下     当前所在的目录就是aof生成文件的目录

aof文件重写:对aof持久化的文件进行整理  控制文件的大小  请求冗余和无用的语句,避免aof文件容量过大导致redis启动时消耗时间过长

手动让aof重写文件

[root@localhost redis]# redis-cli -h 192.168.2.10 -p 6379

192.168.2.10:6379> bgrewriteaof   aof文件重新

OK

[root@localhost ~]# redis-cli -h 192.168.2.10 -p 6379

192.168.2.10:6379> bgrewriteaof

Background append only file rewriting started

自动重写  

  1. 关闭redis 自动重写
  2. 通过配置  满足配置的条件也会重写

[root@localhost ~]# vim /usr/local/redis/redis.conf

743 auto-aof-rewrite-percentage 100   #新增的数据达到之前文件数据的100%就会自动重写

 744 auto-aof-rewrite-min-size 64mb   #文件大小如果大于64M

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库从删库到跑路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值