zoukankan      html  css  js  c++  java
  • Redis数据结构

    Redis主要支持的数据类型总共有5种:

    toc

    String字符串类型

    字符串是Redis的一种最基本的类型。Redis字符串具有二进制安全功能,主要是指二级制文件上执行的不更改文件内容的功能或者操作,把操作数据作为原始的。无任何特殊格式意义的数据流进行存储,字符串、数字、存储图片、json、或者web的css等静态文件。当然这个值也是用限制的,最大值不能超过512M。

    创建和获取

    创建key值 SET,获取value值 GET
    注意:key的name存在的话,则会覆盖

    ## 创建字符串
    127.0.0.1:6379> set key1 hello
    OK
    127.0.0.1:6379> set key2 world
    OK
    127.0.0.1:6379> set key3 songguoyou
    OK
    ## 获取字符串
    127.0.0.1:6379> get key1
    "hello"
    127.0.0.1:6379> get key2
    "world"
    127.0.0.1:6379> get key3
    "songguoyou"
    127.0.0.1:6379> get key4
    (nil)          ##(nil)代表没有值

    批量创建和批量获取

    批量创建key值 MSET,批量获取value值 MGET

    ## 批量创建字符串
    127.0.0.1:6379> mset key4 song key5 guo key6 you
    OK
    ## 批量获取字符串
    127.0.0.1:6379> mget key1 key2 key3 key4 key5 key6
    1) "hello"
    2) "world"
    3) "songguoyou"
    4) "song"
    5) "guo"
    6) "you"

    追加和删除

    追加key值 APPEND,删除value值 DEL

    ## 追加内容
    127.0.0.1:6379> append key1 world   
    (integer) 10
    127.0.0.1:6379> 
    127.0.0.1:6379> get key1
    "helloworld"
    127.0.0.1:6379> append key1 world
    (integer) 15
    127.0.0.1:6379> get key1
    "helloworldworld"
    ## 删除key
    127.0.0.1:6379> del key1
    (integer) 1
    127.0.0.1:6379> get key1
    (nil)

    字符串int类型增加和减少(可以用于计数器)

    ## 创建int类型的value
    127.0.0.1:6379> set key2 124
    OK
    127.0.0.1:6379> get key2
    "124"
    ## 查看value类型
    127.0.0.1:6379> object encoding key2
    "int"
    ## 对key进行 +1的操作,非int64则会报错
    127.0.0.1:6379> incr key2    #对key进行 +1的操作,非int64则会报错
    (integer) 125
    127.0.0.1:6379> get key2
    "125"
     ## 对key进行 +N的操作
    127.0.0.1:6379> incrby key2 10 
    (integer) 135
    127.0.0.1:6379> get key2
    "135"
    ## 对key进行 -1的操作
    127.0.0.1:6379> decr key2   
    (integer) 134
    127.0.0.1:6379> get key2
    "134"
    ## 对key进行 -N的操作
    127.0.0.1:6379> decrby key2 5
    (integer) 129

    过期时间的操作

    ## 创建key并制定过期时间单位秒 ex
    127.0.0.1:6379> setex key1 10 hello  
    OK
    127.0.0.1:6379> get key1
    “hello”
    ## 过期可以看到key返回为nil
    127.0.0.1:6379> get key1    
    (nil)
    127.0.0.1:6379> get key2
    "129"
    ## 过期时间单位毫秒 px
    127.0.0.1:6379> set key1 hello px 10000  
    OK
    127.0.0.1:6379> get key1
    (nil)
    127.0.0.1:6379> set key1 hello ex 1000
    OK
    ## 查看key的过期时间单位为秒 ttl
    127.0.0.1:6379> ttl key1   
    (integer) 996
    127.0.0.1:6379> set key1 hello px 10000
    OK
    127.0.0.1:6379> 
    127.0.0.1:6379> ttl key1
    (integer) 8
    127.0.0.1:6379> ttl key1
    (integer) 5
    127.0.0.1:6379> ttl key1

    字符串替换和截取

    注意:下标从0开始计算,0是第一位。

    127.0.0.1:6379> set key1 hello
    OK
    ## 从第5位开始替换,下标从0开始
    127.0.0.1:6379> setrange key1 4 world  
    (integer) 9
    127.0.0.1:6379> get key1
    "hellworld"
    
    127.0.0.1:6379> set key1 1   
    OK
    ## 从第6位开始替换,如果没有那么多位,使用x00代替
    127.0.0.1:6379> setrange hey1 5 hello 
    (integer) 10
    127.0.0.1:6379> get key1
    "1x00x00x00x00hello"
    
    127.0.0.1:6379> set key2 123456789
    OK
    ## 从第2位到第6位,这里下标值是包含5的,所以第六位包含在内
    127.0.0.1:6379> getrange key2 1 5   
    "23456"
    127.0.0.1:6379> getrange key2 1 1
    "2"
    ## 下标的key内没有值的时候,出现空
    127.0.0.1:6379> getrange key2 10 11
    ""
    ## 查看value长度,咱们这个key有9位
    127.0.0.1:6379> strlen key2   
    (integer) 9
    127.0.0.1:6379> get key2
    "123456789"

    List列表类型

    LPUSH 插入一个新元素到列表头部
    RPUSH 插入一个新元素到列表尾部。

    ## rpush 在右侧插入一个值,这是第一个创建,不分左右
    127.0.0.1:6379> rpush list1 1  
    (integer) 1
    ## 在1值的后边插入2
    127.0.0.1:6379> rpush list1 2
    (integer) 2
    127.0.0.1:6379> rpush list1 3
    (integer) 3            ## 这里返回表示list内有多少元素
    127.0.0.1:6379> rpush list1 4
    (integer) 4
    ## lrange 获取list下标0到1
    127.0.0.1:6379> lrange list1 0 1  
    1)  "1"
    2)  "2"
     ## 获取下标0到0
    127.0.0.1:6379> lrange list1 0 0  
    1)  "1"
     #lindex命令 获取单个list内单个下标数据
    127.0.0.1:6379> lindex list1 0 
    "1"
    127.0.0.1:6379> lindex list1 2
    "3"
    127.0.0.1:6379> lindex list1 1
    "2"
     ## lrange 获取list下标0到-1(-1代表最后一个,所以这里会取出全部)
    127.0.0.1:6379> lrange list1 0 -1 
    1)  "1"
    2)  "2"
    3)  "3"
    4)  "4"
    ## lpush命令 在list左侧,插入一个值
    127.0.0.1:6379> lpush list1 5  
    (integer) 5
    127.0.0.1:6379> lrange list1 0 -1
    1)  "5"
    2)  "1"
    3)  "2"
    4)  "3"
    5)  "4"
    ## linsert命令,支持在某个值的前边,或者后边插入一个值(不是下标),after是后边,before是前边。
    127.0.0.1:6379> linsert list1 after 2 6  
    (integer) 6
    127.0.0.1:6379> lrange list1 0 -1
    1)  "5"
    2)  "1"
    3)  "2"
    4)  "6" 
    5)  "3"
    6)  "4"
    127.0.0.1:6379> lpush list1 a
    (integer) 7
    127.0.0.1:6379> lrange list1 0 -1
    1)  "a"
    2)  "5"
    3)  "1"
    4)  "2"
    5)  "6"
    6)  "3"
    7)  "4"
    127.0.0.1:6379> linsert list1 after a 7
    (integer) 8
    ## 如果list内没有b这个值的时候,返回-1,表示插入失败
    127.0.0.1:6379> linsert list1 after b 7  
    (integer) -1
    127.0.0.1:6379> lrange list1 0 -1
    1)  "a"
    2)  "7"
    3)  "5"
    4)  "1"
    5)  "2"
    6)  "6"
    7)  "3"
    8)  "4"
    ## before 这里的是在5之前插入8,同样是list内的值。
    127.0.0.1:6379> linsert list1 before 5 8
    (integer) 9
    127.0.0.1:6379> lrange list1 0 -1
    1)  "a"
    2)  "7"
    3)  "8"
    4)  "5"
    5)  "1"
    6)  "2"
    7)  "6"
    8)  "3"
    9)  "4"
    ## lpop 从左侧移除一个元素
    127.0.0.1:6379> lpop list1   
    "a"
    127.0.0.1:6379> lrange list1 0 -1
    1)  "7"
    2)  "8"
    3)  "5"
    4)  "1"
    5)  "2"
    6)  "6"
    7)  "3"
    8)  "4"
    ## rpop 从右侧移除一个元素
    127.0.0.1:6379> rpop list1   
    “4”
    127.0.0.1:6379> lrange list1 0 -1
    1)  "7"
    2)  "8"
    3)  "5"
    4)  "1"
    5)  "2"
    6)  "6"
    7)  "3"
    ## ltrim 保留下标1到3其余删除
    127.0.0.1:6379> ltrim list1 1 3
    OK
    127.0.0.1:6379> lrange list1 0 -1
    1)  "8"
    2)  "5"
    3)  "1"
     ## llen 列表长度
    127.0.0.1:6379> llen list1
    (integer) 3
    ## lset 替换下标1的元素
    127.0.0.1:6379> lset list1 1 hello  
    OK
    127.0.0.1:6379> lrange list1 0 -1
    1)  "8"
    2)  "hello"
    3)  "1"
    127.0.0.1:6379> rpush list2 a
    (integer) 1
    127.0.0.1:6379> rpush list2 b
    (integer) 2
    127.0.0.1:6379> rpush list2 c
    (integer) 3
    127.0.0.1:6379> rpush list2 d
    (integer) 4
    ## 可以一次插入多个元素
    127.0.0.1:6379> rpush list2 e f g  
    (integer) 7
    127.0.0.1:6379> lrange list2 0 -1
    1)  "a"
    2)  "b"
    3)  "c"
    4)  "d"
    5)  "e"
    6)  "f"
    7)  "g"
    127.0.0.1:6379> lrange list1 0 -1
    1)  "8"
    2)  "hello"
    3)  "1"
    ## rpoplpush 把list1的最后一个元素,插入到list2的最前边。
    127.0.0.1:6379> rpoplpush list1 list2
    "1"
    127.0.0.1:6379> lrange list1 0 -1
    1)  "8"
    2)  "hello"
    127.0.0.1:6379> lrange list2 0 -1
    1)  "1"
    2)  "a"
    3)  "b"
    4)  "c"
    5)  "d"
    6)  "e"
    7)  "f"
    8)  "g"

    Sets 集合的操作

    在Redis中Set和list都是字符串的集合。但是Set是无序的集合。集合中的元素都是唯一的。主要原因在于set集合中使用hash来保持了元素的唯一性。

    ## 创建并增加1个元素
    127.0.0.1:6379> sadd set1 1
    (integer) 1
    ## 支持增加一个或者多个元素
    127.0.0.1:6379> sadd set1 2 3 4 5 
    (integer) 4
    ## 查看集合中所有元素
    127.0.0.1:6379> smembers set1
    1)  "1"
    2)  "2"
    3)  "3"
    4)  "4"
    5)  "5"
    ## 查看值是否在集合中,在返回1
    127.0.0.1:6379> sismember set1 3   
    (integer) 1
    ## 查看元素是否在集合中,不存在返回0
    127.0.0.1:6379> sismember set1 6   
    (integer) 0
    127.0.0.1:6379> 
    127.0.0.1:6379> sadd set1 a b c d
    (integer) 4
    ## 删除某个元素
    127.0.0.1:6379> srem set1 2    
    (integer) 1
    127.0.0.1:6379> srem set1 a
    (integer) 1
     ## 同时删除多个元素
    127.0.0.1:6379> srem set1 b 4  
    (integer) 2
    ## 查看所有元素
    127.0.0.1:6379> smembers set1   
    1)  "3"
    2)  "5"
    3)  "d"
    4)  "1"
    5)  "c"
    127.0.0.1:6379> sadd set1 1
    (integer) 0
    127.0.0.1:6379> smembers set1
    1)  "3"
    2)  "5"
    3)  "d"
    4)  "1"
    5)  "c"
    127.0.0.1:6379> sadd set1 2
    (integer) 1
    127.0.0.1:6379> sadd set1 1 2 3
    (integer) 0
    127.0.0.1:6379> smembers set1
    1)  "3"
    2)  "5"
    3)  "d"
    4)  "2"
    5)  "1"
    6)  "c"
     ## 查询集合中有多少元素
    127.0.0.1:6379> scard set1  
    (integer) 6
    127.0.0.1:6379> scard set2
    (integer) 0
    ## 随机获取一个元素
    127.0.0.1:6379> srandmember set1
    "d"
    127.0.0.1:6379> srandmember set1
    "3"
    127.0.0.1:6379> srandmember set1
    "2"
    
    127.0.0.1:6379> sadd set2 1 2 3 4 5 6
    (integer) 6
    ## 从set1中移除,存放到set2中。本次操作由于set2中有3这个值,所以set1中移除,由于唯一性set2中,还是保持只有一个3
    127.0.0.1:6379> smove set1 set2 3   
    (integer) 1
    127.0.0.1:6379> members set1
    1)  "5"
    2)  "2"
    3)  "d"
    4)  "1"
    5)  "c"
    127.0.0.1:6379> members set2
    1)  "1"
    2)  "2"
    3)  "3"
    4)  "4"
    5)  "5"
    6)  "6"
    v127.0.0.1:6379> smove set1 set2 d
    (integer) 1
    127.0.0.1:6379> members set1
    1)  "5"
    2)  "2"
    3)  "1"
    4)  "c"
    127.0.0.1:6379> members set2
    1)  "4"
    2)  "3"
    3)  "6"
    4)  "5"
    5)  "2"
    6)  "1"
    7)  "d"
     ## 查看两个set的合并及,唯一输出,不重复显示
    127.0.0.1:6379> sunion set1 set2  
    1)  "3"
    2)  "4"
    3)  "6"
    4)  "5"
    5)  "1"
    6)  "2"
    7)  "c"
    8)  "d"
    ## 查看set1 set2的交集,共同拥有的值。
    127.0.0.1:6379> sinter set1 set2  
    1)  "5"
    2)  "2"
    3)  "1"
    ## 对比set1和set2差异(以set1为基准)
    127.0.0.1:6379> sdiff set1 set2
    1)  "c"
    ## 对比set2和set1差异(以set2为基准)
    127.0.0.1:6379> sdiff set2 set1
    1)  "4"
    2)  "3"
    3)  "d"
    4)  "6"

    Hash之操作

    Redis中的字典采用哈希表作为底层实现,一个哈希表有多个节点,每个节点保存一个键值对。
    就像python中的字典一样,里面可以存放许多键值对。

    ## 创建并插入单个值
    127.0.0.1:6379> hset hash1 name ersha
    (integer) 1
    127.0.0.1:6379> hset hash1 age 25
    (integer) 1
    #获取hash表中键值为name的value
    127.0.0.1:6379> hget hash1 name
    "ersha"
    ## 原来已存在,插入则修改
    127.0.0.1:6379> hset hash1 name dasha  
    (integer) 0
    127.0.0.1:6379> hget hash1 name
    "dasha"
     ## 查看元素数量
    127.0.0.1:6379> hlen hash1
    (integer) 2
    ## 判断键name是否存在,真1假0
    127.0.0.1:6379> hexists hash1 name
    (integer) 1
    127.0.0.1:6379> hexists hash1 sex
    (integer) 0
    127.0.0.1:6379> hset hash1 sex man
    (integer) 1
    127.0.0.1:6379> hset hash1 phone 12345678910
    (integer) 1
    127.0.0.1:6379> hset hash1 email dasha@qq.com
    (integer) 1
    127.0.0.1:6379> hget hash1 sex
    "man"
    ## 删除1个或者多个键值
    127.0.0.1:6379> hdel hash1 sex name
    (integer) 2
    127.0.0.1:6379> hget hash1 sex
    (nil)
    127.0.0.1:6379> hget hash1 name
    (nil)
     ## 获取hash表内所有键和数
    127.0.0.1:6379> hgetall hash1   
    1)  "age"
    2)  "25"
    3)  "phone"
    4)  "12345678910"
    5)  "email"
    6)  "dasha@qq.com"
    ## 插入多个键和数
    127.0.0.1:6379> hmset hash1 name dasha sex man
    OK
    ## 查看hash表中多个键值的value
    127.0.0.1:6379> hmget hash1 name phone
    1)  "dasha"
    2)  "12345678910"
    ## 查看hash表中所有的key
    127.0.0.1:6379> hkeys hash1
    1)  "age"
    2)  "phone"
    3)  "email"
    4)  "name"
    5)  "sex"
     ## 查看hash表中所有value
    127.0.0.1:6379> hvals hash1  
    1)  "25"
    2)  "12345678910"
    3)  "dasha@qq.com"
    4)  "dasha"
    5)  "man"

    Sorted Sets 有序集合

    Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
    不同的是每个元素都会关联一个double类型的分数(类似权重,可以重复)。redis正是通过分数来为集合中的成员进行从小到大的排序。

    ## 插入分支和数据。可以多个,一定要有权重
    127.0.0.1:6379> zadd zset1 1 peiking
    (integer) 1
    127.0.0.1:6379> zadd aset1 2 shanghai
    (integer) 1
    127.0.0.1:6379> zadd zset1 3 guangzhou
    (integer) 1
    127.0.0.1:6379> zadd zset1 4 shenzhen
    (integer) 1
    127.0.0.1:6379> zadd zset1 5 tianjin
    (integer) 1
    ## 值重复的返回 0 ,但分数会修改
    127.0.0.1:6379> zadd zset1 6 tianjin
    (integer) 0
    127.0.0.1:6379> zadd zset1 7 tianjin
    (integer) 0
    ## 按照权重,从小到大限制,0 -1都是下标,代表显示全部。
    127.0.0.1:6379> zrange zset1 0 -1 withscores
     1) "peiking"
     2) "1"
     3) "shanghai"
     4) "2"
     5) "guangzhou"
     6) "3"
     7) "shenzhen"
     8) "4"
     9) "tianjin"
    10) "7"
    ## 显示下标0到1的元素
    127.0.0.1:6379> zrange zset1 0 1 withscores
     1) "peiking"
     2) "1"
     3) "shanghai"
     4) "2"
    ## 显示按照权重从大到小的全部显示。重点:0 -1代表全部
    127.0.0.1:6379> zrevrange zset 0 -1 withscores
     1) "tianjin"
     2) "7"
     3) "shenzhen"
     4) "4"
     5) "guangzhou"
     6) "3"
     7) "shanghai"
     8) "2"
     9) "peiking"
    10) "1"
    ## 统计集合中有多少元素
    127.0.0.1:6379> zcard zset1
    (integer) 5
    ## 统计权重1到5中间有多少元素
    127.0.0.1:6379> zcount zset1 1 5
    (integer) 4
    ## 为广州这个元素增加5个权重
    127.0.0.1:6379> zincrby zset1 5 guangzhou
    "8"
    ## 获取元素的索引(不算权重),下标从小到大排序
    127.0.0.1:6379> zrank zset1 shanghai
    (integer) 3
    ## 获取集合元素中shanghai的权重、分值
    127.0.0.1:6379> zscore zset1 shanghai
    "2"
    ## 获取元素的索引、下标从大到小排序
    127.0.0.1:6379> zrevrank zset1 shanghai
    (integer) 3
    127.0.0.1:6379> zrevrange zset1 0 -1 withscores
     1) "guangzhou"
     2) "8"
     3) "tianjin"
     4) "7"
     5) "shenzhen"
     6) "4"
     7) "shanghai"
     8) "2"
     9) "peiking"
    10) "1"
    ## 删除元素,多个用空格隔开
    127.0.0.1:6379> zrem zset1 shenzhen shanghai
    (integer) 2
    127.0.0.1:6379> zrevrange zset1 0 -1 withscores
    1) "guangzhou"
    2) "8"
    3) "tianjin"
    4) "7"
    5) "peiking"
    6) "1"
    ## 按照索引删除区间(从小到大)
    127.0.0.1:6379> zremrangebyrank zset1 2 3
    (integer) 1
    127.0.0.1:6379> zrevrange zset1 0 -1 withscores
    3) "tianjin"
    4) "7"
    5) "peiking"
    6) "1"
    ## 按照权重范围删除元素
    127.0.0.1:6379> zremrangebyscore zset1 3 8
    (integer) 1
    127.0.0.1:6379> zrevrange zset1 0 -1 withscores
    1)  "peiking"
    2)  "1"
  • 相关阅读:
    安卓学习第一课——电话拨号器
    CodeForces 644B【模拟】
    hdu5861【线段树】
    CodeForces 41A+43A【课上无聊刷水题系列】
    hdoj5493【树状数组+二分】
    HDU5894【组合数学】
    Codeforces643A【一种暴力】
    CodeForces 689C【二分】
    CodeForces 665B 【水-暴力】
    CodeForces 653A【水】
  • 原文地址:https://www.cnblogs.com/songguoyou/p/11884155.html
Copyright © 2011-2022 走看看