如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有。望各位支持!



 
    少年入门笔记,整理出来一起入坑!入门的视屏来自imooc的:http://www.imooc.com/learn/839

1 NOSQL概述

  • 什么是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
      • 优势,社交网络,利用图结构的相关算法
      • 劣势,需要对整个图做算法分析,不利于分布式方案
 

2 redis概述

    C语言编写的高性能键值对数据,支持的键值数据类型:
  • 字符串类型
  • 列表类型
  • 有序集合类型
  • 散列
  • 集合类型
    Redis的应用场景:
  • 缓存
  • 网站访问统计
  • 任务队列
  • 数据过期处理
  • 应用排行榜
  • 分布式集群架构中的session分离

3 redis安装和使用

3.1 redis安装

  • 依赖环境
    • gcc-c++
  1. 1 环境准备
    #官网下载 redis 3.2.5版本
  2. wget http://download.redis.io/releases/redis-4.0.1.tar.gz
  3.  
  4. #安装 C 编译环境
  5.     yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc gcc-c++
  6.  
  7. 2 安装
  8.     解压安装包后,进入文件目录编译,编译结束时,会提示 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安装。
  9.     详细步骤如下:
  10.  
  11. #解压二进制包
  12. tar -zvxf /opt/redis-3.2.
  13.  
  14. #进入到文件目录
  15. cd redis-3.2.
  16.  
  17. #编译
  18. make
  19.  
  20. #测试安装(稍微耗费点时间)
  21. make test
  22.  
  23. #可能会提醒需要安装最新版的tcl
  24. #yum install tcl 
  25.  
  26. #指定路径安装
  27. 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 配置文件修改

  1. #拷贝conf文件到/etc目录
  2. cp /opt/redis/redis-4.0./redis.conf /etc/redis.conf
  3.  
  4.  
  5. #redis.conf 参数说明
  6.  
  7. ################################## NETWORK #####################################
  8.  
  9. #绑定的主机地址
  10. bind 127.0.0.1
  11.  
  12. #保护模式,是否允许 没有认证配置的主机或接口连接redis,默认是启动保护模式,则不允许这种情况
  13. protected-mode yes
  14.  
  15. #指定redis的监听端口,默认端口是6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字,嗯,你开发的,你说了算。
  16. port
  17.  
  18. # In high requests-per-second environments you need an high backlog in order
  19. # to avoid slow clients connections issues. Note that the Linux kernel
  20. # will silently truncate it to the value of /proc/sys/net/core/somaxconn so
  21. # make sure to raise both the value of somaxconn and tcp_max_syn_backlog
  22. # in order to get the desired effect.
  23.  
  24. tcp-backlog
  25.  
  26. #客户端链接多长时间后关闭链接,单位是秒,指定为0,则表示关闭该功能
  27. timeout
  28.  
  29. # A reasonable value for this option is seconds, which is the new
  30. # Redis default starting with Redis 3.2..
  31. tcp-keepalive
  32.  
  33. ################################# GENERAL #####################################
  34.  
  35. #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
  36. daemonize yes
  37.  
  38. # If you run Redis from upstart or systemd, Redis can interact with your
  39. # supervision tree. Options:
  40. #   supervised no      - no supervision interaction
  41. #   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
  42. #   supervised systemd - signal systemd by writing READY= to $NOTIFY_SOCKET
  43. #   supervised auto    - detect upstart or systemd method based on
  44. #                        UPSTART_JOB or NOTIFY_SOCKET environment variables
  45. # Note: these supervision methods only signal "process is ready."
  46. #       They do not enable continuous liveness pings back to your supervisor.
  47. supervised no
  48.  

3.3 服务启动与关闭

  1. #服务端启动
  2. [root@bogon redis-4.0.]# cd /usr/local/redis/
  3. [root@bogon redis]# ./bin/redis-server /etc/redis.conf
  4. :C Aug ::30.774 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  5. :C Aug ::30.774 # Redis version=4.0., bits=, commit=, modified=, pid=, just started
  6. :C Aug ::30.774 # Configuration loaded
  7. [root@bogon redis]# ps axu | grep redis
  8. root        0.6  0.2    ?        Ssl  :   : ./bin/redis-server 127.0.0.1:
  9. root        0.0  0.0     pts/    S+   :   : grep --color=auto redis
  10.  
  11. #客户端启动
  12. redis-cli [-h 127.0.0.1] [-p ]
  13. 127.0.0.1:> ping
  14. PONG
  15.  
  16. #存储键值对
  17. 127.0.0.1:> set name imooc
  18. OK
  19.  
  20. #获取name对应的value
  21. 127.0.0.1:> get name
  22. "imooc"
  23.  
  24. #获取所有keys
  25. 127.0.0.1:> keys *
  26. ) "name"
  27.  
  28. #删除keys
  29. 127.0.0.1:> del name
  30. (integer)
  31. 127.0.0.1:> get name
  32. (nil)
  33.  
  34. #关闭服务端
  35. redis-cli shutdow

4 redis-py的入门

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

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

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的类型

7 redis的特性

7.1 多数据库

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

7.2 事务

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

8 redis的持久化

    redis的高性能是因为数据都在内存中,如果数据库重启,则所有数据都会丢失,那么如何进行数据持久化呢?
  • RDB持久化
    • 默认支持,在指定的时间内,把内存的数据写入磁盘
  • AOF持久化
    • 以日志的形式记录每一个操作,启动的时候,重新执行所有log
  • 无持久化
    • 不进行持久化,则认为redis的作用为缓存,无需持久化数据
  • RDB与AOF同时使用

8.1 RDB持久化

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

        • save 900 1       :900秒内至少有1个数据变化,则进行持久化
        • 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
        • 检查数据

Redis-入门笔记-15min带你一览redis的更多相关文章

  1. redis入门笔记(2)

    redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...

  2. redis入门笔记(1)

    redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...

  3. redis入门笔记

    redis入门笔记 参考redis实战手册 1. Redis在windows下安装 下载地址:https://github.com/MSOpenTech/redis/tags 安装Redis 1.1. ...

  4. Redis入门和Java利用jedis操作redis

    Redis入门和Java利用jedis操作redis Redis介绍 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - val ...

  5. Redis入门笔记(二)-配置及运行

    转自: http://gly199.iteye.com/blog/1056424 1.redis基本参数 redis的配置文件中的常见参数如下: daemonize   是否以后台进程运行,默认为no ...

  6. redis 入门笔记(一)

    redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的web应用程序的完美解决方案 三个主要特点:      1,Redis数据库完全在内存中,使用磁盘仅用于持久性       ...

  7. NoSQL之Redis入门笔记

    Redis 1.Redis介绍 1.1 NoSQL:一类新出现的数据库(not only sql),它的特点 不支持sql语法 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据 ...

  8. Redis入门(四)-Java操作Redis

    <Redis入门>系列文章的第四篇,这一节看一下如何用Java版本的redis客户端工具--Jedis来操作redis. Jedis封装了丰富的api来对redis的五种数据类型 stri ...

  9. Redis学习笔记(一) 初识 Redis

    简介 我所在的公司是一个以线下业务为主的公司,软件这一块的东西可以说是手工作坊,技术上的东西全靠大家自己折腾.最近也是觉得自己在社会主义的怀抱里安逸了太久,要提高思想政治觉悟,不能忘了资本主义的黑暗, ...

随机推荐

  1. 4.vbs的循环,switch,判断等语句

    1.条件判断语句 If Then Else Sub judge(x) Then MsgBox "the num is 0" Then MsgBox "the num is ...

  2. 词向量-LRWE模型

    上一节,我们介绍利用文本和知识库融合训练词向量的方法,如何更好的融合这些结构化知识呢?使得训练得到的词向量更具有泛化能力,能有效识别同义词反义词,又能学习到上下文信息还有不同级别的语义信息. 基于上述 ...

  3. Python3 常用数据类型语法

    1.int类型 int类型的数据是没有长度限制的,它的最大长度只与计算机的内存有关. bin(i)      返回二进制表示结果, hex(i)      十六进制, int(i)       整数( ...

  4. [转]安装PIL时注册表中找不到python2.7

    如果在win7x64安装python2.7的时候选择了all user,则安装PIL的时候会显示找不到python. 解决办法:复制下面的代码到一个.py文件并运行: # # script to re ...

  5. Java虚拟机-----------Java内存区域与内存溢出异常

    Java内存区域划分 Java虚拟机运行时的数据区大致可划分为五部分:方法区,堆(两部分组成Java堆内存),虚拟机栈,本地方法栈(Java栈内存),程序计数器. 1.程序计数器 程序计数器占较小的内 ...

  6. Java 泛型在实际开发中的应用

    java泛型是对Java语言的类型系统的一种扩展,泛型的本质就是将所操作的数据类型参数化.下面我会由浅入深地介绍Java的泛型. 一:泛型出现的背景 在java代码里,你会经常发现类似下边的代码: p ...

  7. Java Jpa 规范

    Jpa最早是EJB3.0里面的内容,JSR 220: Enterprise JavaBeansTM 3.0 https://www.jcp.org/en/jsr/detail?id=220 后来大约在 ...

  8. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  9. co 模块

    1.co 模块,它基于 ES6 的 generator 和 yield ,让我们能用同步的形式编写异步代码. 2.co 模块是能让我们以同步的形式编写异步代码的 nodejs 模块 3.学习网络地址: ...

  10. 自动化运维—tomcat服务起停(mysql+shell+django+bootstrap+jquery)

    项目简介: 项目介绍:自动化运维是未来的趋势,最近学了不少东西,正好通过这个小项目把这些学的东西串起来,练练手. 基础架构: 服务器端:web框架-Django 前端:html css jQuery ...