NoSQL之Redis

1. 数据库存储的瓶颈

  • 数据量的总大小  一个机器放不下时
  • 数据的索引   一个机器的内存放不下时
  • 读写混合访问量  一个实例不能承受时

2. NoSQL的特点

  • NoSQL = Not Only SQL 非关系型数据库
  • 没有声明性查询语言、没有预定义的模式
  • 键值对存储、列存储、文档存储、图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化合不可预知的数据
  • CAP定理(强一致性、高可用性、分区容错性),但是我们要做的是三选二。CA-单点集群,满足一致性,高可用性的系统,扩展性会受限,如果RDBMS、Oracle;CP-满足一致性,分区容忍性的系统,通常性能不是很高,如果Redis、Hbase、MongoDB;AP-满足高可用性、分区容忍性的系统,通常可能对一致性要求低一些,如Riak、CouchDB,大多数网站架构;
  • 3高(高并发、高可扩和高性能)+3V(海量、多样、实时)
  • BASE解决方案(基本可用、软状态、最终一致性)。

3. NoSQL数据库的四大分类

  • KV键值对
  • 文档型数据库(如bson格式)
  • 列存储数据库
  • 图关系数据库

4. Redis简介

  • Remote Dictionary Server 远程字典服务器
  • 完全开源免费的,用C语言编写的,遵守BSD协议;
  • 是一个高性能的KV分布式内存数据库,基于内存运行;当然还支持list、set、zset、hash等数据结构的存储;
  • 支持持久化的NoSQL数据库,也就是说Redis可异步的将内存中的数据保持在磁盘中,重启后可再次加载进行使用。因此被人们称为数据结构服务器;
  • Redis还支持数据的备份,即master-slave模式的数据备份;
  • 取最新N个数据的操作,如取最新的10个评论的ID放入Redis的list中;
  • 模拟类似于HttpSession这种需要设定过期时间的功能;
  • 发布、订阅消息系统;
  • 定时器、计数器;
  • 下载地址: Redis        redis中文官方网站

5.Redis与MemCache比较

6. Redis集群切片方式

7.Redis分布式存储方案

8.Redis数据分片方案

 9. Redis缓存与数据库的协作

10. Centos7下安装Redis

cd /opt/
##下载安装包
wget https://download.redis.io/releases/redis-4.0.9.tar.gz

tar -zxvf redis-4.0.9.tar.gz

##编译
cd redis-4.0.9
make

##安装
make install

11. Redis的配置

  • Redis4是单进程的,默认端口号6379
  • 默认有16个数据库,初始默认使用0号库
  • select+库号 切换数据库                 dbsize 显示当前库的key的个数
  • 五大主要数据类型:String、Hash、List、Set、Zset(Sorted set 有序集合,在set基础上加了一个score值),Redis 命令参考 — Redis 命令参考

### Redis的redis.conf

## 启动后台进程
daemonize yes

## 设置数据库的个数
databases 16

## 端口号,默认6379
port 6379

## 连接超时时间,单位为秒,0表示不超时
timeout 0 

## tcp连接,单位为秒,0表示不进行keepalive检测
tcp-keepalive 300

## 日志级别,由小到大为debug、verbose、verbose、warning
loglevel notice

## 设置最大内存策略, lru是最近最少使用算法,  lfu是最近最不常用算法
## volatile-lru     对设置了过期时间的key使用LRU算法移除
## allkeys-lru      使用LRU算法移除任何key
## volatile-lfu     对有过期时间的key采用LFU淘汰算法
## allkeys-lfu      对全部key采用LFU淘汰算法
## volatile-random  从过期集合中移除随机key
## allkeys-random   删除一个随机的任意key
## volatile-ttl     删除最近过期的key(较小的TTL)
## noeviction       不驱逐任何东西,只是在写操作上返回一个错误
maxmemory-policy volatile-lfu

## 设置RDB保存规则,多少秒以内,多少次,三个规则从上到下匹配
save 900 1
save 300 10
save 60 10000

##  配置为yes 在后台异步保存时出错,则不会再写入RDB
stop-writes-on-bgsave-error yes

## RDB存储快照的文件名称
dbfilename dump.rdb

## 给Redis设置密码
requirepass zheshigemima

## 启动redis服务
## 注意一定要记住每次启动服务时候的目录,最好用一个,这样好找日志
## 另外启动服务时,注意指定的是哪个配置文件,有时候因为需要可能配置好几个redis.conf
cd /usr/local/bin/
redis-server /etc/redisSpace/redis.conf


## 两个查看redis服务的命令
lsof -i :6379
ps -ef | grep redis


## 客户端进入redis
redis-cli -p 6379

12. Redis的持久化

  12.1 RDB (Redis DataBase)  

  • 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照。它在恢复时是将此快照文件直接读取到内存中;
  • Redis会单独创建 (Fork) 一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束后,再用这个临时文件替换上次持久化号的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加高效。RDB的缺点是最后一次持久化的数据可能丢失,比如redis意外down掉时;另外在Fork时,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。
  • Fork的作用是复制一个与当前进程一样的进程。新进程的绝大部分数据与当前进程一致,包括变量、环境变量、程序计数器等。这个新进程会作为当前进程的子进程;
  • RDB保存的是dump.rdb文件

    12.1.1 模拟RDB恢复

    

    

    

    

    

    

    

    

  12.2 AOF (Append Only File)

  •   以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来,只许追加不许改写文件。Redis启动之初会读取该文件重构数据,换言之,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作;(持续更新中。。。)

13. Redis的键值操作命令

命令释义
keys * 显示所有的key,还可以模糊匹配,比如keys a*就是显示a开头的所以key
set append  key名   value值     为key赋值 / 在key的值后面追加
get del strlen  key名获取key的值  /  删除key  /  获取key的值的长度
incr decr  key名  加1  /  减1 
incrby decrby  key名  value值 加多少  /  减多少 
exists key名判断某个key是否存在
expire key名  时间(秒)为key设置过期时间
setex key名  时间  value值 设置一个新key并设置过期时间
setnx key名  value值 如果这个key不存在,则设置一个新key
ttl  key名 key还要多少秒失效,-1表示永不失效,-1表示已经失效
type  key名 查看key对应的value值的数据类型
lpush rpush list名  a b c d创建一个list并从左边/右边依次放入各个元素abcd
lrange list名    indexA  indexB  遍历list的所有值,从indexA开始到indexB结束,如果indexB是-1指最后
lpop rpop list名从左边/右边出栈一个元素
lindex list名   index获取index位置的元素
llen list名  获取list的元素个数
sadd  set名   a b b c d d创建一个set,并放入元素,可去重
smembers / scard  set名  遍历这个set  /  查看set的元素个数
sismember / srem    set名   value值 查看这个value值是否在set中存在   /   根据value值删除这个集合的某个元素
srandmember    set名   3 从set中随机读取几个元素
spop    set名从set中随机出栈一个元素
smove    set1名    set2名   value值 将set1中的某个值移动到set2中
sdiff / sinter / sunion    set1名    set2名求两个集合的 差集  /  交集  /   并集
hset / hsetnx    hash名    field名   value值 为hash赋值,后面只跟一个键值对  /  如果这个field不存在,则设置键值对
hget  hdel   hexists     field名    key获取这个hash的某个field的值   /   删除这个hash的某个field   / 查看这个hash是否存在某个field
hmset    hash名    field1名   v1值  field2名   v2值 创建一个hash,且后面可以跟多个键值对
hmget    hash名    field1名   field2名 获取这个hash的多个field的值
hgetall  /  hlen  / hkeys / hvals    hash名获取这个hash的  所有field和value   /   键值对个数  /  所有field  /  所有value 
hincrby  /  hincrbyfloat    hash名   field名   数字对hash里面某个field进行  整数自增    /   小数自增
zadd   zset名  score1值   field1名  score2值   field2名对zset进行添加,一个分数,一个field
zrange  / zrevrange   zset名  index1  index2对zset进行 从小到大  /  从大到小  遍历,输出范围内所有的filed,index2如果为-1,表示遍历到最后一个
zrange  / zrevrange  zset名  idx1  idx2  withscores对zset进行 从小到大  /  从大到小  遍历,输出范围内所有的filed和对应的分数,idx2如果为-1,表示遍历到最后一个
zrangebyscore   zset名  score1  score2  withscores对zset按照分数范围进行遍历,输出所有的filed和对应的分数,如果score前面加表示不包含
zrangebyscore   zset名  score1  score2对zset按照分数范围进行遍历,输出所有的filed,如果score前面加表示不包含
zrangebyscore   zset名  sc1  sc2  limit  index  count对zset按照分数范围进行遍历,输出所有的filed,如果score前面加表示不包含,limit后面跟从第几个开始取几个
zrem  /  zscore  zset名  field名 对zset的某个字段进行移除    /   返回某个字段在这个zset中的分数
zrank  /  zrevrank  zset名  field名返回某个字段在这个zset中的 从小到大  /   从大到小 的排名
zcard   zset名 获取这个zset的field个数
zcount   zset名   score1   score2统计这个zset的两个分数间的field个数,如果score前面加表示不包含
save将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘
bgsaveRedis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave命令获取最后一次成功执行快照的时间

                                                          

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

朱梦君

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

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

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

打赏作者

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

抵扣说明:

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

余额充值