欢迎您光临本小站。希望您在这里可以找到自己想要的信息。。。

redis学习总结

nosql water 3049℃ 0评论

nosql(not only sql)是非关系型数据库,随着web2.0网站,特别是超大规模和高并发的sns类型的web2.0纯动态网站已经是力不从心,暴露了很多难以克服的困难,而非关系型的数据库则由于其本身的特点得到非常迅速的发展。

NoSQL是以key-value形式存储,如js中的json对象,php中的数组array。和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等,这类数据库主要有一下特点:非关系型的、分布式的、开源的、水平可扩展的。

NoSQL特点

  1. 处理超大量的数据

  2. 运行在便宜的PC服务器集群上

  3. 击碎了性能瓶颈

NoSQL的适用场景

 1.对数据高并发读写(大量读写)

 2.对海量数据的高效率存储和访问(大数据量的查询)

 3.对数据的高可扩展性和高可用性(分布式灵活,添加数据服务器节点,表结构修改)

Redis的介绍

  开源的的,先进的key-value存储。它通常被称为数据结构服务器,因为键可以包含字符串、哈希、链表、集合和有序集合。

它支持存储的value类型很多,包括string、list、set、zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集和并集及更丰富的操作,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者修改操作写入追加到记录文件(一是把数据快照、二是操作记录日志)。

提供的API语言很多

目前全球最大的Redis用户是新浪微博

应用场景

    1.应用程序直接访问Redis

    2.应用程序直接访问Redis,只有当Redis访问失败时才访问MySQL

把大象装入冰箱的过程

    1.打开冰箱门

    2.把大象装进去

    3.关闭冰箱门

冰箱不够大如mysql

Redis数据库提供多种灵活的数据机构和数据操作,为不同的大象构建不同的冰箱

具体应用场合

  1. 取最新N个数据的操作

  2. 排行榜应用,取TOPN操作

  3. 需要精确设定过期时间的应用

  4. 计数器应用

  5. Uniq操作,获取某段时间所有数据排重值

  6. 实时系统,反垃圾系统

  7. Pub/Sub构建实时消息系统

  8. 构建队列系统

  9. 缓存

redis只有库的概念,没有表、没有字段概念

Redis的安装与部署

http://redis.io/download

尽量使用标准版

步骤

    一.下载

    二.编译源文件

        tar zxvf redis-2.4.17.tar.gz

        cd redis-2.4.17

        make

        cd src && make install

    三.移动文件,便于管理

        mkdir -p /user/local/redis/bin

        mkdir -p /user/local/redis/etc

        mv /lamp/redis-2.4.17/redis.conf /user/local/redis/etc

        cd /lamp/redis-2.4.17/src

        mv 一部分程序 到 /user/local/redis/bin

    四.启动Redis服务(默认连接端口6379)

        检查是否启动netstat -trunpl|grep 6379

        mysql:3306 mongodb:2707或者2807

         /user/local/redis/bin/redis-server /user/local/redis            /etc/redis.conf

    五.客户端连接

        /user/local/redis/bin/redis-cli

    六.停止Redis实例

key为String类型

    set、

    setnx(不存在,则设置值)、

    setex(设置key对应的值,并指定有效期)

        setex mycolor 10 red

    setrange设置指定key的value值的子字符串

        setrange name 6 126.com

    mset一次设置多个key的值

        mset key1 water1 key2 water2

    msetnx

    get

    getset设置key的值,并返回key的旧值

    getrange

    mget

    incr(对key的值做加加操作,并返回新值)

    incrby

    decr

    decrby

    append

    strlen

key为hashes类型及操作

    hset

        hset user:001 name water

    hsetnx

    hmset

    hget

    hincrby

    hexists

    hlen

    hdel

    hkeys

    hvals

    hgetall

    

key为list元素类型

    从头部插入(栈,先进后出)

        lpush mylist "world"

        lpush mylist "hello"

        lrange mylist 0 -1

    从尾部插入(队列,先进先出)

        rpush list2 "water"

        rpush list2 "test"

        lrange mylist2 0 -1

    从中间插入(linsert)

        lpush list3 "one"

        lpush list3 "two"

        lrange list3 0 -1输出结构 two one

        linsert list3 before one "three"(在one前面压入)

        lrange list3 0 -1输出结构  two three one

从尾到头,为向上。

    lset设置list中指定下标的值

        lpush list5 one

        lpush list5 two

        lpush list5 three

        lrange list5 0 -1(从头到尾)输出three two one

        lset list5 1 four

        lrange list5 0 -1 输出three four one

    lrem从key对应list中删除n个和value相同的元素

        lrem list6 3 "one"

    ltrim保留指定key的值范围内的数据

    lpop从list的头部弹出元素,并返回弹出元素

    rpop从list的尾部弹出元素,并返回弹出元素

    rpoplpush从第一个list的尾部弹出元素并添加到第二个list的头部

    lindex返回名称为key的list中index位置的元素   

    llen链表的元素个数

sets类型与操作

    Set是集合,它是string类型的无序集合。set是通过hash table实现的,添加、删除和查找的复杂度都是0(1)。对集合我们可以取并集、交集、差集。通过这些操作我们可以实现sns中好友的推荐和blog的tag功能

    sadd(向名称为key的set中添加元素)

        sadd myset "hello"

    smember myset(查看set中的成员)

    srem(删除名称为key的set中的元素)

        srem myset "hello"

    spop(随机返回并删除名称为key的set中的一个元素)

        spop myset

    sdiff(返回所有给定key与第一个key的差集)

    sdiffstore

        sdiffstore myset1 myset2 myset3

    sinter(返回所有给定key的交集)

        sinter myset1 myset2

    sinter

    sunion(返回所有给的key的并集)

    smove(从第一个key对应的set中移除member并添加到第二个对应的set中)

        smove myset1 myset2 three

    sismember(测试memeber是否是名称为key的set元素)

    srandmember(随机返回名称为key的set的一个元素,但是不删除元素)

sorted sets类型及操作

    是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两个列的mysql表,一个存value,一个存顺序。操作中key理解为zset的名字

    zadd(向名称为key的zset中添加元素member,score用于排序。如果该元素存在,则更新其顺序)

        zdd myset 1 "one"

    zrange myzset 0 -1 withscores(从第一个元素到最后一个元素)

    zrem(删除名称为key的zset中的元素member)

        zrem myzset two

    zincrby(如果在名称为key的zset中已经存在元素member,则该元素的score增加increment,否则添加)

    zrank(返回名称为key的zset中member元素的排名,索引值)

    zrevrank(返回名称为key的zset中member元素的排名,按score从大到小)

    zrevrange

    zrangebysoce(返回集合中score在给定区间的元素)

    zcount(返回集合中score在给定区间的数量)

        zcount myzset 2 3

    zcard(返回集合中元素个数)

    zremrangebyrank(删除集合中排名在给定区间的元素)

    zremrangebyscore(删除集合中score在给定区间的元素)

Redis的常用命令

    Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在Linux终端使用

        1.键值相关命令

         2.服务器相关命令

    keys(返回满足给定pattern的所有key)

    exists(确认一个key是否存在)

    del(删除一个key)

    expire(设置一个key的过期时间)

    move(将当前数据库中的key转移到其他数据库中)

    selet 0 (表示进入0数据库),数据库名称是(0到15)

    persist(移除给定key的过期时间)

    randomkey(随机返回key空间的一个key)

    rename(重命名key)

    type(返回值的类型)

    ping(测试连接是否存活)

    echo(在命令行打印一些内容)

    dbsize(返回当前数据库中key的数目)

    info(获取服务器的信息和统计)

    config get(实时传储收到的请求)

    flushdb(删除当前选择数据库中所有key)

    flushall(删除所有数据库中的所有key)

Redis高级实用特性

    1.安全性

    2.主从复制

    3.事务处理

    4.持久化机制

    5.发布订阅消息

    6.虚拟内存的使用

  1. 安全性

    1. 设置客户端连接后进行任何其他指令前需要使用的密码

     vim /user/local/redis/etc/redis.conf

     找到requirepass water

     修改完配置文件需要重新启动

     pkill redis-server

     然后启动  登录 

     autho water(授权)

    登录的时候可以指定密码

    /usr/local/redis/bin/redis-cli -a water

  2. 主从复制特点

    1. Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本

    2. Redis主从复制特点

      1. Master可以拥有多个slave

      2. 多个slave可以连接到一个master外,还可以连接到其它

      3. 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求

      4. 提高系统的伸缩性

    3. Redis主从复制过程

      1. Slave与master建立连接,发送sync同步命令

      2. Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的命令并缓存

      3. 后台完成保存后,就将此文件发送给slave

      4. Slave将此文件保存到硬盘上

    4. 配置主从服务器:

      1. 配置slave服务器很简单,只需要在slave的配置文件中加入一下配置

        slaveof 192.168.1.1 6379#指定master的ip和端口

        masterauth lamp #这时主机的密码

        info可以查看角色

  3. 事务处理

    Redis对事物的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以联系的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该链接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺利的执行队列中的所有命令。

    discard命令其实就是清空事务的命令队列并退出事务上下文。也就是我们常说的事务回滚。

    乐观锁:大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据表添加一个"version"字段来实现读取出数据时,将此版本号一桶读出,之后更新时,对此版本号加1。此时,将提交数据的版本号于数据表对应激烈的当前版本号进行比对,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。

    Redis乐观锁实例:假设有一个age的key,我们开2个session来对age进行赋值操作,我们来看一下结果如何

    watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发送变化,则整个事务会失败。也可以调用watch多次监视多个key.这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的事务也一样。如果连接端口,监视和事务都会被自动清除。当然了exec,discard,unwatch命令都会清除连接中的所有监视。

    Redis的事务还是不成熟,

    incry age

    incry name

    事务中一个成功一个失败,而关系型数据会全部回滚

  4. 持久化机制

    Redis是一种支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。

    Redis支持两种持久化方式:

    1.snapshotting(快照)也就是默认方式

    2.Append-only file(缩写aof)的方式

    快照是默认的持久化方式。这种方式是将内存中数据以快照的方式     写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动到快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动快照

    save 900 1 #900秒内如果超过1个key被修改,则发起快照

    aof比快照方式有更好的持久化性,是由于在使用aof时,redis会      将每个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库内容

    当然由于os会在内核中缓存write做的修改,所以可能不是立即写的磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改

    可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机

    appendonly yes //启用aof持久化方式

    #appendfsync always //收到写命令就立即写入磁盘,最慢,但能保证完全持久化

    #appendfsync everysec //每秒种写入磁盘一次。 折中方式

    #appendfsync no //完全依赖os.性能最后,持久化没保证

 5. 发布及订阅消息

    发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者与消息订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和pubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel).当发布者通过publish命令向redis server发送特定类型的消息时,订阅该消息类型的全部client都会收到此消息

6.虚拟内存的使用

    就是暂时把不经常访问的数据从内存交换到硬盘中。从而腾出宝贵的内存空间用于其他需要访问的数据。除了可以将数据分割到多个redis server外。另外能够提高数据库容量的办法就是虚拟内存了

    配置vm相关配置

    

    

    

    

    

    

转载请注明:学时网 » redis学习总结

喜欢 (0)or分享 (0)

您必须 登录 才能发表评论!