Redis

作者: CanZh | 来源:发表于2019-07-06 16:39 被阅读0次

    wget http://download.redis.io/releases/redis-2.8.17.tar.gz
    tar xzf redis-2.8.17.tar.gz
    cd redis-2.8.17
    make
    make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:

    下面启动redis服务.

    cd /redis/src

    • ./redis-server (&)
      注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。加上&是让redis以后台方式 运行

    • ./redis-server ../redis.conf
      redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

    • redis-cli -p 6380
      使用redis-cli登录,-p指定端口

    启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:

    cd src
    ./redis-cli
    redis> set foo bar
    OK
    redis> get foo
    "bar"

    Redis支持String,list,set,hash,zset五种数据类型

    string

    string是Redi最基础的数据结构,首先,键都是string类型的,而且其他数据都是在string的基础上构建的。string可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),,但是大小不能超过512MB。 image.png

    常用命令:

    设置值

    set key value [ex seconds] [px milliseconds] [nx|xx]

    set命令有几个选项:
    ·ex seconds:为键设置秒级过期时间。
    ·px milliseconds:为键设置毫秒级过期时间。
    ·nx:键必须不存在,才可以设置成功,用于添加。
    ·xx:与nx相反,键必须存在,才可以设置成功,用于更新。
    除了set选项,Redis还提供了setex和setnx两个命令:

    除了set选项,Redis还提供了setex和setnx两个命令:
    setex key [seconds] value
    setnx key value
    setnx和setxx在实际使用中有什么应用场景吗?以setnx命令为例子,由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案,Redis官方给出了使用setnx实现分布式锁的方法:http://redis.io/topics/distlock

    获取值:
    get key image.png

    批量设置值:

    mset key value [key value ...] image.png

    批量获取值:

    mget key [key,key....] image.png image.png

    用mget命令后,要执行n次get命令操作只需要按照图2-9的方式来完成,具体耗时如下:
    n次get时间 = 1次网络时间 + n次命令时间


    image.png

    Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络时间为1毫秒,命令时间为0.1毫秒(按照每秒处理1万条命令算),那么执行1000次get命令和1次mget命令的区别如表2-1,因为Redis的处理能力已经足够高,对于开发人员来说,网络可能会成为性能的瓶颈。

    学会使用批量操作,有助于提高业务处理效率,但是要注意的是每次批量操作所发送的命令数不是无节制的,如果数量过多可能造成Redis阻塞或者网络拥塞。 image.png image.png

    计数

    incr key
    incr命令用于对值做自增操作,返回结果分为三种情况:

    • 值不是整数,返回错误。
    • 值是整数,返回自增后的结果。
    • 键不存在,按照值为0自增,返回结果为1。

    例如对一个不存在的键执行incr操作后,返回结果是1:


    image.png

    除了incr命令,Redis提供了decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数):

    • decr key
    • incrby key increment
    • decrby key decrement
    • incrbyfloat key increment
    image.png
    image.png

    不常用命令:
    append key val --在字符串尾部追加字符串
    strlen key --字符串的长度
    getset key value -- 设置并返回原来的值
    setrange key offeset value 设置指定位置的字符
    getrange key start end 获取部分字符串


    image.png

    字符串内部编码

    字符串类型的内部编码有3种:

    • ThreadLocalint:8个字节的长整型。
    • embstr:小于等于39个字节的字符串。
    • raw:大于39个字节的字符串。

    hash

    在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}}

    哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值,请注意value在不同上下文的作用。
    hset key filed value --设置值


    image.png image.png

    list

    列表(list)类型是用来存储多个有序的字符串,如图2-18所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储232-1个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等(如图2-18和图2-19所示)。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。


    image.png
    列表类型有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表,例如要获取图2-19的第5个元素,可以执行lindex user:1:message4(索引从0算起)就可以得到元素e。第二、列表中的元素可以是重复的,例如图2-20所示列表中包含了两个字符串a。 image.png

    命令

    image.png

    rpush key value [value ...]
    lpush key value [value ...]
    linsert key before|after pivot value
    lindex key index 获取列表指定索引下标的元素
    lrange key start end 获取指定范围内的元素列表
    lrange key 0 -1 可以从左到右获取列表的所有元素
    (第一,索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。
    第二,lrange中的end选项包含了自身,这个和很多编程语言不包含end不太
    相同,例如想获取列表的第2到第4个元素)

    删除数据
    lpop key
    rpop key
    lrem key count value

    ltrim key start end
    下面操作会只保留列表listkey第2个到第4个元素:
    127.0.0.1:6379> ltrim listkey 1 3
    OK

    lset key index newValue 修改指定索引下标的元素

    blpop key [key ...] timeout
    brpop key [key ...] timeout

    blpop和brpop是lpop和rpop的阻塞版本,它们除了弹出方向不同,使用方法基本相同,所以下面以brpop命令进行说明,brpop命令包含两个参数:
    ·key[key...]:多个列表的键。
    ·timeout:阻塞时间(单位:秒)。

    image.png image.png

    Set

    image.png
    image.png

    集合类型的内部编码有两种:
    ·intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。
    ·hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。

    集合类型比较典型的使用场景是标签(tag)

    二、持久化

    redis支持RDB与AOF两种持久化机制,持久化公共能有效的避免因进程退出造成的数据丢失问题。

    1.RDB

    DB持久化是把当前进程数据生成快照保存到硬盘的过程。触发RDB持久化分为手动触发自动触发

    • 手动触发
      .sava命令:阻塞Redis服务器,直到RDB过程完成
      .bgsave: Redis进程执行fork操作创建子进程,RDB持久化由子进程负责。完成后自动结束,阻塞只在fork阶段。
    • 自动触发

    1.使用save相关配置,如save m n,表示m秒内数据集存在n次修改是自动触发bsave
    2.如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件,并发送给从节点。
    3.执行debug reload命令重新加载Redis时,也会自动触发save操作
    4.默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。

    2.RDB流程

    bgsave是主流的触发RDB持久化方式


    image.png

    相关文章

      网友评论

          本文标题:Redis

          本文链接:https://www.haomeiwen.com/subject/pokqzqtx.html