绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
NOSQL相关入门知识,你过关了吗
2020-06-23 16:12:50
  • 什么是noSQL
  • not only sql
  • 非关系型数据库
  • 为什么需要NoSQL
  • web2.0大规模动态网站的兴起
  • high performance ,高并发读写,动态页面展示与交互,比如微博点赞评论等操作,实时统计在线人数排行榜等
  • huge storage,海量数据的高效存储和访问,大型网站的用户登录系统
  • high scalability && high availability,高可扩展性和高可用性
  • 主流NOSQL产品
  • redis,mongodb,couchdb
  • NoSQL的特点
  • 易扩展
  • 灵活数据模型
  • 大数据量,高性能
  • 高可用
  • NoSQL数据库的四大分类
  • 键值存储,redis
  • 优势,快速查询
  • 劣势,存储数据缺少结构化
  • 列存储,hbase
  • 优势,快速查询
  • 劣势,功能局限
  • 文档数据库,mongodb
  • 优势,数据结构要求不严格
  • 劣势,查询性能并非特别高,缺少统一查询的语法
  • 图形数据库,infogate
  • 优势,社交网络,利用图结构的相关算法
  • 劣势,需要对整个图做算法分析,不利于分布式方案




回到顶部(go to top)

2 redis概述

C语言编写的高性能键值对数据,支持的键值数据类型:

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

Redis的应用场景:

  • 缓存
  • 网站访问统计
  • 任务队列
  • 数据过期处理
  • 应用排行榜
  • 分布式集群架构中的session分离

回到顶部(go to top)

3 redis安装和使用

3.1 redis安装

  • 依赖环境
  • gcc-c++
1 环境准备

#官网下载 redis 3.2.5版本wget download.redis.io/relea #安装 C 编译环境 yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc gcc-c++2安装 解压安装包后,进入文件目录编译,编译结束时,会提示 Hint: It's a good idea to run 'make test' ,建议在安装前先测试预安装下,make test预安装后,遇到错误:You need tcl 8.5 or newer in order to run the Redis test ,缺失安装包tcl,所以需要先安装这个 安装包后再次运行 make test,正常后再进行redis安装。 详细步骤如下: #解压二进制包tar -zvxf /opt/redis-3.2.5 #进入到文件目录cd redis-3.2.5 #编译make #测试安装(稍微耗费点时间)make test #可能会提醒需要安装新版的tcl#yum install tcl #指定路径安装make PREFIX=/usr/local/redis install

安装结束后,进入到安装路径中,

[root@bogon bin]# ls -lh /usr/local/redis/bin/

total 22M

-rwxr-xr-x. 1 root root 2.4M Aug 13 18:40 redis-benchmark

-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-check-aof

-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-check-rdb

-rwxr-xr-x. 1 root root 2.5M Aug 13 18:40 redis-cli

lrwxrwxrwx. 1 root root 12 Aug 13 18:40 redis-sentinel -> redis-server

-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-server

这几个指令用途分别是:

  • redis-benchmark
  • 性能测试工具
  • redis-check-aof
  • aof文件修复工具
  • redis-check-rdb
  • rdb文件检查工具
  • redis-cli
  • redis客户端
  • redis-server
  • redis服务器启动命令
  • redis-sentinel

3.2 配置文件修改

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

3.3 服务启动与关闭

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

回到顶部(go to top)

4 redis-py的入门

redis有支持非常多种语言编写的客户端,可以从官网查看 redis.io/clients ,redis-py是redis官方网站的python客户端开发包,本人只会点点python,所以从这个入门。

redis-py的github地址:github.com/andymccurdy/

回到顶部(go to top)

5 redis数据类型

键值对种key的注意事项:

  • 不要过长
  • 好不要超过1024个字节
  • 不仅消耗内存,也影响查找效率
  • 不要过短
  • 比如设置为a,没有实际意义,可能会降低key的可读性
  • 统一命名规范

5.1字符串 string

string中的一个key对应一个value,values长可达512Mb。

string常用命令:

  • 赋值
  • set key value
  • 取值
  • get key
  • 取值后赋值
  • getset key value
  • 数值增减
  • 自增1
  • 如果该key不存在,则创建该key,并赋值为0,0自增后为1,等同于增加 【key,1】键值对
  • 如果该key存在,则value自增加1
  • incr key
  • 自减1
  • 如果该key不存在,则创建该key,并赋值为0,0自减后为-1,等同于增加 【key,-1】键值对
  • 如果该key存在,则value自减1
  • decr key
  • 自增指定值
  • 如果该key不存在,则创建该key,并赋值为0,0自增numbers,等同于增加 【key,numbers】键值对
  • 如果该key存在,则value自增numbers
  • incrby key numbers
  • 自减指定值
  • 如果该key不存在,则创建该key,并赋值为0,0自减numbers,等同于增加 【key,-numbers】键值对
  • 如果该key存在,则value自减numbers
  • decrby key numbers
  • 删除
  • del key
  • 扩展
  • value追加string内容
  • append key string

5.2 哈希 hash

hash可以存储多个键值对之间的映射,它就像是一个迷你型的redis。

  • 赋值
  • hset key field value
  • hmset key field value [field value ... ]
  • 取值
  • hget key field
  • hmget key field [field ...]
  • hgetall key
  • 增加数字
  • hincrby key field number
  • 删除
  • hdel key field
  • del key
  • 自学命令
  • hexists key field
  • hlen key
  • hkeys key
  • hvals key

5.3 字符串列表 list

lish的顺序是按照插入的顺序,可以在头部跟尾部插入数据,如果是在list的两头进行操作,那么效率是很高的,但是如果在list中,则会耗费一定时间。

list的类型:

  • arraylist使用数组方式
  • 根据索引查询速度是非常快的
  • 但是新增跟删除操作涉及到位移操作,则会比较慢
  • linkedlist使用双向链接方式
  • 每个元素都记录了前后元素的指针,删除跟新增只需要修改前后指针,数据操作较快

list常用的命令:

  • 两端添加
  • lpush key value [value ...]
  • rpush key value [value ...]
  • 查看列表
  • lrange key start stop
  • 指定位置push
  • lset key index value
  • 列表中第几个位置插入value,注意位置从0开始
  • 指定value插入值
  • linsert key before|after pivot value
  • 在列表中,从左到右,个等于pivot这个值的前面或者后面,插入valuse
  • 两端弹出
  • lpop key
  • 删除列表左边的value
  • rpop key
  • 删除列表右边的value
  • rpoplpush source distination
  • 从source列表右边删除一个value,并把这个value存储进入distination列表中
  • 适用于消息发布过程中的备份操作
  • 获取列表元素个数
  • llen key
  • 获取列表的长度
  • 扩展命令
  • lpushx key value
  • 如果列表存在,则从左端插入push valuse进入列表中,否则返回0
  • rpushx key value
  • 如果列表存在,则从右端插入push valuse进入列表中,否则返回0
  • lrem key count value
  • count>0,从列表的左端开始删除 值等于 value,一共删除count个
  • count<0,从列表的右端开始删除 值等于 value,一共删除count个
  • count=0,删除 整个列表中所有 值等于 value

5.4 字符串集合 set

和list类型不同的是,set集合中不允许出现重复的元素,set大可以包含的元素是 4294967295 。注意,set中是没有顺序的。

用于维护用户对象的性,以及处理数据对象之间的关联关系,可以进行并集交集差集运算。比如购买A产品的用户ID,放在一个set中,购买另外一个B产品的用户ID,放在另外一个set中,这样就很方便计算同时购买两个产品的用户等。

list常用指令:

  • 添加删除元素
  • sadd key member [member ...]
  • srem key member [member ...]
  • del key
  • 获取集合中的元素
  • smembers key
  • 差集运算
  • sdiff key1 [key ...]
  • 求集合key1与其他集合的差集
  • sdiffstore destination key1 [key ...]
  • 求集合key1与其他集合的差集,并把结果存储在destination集合中
  • 交集运算
  • sinter key [key...]
  • 求多个集合的交集
  • sinterstore destination key [key...]
  • 求多个集合的交集,并把结果存储在destination集合中
  • 并集运算
  • sunion key [key...]
  • 求多个集合的并集
  • sunionstore destination key [key...]
  • 求多个集合的并集,并把结果存储在destination集合中
  • 扩展命令
  • sismember key member
  • 查看member在key中是否存在
  • srandmember key [count]
  • 集合key中随机放回 count 个元素
  • scard key
  • 查看集合个数

5.5 有序字符串集合 sorted set

sorted set跟set是比较类似的,集合中不允许出现重复的元素,那么有啥区别呢?sorted set有顺序,从小到大排序,更新操作非常快,访问数据也非常高效。

应用场景:游戏排名、微博热点

常用命令:

  • 获得元素
  • zscore key member
  • 获取有序集合中的某个元素的score值
  • zrange key start stop [withscores]
  • zrangebyscore key mim max [withscores] [limit offset count]
  • 添加元素
  • zadd key score member [score member ...]
  • 删除元素
  • zrem key member [member...]
  • zremrangebyscore key min max
  • 扩展查询
  • zincrby key increment member
  • zscore key member
  • zcount key min max

回到顶部(go to top)

6 keys的通用操作

  • keys *
  • 查看所有keys
  • del key [key...]
  • 删除多个key
  • exists key
  • 判断某个key是否存在,存在返回1,不存在返回0
  • rename key newkey
  • 重命名某个key
  • expire key seconds
  • 设置某个key的生命期,过了这个时间就是过期数据
  • ttl key
  • 查看该key的生命还剩下多少秒
  • type key
  • 查看key的类型

回到顶部(go to top)

7 redis的特性

7.1 多数据库

redis多支持16个数据,下标0-15表示第几个数据库。默认是在0号数据。切换数据库可以通过select dbnumber 来切换,也可以通过move 来移动key从当前数据到指定的数据库。




489034603

7.2 事务

事务的指令:multi、exec、discard。redis中,如果某个命令执行失败,后面的命令还会继续执行。multi,开启事务,这个指令后的指令默认为在同一个事务内,exec等同于提交,discard等同于回滚。




489034603

回到顶部(go to top)

8 redis的持久化

redis的高性能是因为数据都在内存中,如果数据库重启,则所有数据都会丢失,那么如何进行数据持久化呢?

  • RDB持久化
  • 默认支持,在指定的时间内,把内存的数据写入磁盘
  • AOF持久化
  • 以日志的形式记录每一个操作,启动的时候,重新执行所有log
  • 无持久化
  • 不进行持久化,则认为redis的作用为缓存,无需持久化数据
  • RDB与AOF同时使用

8.1 RDB持久化

  • 优势
  • redis数据库仅包含一个文件,对于文件备份是非常方便的,如果系统出现灾难时,较容易恢复
  • 灾难恢复时,备份文件较为容易单独转移到其他存储介质
  • 数据量很大的时候,启动速度快
  • 劣势
  • 不能够保证数据无丢失,数据丢失时间 = 当前时间-近备份时间
  • 子进程完成持久化工作,如果数据集很大的时候,可能会造成短时间内redis所在服务器停止对外服务
  • 配置
  • save 900 1 :900秒内至少有1个数据变化,则进行持久化
  • RDB默认配置文件中就有,可以查看redis.conf文件中关于save的设置
  • save 300 10 :300秒内至少有10个数据发生变化,则进行持久化
  • save 60 10000 : 60秒内至少有1w个数据发生变化,则进行持久化
  • dbfilename 则是命名当前持久文件的名字
  • dir,则是定义当前持久化文件的存放路径

8.2 AOF持久化

  • 优势
  • 更高的数据安全性
  • 每秒同步,高丢失1s数据
  • 每操作数同步,每次发生数据的变化都会立即记录到磁盘中,性能低
  • append追加文件备份
  • 备份过程中出现问题,不会破坏之前的日志备份
  • 如果写入了一半数据,然后出现系奔溃的问题,在redis下一次启动之前,可以通过redis_check_aof工具解决数据一致性问题
  • 如果日志备份过大
  • redis会自动启动日志重写机制,append过程中,会把备份数据写入到老的备份文件中,并且会用一个新文件,记录此期间的修改数据语句
  • AOF包含一个格式清晰的数据修改操作语句的日志文件
  • 劣势
  • 相同数量的数据集文件,比RDB的要打
  • AOF效率低于RDB
  • 需要人员配置,非默认配置
  • 配置
  • 在redis.conf文件中,配置一下内容
  • appendonly yes:启动appendonly,开启AOF备份
  • appendfilename "appendonly.aof" :AOF备份的文件名
  • appendfsync always :每个修改操作同步备份一次
  • appendfsync everysec:1s同步备份一次
  • appendfsync no :不同步
  • 测试配置
  • 简单测试案例
  • redis中配置AOF,选择每操作一次就备份的机制,增删改数据后,执行flushall,然后通过备份文件来恢复数据到flushall之前
  • 步骤
  • 启动AOF,选择每操作一次就备份
  • appendonly yes
  • appendfsync always
  • 重启redis
  • /usr/local/redis/bin/redis-cli shutdown
  • /usr/local/redis/bin/redis-server /etc/redis.conf
  • 造数据
  • 执行flushall
  • 处理备份文件
  • vim /usr/local/redis/appendonly.aof
  • 删除flushall的操作记录
  • 重启数据库
  • /usr/local/redis/bin/redis-cli shutdown
  • /usr/local/redis/bin/redis-server /etc/redis.conf
  • 检查数据


有些代码似乎不可以上传,需要更多学习资料和指导可以关注我,愿在成长的道路上能够相互助力。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

NoSQL与NewSQL
创建时间:2020-06-17 14:29:11
关注NoSQL与NewSQL,专区一站找到所需资料!
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 小雨滴
    专家
戳我,来吐槽~