美文网首页
Redis:数据结构与基本命令

Redis:数据结构与基本命令

作者: JackHCC | 来源:发表于2019-05-24 10:51 被阅读0次

    ->点击访问个人博客地址,相互交流学习<-

    官网文档

    Redis 数据类型

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

    String(字符串)

    • string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

    • string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

    • string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

    实例

    redis 127.0.0.1:6379> SET name "runoob"
    OK
    redis 127.0.0.1:6379> GET name
    "runoob"
    

    在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 runoob。
    注意:一个键最大能存储512MB。

    Hash(哈希)

    • Redis hash 是一个键值(key=>value)对集合。

    • Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

    实例
    DEL runoob 用于删除前面测试用过的 key,不然会报错:(error) WRONGTYPE Operation against a key holding the wrong kind of value

    redis 127.0.0.1:6379> DEL runoob
    redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
    "OK"
    redis 127.0.0.1:6379> HGET myhash field1
    "Hello"
    redis 127.0.0.1:6379> HGET myhash field2
    "World"
    

    实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。

    每个 hash 可以存储 232 -1 键值对(40多亿)。

    List(列表)

    • Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

    实例

    redis 127.0.0.1:6379> DEL runoob
    redis 127.0.0.1:6379> lpush runoob redis
    (integer) 1
    redis 127.0.0.1:6379> lpush runoob mongodb
    (integer) 2
    redis 127.0.0.1:6379> lpush runoob rabitmq
    (integer) 3
    redis 127.0.0.1:6379> lrange runoob 0 10
    1) "rabitmq"
    2) "mongodb"
    3) "redis"
    redis 127.0.0.1:6379>
    

    列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

    Set(集合)

    • Redis的Set是string类型的无序集合。

    • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

    sadd 命令
    添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。

    sadd key member
    

    实例

    redis 127.0.0.1:6379> DEL runoob
    redis 127.0.0.1:6379> sadd runoob redis
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob mongodb
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 0
    redis 127.0.0.1:6379> smembers runoob
    
    1) "redis"
    2) "rabitmq"
    3) "mongodb"
    

    注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

    集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

    zset(sorted set:有序集合)

    • Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

    • 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

    • zset的成员是唯一的,但分数(score)却可以重复。

    zadd 命令
    添加元素到集合,元素在集合中存在则更新对应score

    zadd key score member 
    

    实例

    redis 127.0.0.1:6379> DEL runoob
    redis 127.0.0.1:6379> zadd runoob 0 redis
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 mongodb
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 0
    redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
    1) "mongodb"
    2) "rabitmq"
    3) "redis"
    
    image.png

    Redis命令

    官网命令大全

    Redis 事务

    Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

    • 批量操作在发送 EXEC 命令前被放入队列缓存。
    • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
    • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

    一个事务从开始到执行会经历以下三个阶段:

    • 开始事务。
    • 命令入队。
      +执行事务。

    实例

    以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

     MULTI
    OK
    
    redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED
    
    redis 127.0.0.1:6379> GET book-name
    QUEUED
    
    redis 127.0.0.1:6379> SADD tag "C++"  "Programming"  "Mastering Series" QUEUED
    
    redis 127.0.0.1:6379> SMEMBERS tag
    QUEUED
    
    redis 127.0.0.1:6379> EXEC 1) OK 2)  "Mastering C++ in 21 days"  3)  (integer)  3  4)  1)  "Mastering Series"  2)  "C++"  3)  "Programming"
    

    单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

    事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

    > **这是官网上的说明 From redis docs on [transactions](http://redis.io/topics/transactions):**
    > 
    > It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
    

    比如:

    multi
    OK
    redis 127.0.0.1:7000>  set a aaa
    QUEUED
    redis 127.0.0.1:7000>  set b bbb
    QUEUED
    redis 127.0.0.1:7000>  set c ccc
    QUEUED
    redis 127.0.0.1:7000>  exec  1) OK 2) OK 3) OK
    

    如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。


    image.png

    Redis总结



    相关文章

      网友评论

          本文标题:Redis:数据结构与基本命令

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