优点

  • 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
  • 支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
  • 操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
  • 多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

    Redis与其他键值存储系统

  • Redis是键值数据库系统的不同进化路线,它的值可以包含更复杂的数据类型,可在这些数据类型上定义原子操作。

  • Redis是一个内存数据库,但在磁盘数据库上是持久的,因此它代表了一个不同的权衡,在这种情况下,在不能大于存储器(内存)的数据集的限制下实现非常高的写和读速度。
  • 内存数据库的另一个优点是,它与磁盘上的相同数据结构相比,复杂数据结构在内存中存储表示更容易操作。 因此,Redis可以做很少的内部复杂性。

    多数据库

  • Redis默认支持16个数据库,每个数据库无法指定名称,以从0开始的递增数字命名。默认连接是0号数据库。通过 SELECT number 来选择数据要存放的数据库

    1. 127.0.0.1:6379> select 1
    2. OK
    3. 127.0.0.1:6379[1]> get foo
    4. (nil)
  • Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。

  • 多个数据库之间并不是完全隔离的, FLUSHALL 清空所有数据库数据。

    数据类型

  • string(字符串类型)

  • hash(散列类型)
  • list(列表类型)
  • set(集合类型)
  • zset(有序集合类型)

Redis的数据类型不支持数据类型嵌套

字符串类型

能存储任何形式的字符串,包括二进制数据。你可以用其存储用户的邮箱、JSON化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是512 MB

命令

  • Redis不区分命令大小写
  • 所有Redis命令都是原子操作
  • Redis对于键的命名并没有强制的要求,但比较好的实践是用“对象类型:对象ID:对象属性”来命名一个键,如使用键user:1:friends来存储ID为1的用户的好友列表。

    赋值与取值

    1. SET key value
    2. GET key

    同时获得、设置多个键值

    1. MGET key [key ...]
    2. MSET key value [key value ...]
    1. 127.0.0.1:6379[1]> MSET key1 value1 key2 value2
    2. OK
    3. 127.0.0.1:6379[1]> MGET key1 key2
    4. 1) "value1"
    5. 2) "value2"

    递增整数

    1. INCR key

    当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。当键值不是整数时Redis会提示错误:

    1. 127.0.0.1:6379[1]> SET bar test
    2. OK
    3. 127.0.0.1:6379[1]> INCR bar
    4. (error) ERR value is not an integer or out of range
    1. INCRBY key increment

    通过increment参数指定一次增加的数值

    增加指定浮点数

    1. INCRBYFLOAT key increment

    递减整数

    1. DECR key
    2. DECRBY key decrement

    尾部追加

    1. 127.0.0.1:6379[1]> SET bar hello
    2. OK
    3. 127.0.0.1:6379[1]> APPEND bar " world!"
    4. (integer) 12
    5. 127.0.0.1:6379[1]> GET bar
    6. "hello world!"

    获取字符串长度

    STRLEN命令返回键值的长度,如果键不存在则返回0。

    1. 127.0.0.1:6379[1]> GET bar
    2. "hello world!"
    3. 127.0.0.1:6379[1]> STRLEN bar
    4. (integer) 12

    位操作

    1. GETBIT key offset
    2. SETBIT key offset value
    3. BITCOUNT key [start] [end]
    4. BITOP operation destkey key [key ...]

    一个字节由8个二进制位组成。

  • GETBIT命令可以获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始,如果超出键值的二进制位实际长度,返回0。

  • SETBIT命令可以设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值。如果要设置的位置超过了键值的二进制位的长度,SETBIT命令会自动将中间的二进制位设置为0,同理设置一个不存在的键的指定二进制位的值会自动将其前面的位赋值为0
  • BITCOUNT命令可以获得字符串类型键中值是1的二进制位个数,可以通过参数来限制统计的字节范围,[start] [end]是第几个字节,从0开始
  • BITOP命令可以对多个字符串类型键进行位运算,并将结果存储在destkey参数指定的键中。

    散列类型

    散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,散列类型不能嵌套其他的数据类型。一个散列类型键可以包含至多232-1个字段。

    命令

    赋值与取值

    1. HSET key field value
    2. HGET key field
    3. HMSET key filed value [filed value ...]
    4. HMGET key filed [field ...]
    5. HGETALL key
  • HSET当执行的是插入操作时(即之前字段不存在)HSET命令会返回1,当执行的是更新操作时(即之前字段已经存在)HSET命令会返回0。

  • HGETALL 获取所有字段与字段值。

    判断字段是否存在

    1. HEXISTS key field
    HSETNX命令与HSET命令类似,区别在于如果字段已经存在,HSETNX命令将不执行任何操作。

    列表类型

集合类型

有序集合类型