四时宝库

程序员的知识宝库

超详细的Redis数据库入门教程,还有redis实践电子书分享

Redis简介

要想了解redis就需要知道什么是非关系型数据库NoSQL(not only sql)?

  • 泛指非关系型的数据库
  • 不支持SQL语法
  • 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV(键值对)形式
  • NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景
  • NoSQL中的产品种类相当多:Redis、Mongodb、Hbase hadoop、Cassandra hadoop
  • sql数据库适合用于关系特别复杂的数据查询场景,nosql反之;sql对事务的支持非常完善,而nosql基本不支持事务,两者在不断地取长补短,呈现融合趋势。

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色

    特性和优势

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。
  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
  • 应用场景

  • 用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的(内存数据库)
  • 可以在某些特定应用场景下替代传统数据库——比如社交类的应用
  • 在一些大型系统中,巧妙地实现一些特定的功能:session共享、购物车
  • 只要你有丰富的想象力,redis可以用在可以给你无限的惊喜…….
  • redis安装与配置

    以ubuntu为例:

    # 下载
    wget http://download.redis.io/releases/redis-4.0.9.tar.gz
    # 解压
    tar xzf redis-4.0.9.tar.gz
    # 移动,放到usr/local?录下
    sudo mv ./redis-4.0.9 /usr/local/redis/
    # 进?redis?录
    cd /usr/local/redis/
    # 生成
    sudo make
    # 测试,这段运?时间会较?
    sudo make test
    # 安装,将redis的命令安装到/usr/local/bin/?录
    sudo make install
    # 安装完成后,我们进入目录/usr/local/bin中查看
    cd /usr/local/bin
    ls -all
        redis-server redis服务器
        redis-cli redis命令行客户端
        redis-benchmark redis性能测试工具
        redis-check-aof AOF文件修复工具
        redis-check-rdb RDB文件检索工具
    # 配置?件,移动到/etc/?录下
    sudo cp /usr/local/redis/redis.conf /etc/redis/	

    核心配置选项

  • 绑定ip:如果需要远程访问,可将此?注释,或绑定?个真实ipbind 127.0.0.1
  • 端?,默认为6379port 6379
  • daemonize yes 是否以守护进程运?如果以守护进程运?,则不会在命令?阻塞,类似于服务如果以?守护进程运?,则当前终端被阻塞设置为yes表示守护进程,设置为no表示?守护进程推荐设置为yes
  • 数据?件dbfilename dump.rdb
  • 数据?件存储路径dir /var/lib/redis
  • ?志?件logfile "/var/log/redis/redis-server.log"
  • 数据库,默认有16个database 16
  • 主从复制,类似于双机备份。slaveof
  • 简单命令

    # 查看帮助?档
    redis-ser查看redis服务器进程ver --help
    # 

    数据操作

    redis是key-value的数据结构,每条数据都是?个键值对

    键的类型是字符串

    注意:键不能重复

    值的类型分为五种:字符串string、哈希hash、列表list、集合set、有序集合zset

    # string类型
    增、改
    如果设置的键不存在则为添加,如果设置的键已经存在则修改
    
    set name itcast  设置键为name值为itcast的数据
    
    setex aa 3 aa  设置键为aa值为aa过期时间为3秒的数据
    
    mset a1 python a2 java a3 c  设置键为a1值为python、键为a2值为java、键为a3值为c
    
    append a1 haha   向键为a1中追加值haha
    
    获取
    get name  获取键name的值
    
    mget a1 a2 a3  获取键a1、a2、a3的值
    
    # 键命令
    查找键,参数?持正则表达式
    keys *    查看所有键
    
    exists a1    判断键是否存在,如果存在返回1,不存在返回0
    
    type key   查看键对应的value的类型
    
    del key1 key2 …     删除键及对应的值
    
    expire key seconds     设置过期时间,以秒为单位
    
    ttl key    查看有效时间,以秒为单位
    
    # hash类型
    增加、修改
    hset user name itheima    设置键?user的属性name为itheima
    
    hmset u2 name itcast age 11   设置键u2的属性name为itcast、属性age为11
    
    获取
    hkeys u2    获取键u2的所有属性
    
    hvals key   获取所有属性的值
    
    hget u2 name   获取键u2属性name的值
    
    hmget u2 name age   获取键u2属性name、age的值
    
    删除
    hdel u2 age  删除键u2的属性age
    
    # list类型
    增加
    lpush a1 a b c    从键为a1的列表左侧加?数据a 、 b 、c
    
    rpush a1 0 1   从键为a1的列表右侧加?数据0、1
    
    linsert a1 before b 3   在键为a1的列表中元素b前加?3
    
    获取
    lrange a1 0 -1   获取键为a1的列表所有元素
    
    lset a 1 z   修改键为a的列表中下标为1的元素值为z
    
    
    删除
    lrem a2 -2 b   从a2列表右侧开始删除2个b
    
    ltrim key 0,4   截取
    
    # set类型
    ? ?序集合
    ? 元素为string类型
    ? 元素具有唯?性,不重复
    ? 说明:对于集合没有修改操作
    
    增加
    sadd a3 zhangsan sili wangwu    向键a3的集合中添加元素zhangsan、lisi、wangwu
    
    获取
    smembers a3  获取键a3的集合中所有元素
    
    删除
    srem a3 wangwu    删除键a3的集合中元素wangwu
    
    # zset类型
    有序集合
    每个元素都会关联?个double类型的score,表示权重,通过权重将元素从?到?排序
    增加
    向键a4的集合中添加元素lisi、wangwu、zhaoliu、zhangsan,权重分别为4、5、6、3
    zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
    
    获取
    zrange a4 0 -1   获取键a4的集合中所有元素
    
    zrangebyscore a4 5 6    获取键a4的集合中权限值在5和6之间的成员
    
    zscore a4 zhangsan   获取键a4的集合中元素zhangsan的权重
    
    删除
    zrem a4 zhangsan   删除集合a4中元素zhangsan
    
    zremrangebyscore a4 5 6    删除集合a4中权限在5、6之间的元素
    

    其他特性及高级用法

    事务

    提供了基本的事务支持,可以允许一组指令操作按照原子性(不被打断的情况下)执行,

    但是并没有提供回滚操作的支持,而且一组指令中如果有指令执行出错,也不会终止事务的执行,事务会继续执行下去,把后续的指令都执行完。

    • multi 开启事务
    • exec 执行事务

    watch指令 监视

    一般会结合着redis事务的 multi 、exec一起使用

    首先可以使用watch 让redis帮助我们监视某些redis数据的变化,然后再创建事务,当要开始执行事务的时候,如果由watch监视的变量(数据)发生了变化,则redis事务的任何指令都不会被执行,事务直接停止,如果watch监视的变量(数据)没有发生变化,则redis事务会执行到底(不被打断)。

    持久化

    redis可以将数据写入到磁盘中,redis支持持久化

    • RDB 快照持久化 默认开启
      • 将内存中的redis的所有数据,写入磁盘文件
      • redis会创建子进程来执行
      • 执行的时机:
        • 定期持久化 (自动)

    save 900 1 # 900秒内进行过1次写操作

    save 300 10 # 300秒内进行过10次写操作

    save 60 10000 # 60秒内进行过10000次写操作

    修改redis配置文件 可以调整 /etc/redis/xxxx.conf

    • BGSAVE (手动)SAVE
    • SHUTDOWN (手动) 关闭
    • 缺点:需要将内存中的所有redis数据全部写入到磁盘,性能有开销影响,不会太快 优点:相比AOF 而言 持久化的磁盘文件 要小很多
    • AOF 追加文件方式持久化 默认不开启的 如果开启 appendonly yes
      • 将执行过的redis 写操作 记录到磁盘文件中
      • 执行的时机:

    # appendfsync always # 每执行一个写操作,就立即记录到磁盘中

    appendfsync everysec # 每秒写入一次磁盘

    # appendfsync no # redis本身不再保证每个操作或每秒中都能立即写入磁盘,而是有操作系统决定把缓存的写操作何时写入磁盘

    • redis指令执行时间的数量级 : 1秒钟可以执行10000+的指令
    • 优点: 持久化记录的执行效率相比RDB 稍高,缺点: 持久化产生的磁盘文件很大(因为记录了所有的操作)
    • RDB 可以和AOF同时使用

    Redis 复制集

    redis 主从同步, 起到了数据备份的作用

    • 可以在运行的redis中 执行slaveof指令
    • 可以在配置文件中 执行redis从属于另外哪台机器

    可以使用info Replication 查看机器的主从角色

    一般slave机器 (备份机) 是不支持写操作的

    在redis的主从同步 复制集机器中 一般不会在进行读写分离了

    redis复制集 只能一主 多从

    哨兵 sentinel

    是redis官方提供的 用于管理主从机器 (复制集) 集群,可以方便的进行redis服务器监视、自动故障转移等操作

    哨兵实际上就是一个单独运行的进程 redis-sentinel ,这个程序已经随着redis服务的安装一起安装好了,只需要运行即可。

    作用:

    • Monitoring 监视 帮助我们判断哪些redis服务程序已经死掉,哪些还在存活
      • 用网络通讯完成 定期的发送网路包(心跳包) 比如每1s发送一次 心跳机制
    • Notification 通知
    • Automatic failover 自动故障转移 (核心)
      • 在master死掉的时候,选出一个新master,并且将其他slave都slaveof这个新master
    • Configuration provider 配置提供

    总结: 一般只要使用了redis的复制集,就会一起配合使用哨兵,来完成高可用


    使用方式:
    
    redis-sentinel? /etc/redis/xxx.conf
    
    # 配置文件
    
    bind 127.0.0.1 ? # 哨兵运行的ip
    
    port 26380 ? # 哨兵运行的端口
    
    daemonize yes? # 是否以后台的守护进程方式运行
    
    logfile /var/log/redis-sentinel.log
    
    sentinel monitor mymaster 127.0.0.1 6380 2
    
    sentinel down-after-milliseconds mymaster 30000
    
    sentinel parallel-syncs mymaster 1
    
    sentinel failover-timeout mymaster 180000

    # 说明

    sentinel monitor mymaster 127.0.0.1 6380 2

    * mymaster -> 我们给让哨兵监视的这个redis复制集集群起的名字,以master为主

    * 2 表示是有几台以上的哨兵程序判断 redis服务死掉,才进行故障转移

    • 哨兵程序至少要运行三个以上
    • 要求哨兵程序尽量分散,分散到不同的机器里,不要一窝端
    • 哨兵为了完成故障转移,会自动修改redis的配置文件,所以仅仅依靠redis配置文件判断机器的主从角色,并不是很方便, 可以使用info Replication 查看机器的主从角色

    其中redis还有许多相关命令,具体可以参考官方文档doc.redisfans.com,还有更多的内容包括redis主从和集群的配置,还有redis实战,都可以从下面这本资料中学习到,超级好用。列举一些截图:








    作者简介:Python菜鸟工程师,将在接下来的一段时间内与大家分享一些与Python相关的知识点。如若文中出现问题,各位大佬多多指点,互相学习。喜欢的关注一个吧!谢谢!

    发表评论:

    控制面板
    您好,欢迎到访网站!
      查看权限
    网站分类
    最新留言
      友情链接