• Redis-入门笔记-15min带你一览redis【转载】


     


     
        如果转载,请注明博文来源: 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 环境准备
    #官网下载 redis 3.2.5版本 wget http://download.redis.io/releases/redis-4.0.1.tar.gz   #安装 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 配置文件修改

    复制代码
     1 #拷贝conf文件到/etc目录
     2 cp /opt/redis/redis-4.0.1/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 6379
    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 511
    25  
    26 #客户端链接多长时间后关闭链接,单位是秒,指定为0,则表示关闭该功能
    27 timeout 0
    28  
    29 # A reasonable value for this option is 300 seconds, which is the new
    30 # Redis default starting with Redis 3.2.1.
    31 tcp-keepalive 300
    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=1 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.1]# cd /usr/local/redis/
     3 [root@bogon redis]# ./bin/redis-server /etc/redis.conf
     4 74537:C 13 Aug 18:53:30.774 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
     5 74537:C 13 Aug 18:53:30.774 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=74537, just started
     6 74537:C 13 Aug 18:53:30.774 # Configuration loaded
     7 [root@bogon redis]# ps axu | grep redis
     8 root      74538  0.6  0.2 145248  2168 ?        Ssl  18:53   0:00 ./bin/redis-server 127.0.0.1:6379
     9 root      74665  0.0  0.0 112648   968 pts/4    S+   18:53   0:00 grep --color=auto redis
    10  
    11 #客户端启动
    12 redis-cli [-h 127.0.0.1] [-p 6379]
    13 127.0.0.1:6379> ping
    14 PONG
    15  
    16 #存储键值对
    17 127.0.0.1:6379> set name imooc
    18 OK
    19  
    20 #获取name对应的value
    21 127.0.0.1:6379> get name
    22 "imooc"
    23  
    24 #获取所有keys
    25 127.0.0.1:6379> keys *
    26 1) "name"
    27  
    28 #删除keys
    29 127.0.0.1:6379> del name
    30 (integer) 1
    31 127.0.0.1:6379> 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
          • 检查数据
    无欲则刚 关心则乱
  • 相关阅读:
    JavaScript 23 Window
    JavaScript 22 自定义对象
    JavaScript 21 Math
    History 7 : Christianity, Science, and The Enlightenment
    History : The Atlantic Slave Trade
    History 6 : Aztec and Inca Empires / African empires 8001500
    003 几个python编程例子
    006 网络的瓶颈效应
    0212 Logistic(逻辑)回归
    002 用Python打印九九乘法表与金字塔(*)星号
  • 原文地址:https://www.cnblogs.com/xjyxp/p/11322890.html
Copyright © 2020-2023  润新知