redis基本类型和使用方法详解

    redis存储数据的基本类型有:string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。

    依次做一些练习。redis命令不区分大小写。

    key相关操作

    
    127.0.0.1:6379> set key hello ## 设置
    OK
    127.0.0.1:6379> set key1 world
    OK
    127.0.0.1:6379> keys ke* ## keys查询键名
    1) "key1"
    2) "key"
    127.0.0.1:6379> del key1 ## 删除键值对
    (integer) 1
    127.0.0.1:6379> exists key ##查询键名是否存在
    (integer) 1 ##存在返回1
    127.0.0.1:6379> exists key1
    (integer) 0 ##不存在返回0
    127.0.0.1:6379> type key ##查询键值的类型 
    string

    字符串类型

    
    127.0.0.1:6379> exists num 
    (integer) 0
    127.0.0.1:6379> incr num ##incr一个不存在的值,先创建新值,赋值为0,再自增1.院子操作。 对应的是decr
    (integer) 1
    127.0.0.1:6379> set key hello
    OK
    127.0.0.1:6379> incr key ##无法对string自增
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> incrby num 3 ##increby增加指定的数值,对应的是decrby
    (integer) 4
    127.0.0.1:6379> incrbyfloat num 0.7 ##增加浮点数
    "4.7"
    127.0.0.1:6379> append key " world!" ##append追加字符
    (integer) 12
    127.0.0.1:6379> get key
    "hello world!"
    127.0.0.1:6379> strlen key ##strlen字符串长度
    (integer) 12
    127.0.0.1:6379> mget key num ## mget批量获取键值
    1) "hello world!"
    2) "4.7"
    127.0.0.1:6379> mset key hi num 5.5 ##mset批量设置
    OK
    127.0.0.1:6379> mget key num
    1) "hi"
    2) "5.5"
    127.0.0.1:6379> set foo bar 
    OK
    127.0.0.1:6379> getbit foo 1 ##getbit获取某一位二进制数值
    (integer) 1
    127.0.0.1:6379> setbit foo 22 0 ##设置修改位值
    (integer) 1
    127.0.0.1:6379> get foo ##修改成功
    "bap"
    127.0.0.1:6379> set foo bar
    OK
    127.0.0.1:6379> set foo1 aar
    OK
    127.0.0.1:6379> bitop or result foo foo1 ##bitop位操作
    (integer) 3
    127.0.0.1:6379> get result
    "car"

    GETBIT key offset

    SETBIT key offset value

    BITCOUNT key [start] [end] 获取键值中值为1的二进制位个数,start和end表示字节位置

    BITOP operation destkey key [key…] 对多个键值进行位运算,并将结果存储在destkey对应的键值中。支持的操作:AND、 OR、 XOR、 NOT。

    GETSET key newValue 原子操作,设置新值,返回原来的值。如果原值不存在,返回nil。

    SETEX key seconds value 设置键值对的失效时间是seconds秒。

    SETNX key value put if absent, or do nothing。

    SETRANGE key offset value 从index等于offset位置起,替换length(value)个字符,替换为value。如果offset超出范围,则中间补充0x00。

    GETRANGE key start end 获取指定返回的字符串,闭区间。end超过长度,则取到字符串末尾。

    MGET key [key … ]

    MSET key value [key value … ]

    MSETNX key value [key value … ] 原子操作。如果在这一批Keys中有任意一个Key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。1表示全部设置成功;0表示都没有设置。

    
    127.0.0.1:6379> getset foo hi ##设置新值,返回旧值nil
    (nil)
    127.0.0.1:6379> get foo
    "hi"
    127.0.0.1:6379> setex foo 2 hello ##设置键值对,2秒失效
    OK
    127.0.0.1:6379> get foo ##没失效时,返回值
    "hello"
    127.0.0.1:6379> get foo ##失效之后,返回nil
    (nil)
    127.0.0.1:6379> set foo hello
    OK
    127.0.0.1:6379> setrange foo 1 appy ##替换index=1之后的字符串
    (integer) 5
    127.0.0.1:6379> get foo
    "happy"
    127.0.0.1:6379> setrange foo 1 ee
    (integer) 5 ##返回修改后的长度
    127.0.0.1:6379> get foo ##替换两个字符
    "heepy"
    127.0.0.1:6379> setrange foo 8 day
    (integer) 11  
    127.0.0.1:6379> get foo
    "heepy\x00\x00\x00day"
    127.0.0.1:6379> get bar
    (nil)
    127.0.0.1:6379> setrange bar 2 ee ##bar的值为nil,补充两个0x00
    (integer) 4
    127.0.0.1:6379> get bar
    "\x00\x00ee"
    127.0.0.1:6379> set key1 hello
    OK
    127.0.0.1:6379> msetnx key1 hi key2 hi ##key2不存在,不修改
    (integer) 0
    127.0.0.1:6379> mget key1 key2 ## key2依然为nil
    1) "hello"
    2) (nil)

    hash

    HSET key field value

    HGET key field

    HMSET key field value [field value … ]

    HMGET key field [field …]

    HGETALL key

    HEXISTS key field

    HSETNX key field value 字段不存在时赋值。 与HSET类型,区别在于,如果字段存在,HSETNX不执行任何操作。

    HINCRBY key filed increment 如果key、field不存在,自动创建,键值为0,再增值。

    HDEL key field [field…] 这是删除的是key:field,不能直接删除key。如果要删除key,使用DEL命令。

    HEYS key 只获取字段名

    HVALS key 只获取字段值

    HLEN key 获得字段数量

    
    127.0.0.1:6379> HMSET g1class1 xiaoming 001 xiaohong 002 tom 003 hanmeimei 004
    OK
    127.0.0.1:6379> HGETALL g1class1 
    1) "xiaoming"
    2) "001"
    3) "xiaohong"
    4) "002"
    5) "tom"
    6) "003"
    7) "hanmeimei"
    8) "004"
    127.0.0.1:6379> HKEYS g1class1
    1) "xiaoming"
    2) "xiaohong"
    3) "tom"
    4) "hanmeimei"
    127.0.0.1:6379> HLEN g1class1
    (integer) 4
    127.0.0.1:6379> HGET g1class1 xiaohong
    "002"
    127.0.0.1:6379> HSET g1class1 lilei 005 ##het新值时,返回1
    (integer) 1
    127.0.0.1:6379> hset g1class1 xiaohong 007 ## hset更新值时,返回0
    (integer) 0
    127.0.0.1:6379> hsetnx g1class1 tom 008 ##已存在的值,不操作
    (integer) 0
    127.0.0.1:6379> hget g1class1 tom ##已存在的值,更新不生效,还是003
    "003"
    127.0.0.1:6379> hdel g1class1 ##不能直接删除key
    (error) ERR wrong number of arguments for 'hdel' command
    127.0.0.1:6379> DEL g1class1 ##使用DEL删除key
    (integer) 1
    127.0.0.1:6379> hgetall g1class1 ##查询为空
    (empty list or set)

    用途

    1. 用来存储分级数据。外部key作为prefix,是第一级key,hash中的key作为第二级key使用。
    2. 存储含有多个属性的对象,如一篇博客的各种属性:标题,标签,分类等。修改某个属性,不用操作整个博客内容。

    list

    redis列表类型内部是使用双向列表实现的,所以可以向/从两端添加/删除元素。

    LPUSH key value [value …] 从左侧添加元素,如果key不存在,初始化一个空列表,再添加。返回插入后,链表的个数。

    LPUSHX key value 仅当指定的Key存在时,才在列表的左边插入Value,否则将不会有任何操作发生。返回插入后,链表的个数。

    RPUSH key value [value …] 从右侧添加元素

    RPUSHX key value 仅当指定的Key存在时,才在列表的右边插入Value,否则将不会有任何操作发生。返回插入后,链表的个数。

    LPOP key 从两端弹出元素

    RPOP key

    LLEN key 获取列表中元素个数

    LRANGE key start end 获取列表片段,左边在前,右边在后。起始索引为0,最右边元素索引可以为-1,右边第二个索引可以为-2,以此类推。。。索引从左到右,如果start比end靠右,则返回空列表。end值可以大于长度范围。

    LREM key count value 从左边(count > 0)开始,删除前count个值为value的元素;从右边(count < 0)开始,删除前|count|个值为value的元素 ; 删除所有值为value的元素(count = 0)。返回实际删除元素的个数。

    LINDEX key index 获取指定索引的元素值

    LSET key index value 设置指定索引的元素值

    LTRIM key start end 删除指定索引范围之外的所有元素。start和end的规则与lrange的相同。

    LINSERT key BEFORE|AFTER pivot value 从左到右查找pivot,将value插在其前面(BEFORE)或者后面(AFTER)。 返回插入后,元素总个数。

    RPOPLPUSH source destination 删除source最右边的元素,插入到destination最左边。返回操作的元素。

    
    127.0.0.1:6379> lpush num 1 2 ## 先push 1,再push 2
    (integer) 2
    127.0.0.1:6379> rpush num 3 4 ##先push 3,再push 4
    (integer) 4
    127.0.0.1:6379> lrange num 0 -1 ##从0开始,显示4个元素
    1) "2"
    2) "1"
    3) "3"
    4) "4"
    127.0.0.1:6379> llen num
    (integer) 4
    127.0.0.1:6379> lrange num -1 -2 ##start比end靠右,返回空列表
    (empty list or set)
    127.0.0.1:6379> lrange num -2 -1 ##从右边第二到右边第一
    1) "3"
    2) "4"
    127.0.0.1:6379> lpush num 3 4 3 
    (integer) 7
    127.0.0.1:6379> lrange num 0 -1
    1) "3"
    2) "4"
    3) "3"
    4) "2"
    5) "1"
    6) "3"
    7) "4"
    127.0.0.1:6379> lrem num 2 3
    (integer) 2  ## 一共删除了两个
    127.0.0.1:6379> lrange num 0 -1
    1) "4"
    2) "2"
    3) "1"
    4) "3"
    5) "4"
    127.0.0.1:6379> 
    127.0.0.1:6379> lrem num 0 4 ##删除所有值为4元素
    (integer) 2    ## 一共删除了两个
    127.0.0.1:6379> lrange num 0 -1
    1) "2"
    2) "1"
    3) "3"
    127.0.0.1:6379> lrem num 2 3
    (integer) 1 ##只删除了一个元素
    127.0.0.1:6379> lrange num 0 -1
    1) "2"
    2) "1"
    127.0.0.1:6379> lpush num 1 3
    (integer) 4
    127.0.0.1:6379> linsert num BEFORE 1 4 ##将4插入左边第一个1的前面
    (integer) 5   ##插入后,一共有5个元素
    127.0.0.1:6379> lrange num 0 -1
    1) "3"
    2) "4"
    3) "1"
    4) "2"
    5) "1"
    127.0.0.1:6379> rpoplpush num num1 ##转移一个元素
    "1"
    127.0.0.1:6379> lrange num1 0 -1
    1) "1"
    127.0.0.1:6379> rpoplpush num num1
    "2"
    127.0.0.1:6379> lrange num1 0 -1
    1) "2"
    2) "1"
    127.0.0.1:6379> lrange num 0 -1 ##num中转移走了2个元素
    1) "3"
    2) "4"
    3) "1"
    127.0.0.1:6379> lpushx num 5 ##键名num存在,push成功
    (integer) 4
    127.0.0.1:6379> lrange num2 0 -1 
    (empty list or set)
    127.0.0.1:6379> lpushx num2 1 ##键名num2不存在,push失败
    (integer) 0
    127.0.0.1:6379> lrange num2 0 -1
    (empty list or set)

    用途

    1. 列表页

    set

    redis的set使用值为空的散列表(hash table)实现。

    SADD key member [member …] 加入set中不存在的元素;返回成功加入的值的个数

    SREM key member [member … ] 删除set中存在的元素;返回成功删除的个数

    SPOP key 随机选取一个元素,弹出并返回。如果key不存在,返回nil。

    SMEMBERS key 获取所有元素

    SISMEMBER key member 判断元素是否在集合中,存在返回1;key或者member不存在,返回0。

    SCARD key 获取元素个数

    SDIFF key1 [key2 … ] 集合求差集,key1中存在,key2中不存在的

    SINTER key [key … ] 集合求交集

    SUNION key [key … ] 集合求并集

    SDIFFSTORE destination key1 [key2 … ] 集合求差集,并存入destination中。

    SINTERSTORE destination key [key … ] 集合求交集,并存入destination中。

    SUNIONSTORE destination key [key … ] 集合求并集,并存入destination中。

    SRANDMEMBER key [count] 随机选取count个元素,不带参数count时,选取一个。count=0,返回空列表;count > 0,选择min(count, scard)个数据,且不重复,最多返回所有元素; count < 0 选择|count|个元素,有可能重复。

    SMOVE source destination member 原子性的将参数中的成员从source键移入到destination键所关联的Set中。因此在某一时刻,该成员或者出现在source中,或者出现在destination中。如果该成员在source中并不存在,该命令将不会再执行任何操作并返回0,否则,该成员将从source移入到destination。如果此时该成员已经在destination中存在,那么该命令仅是将该成员从source中移出。如果和Key关联的Value不是Set,将返回相关的错误信息。返回1表示正常移动,0表示source中并不包含参数成员。

    
    127.0.0.1:6379> sadd set1 a b ##添加两个不存在的元素
    (integer) 2
    127.0.0.1:6379> sadd set1 a c ##添加成功一个元素c
    (integer) 1
    127.0.0.1:6379> smembers set1 ##获取所有元素
    1) "c"
    2) "b"
    3) "a"
    127.0.0.1:6379> srem set1 d b ##删除成功一个元素
    (integer) 1
    127.0.0.1:6379> smembers set1
    1) "c"
    2) "a"
    127.0.0.1:6379> sismember set1 a 
    (integer) 1
    127.0.0.1:6379> sadd set1 b
    (integer) 1
    127.0.0.1:6379> sadd set2 a d e 
    (integer) 3
    127.0.0.1:6379> sadd set3 c h j 
    (integer) 3
    127.0.0.1:6379> sdiff set1 set2 set3 ##求差集,在set1中,同时不在set2,set3中的元素
    1) "b"
    127.0.0.1:6379> scard set1
    (integer) 3
    127.0.0.1:6379> sdiffstore set4 set1 set2 set3
    (integer) 1
    127.0.0.1:6379> smembers set4
    1) "b"
    127.0.0.1:6379> srandmember set1 0
    (empty list or set)
    127.0.0.1:6379> srandmember set1 1
    1) "c"
    127.0.0.1:6379> srandmember set1 2
    1) "a"
    2) "b"
    127.0.0.1:6379> srandmember set1 5 ##返回min(5, 3)个元素,且不重复
    1) "c"
    2) "a"
    3) "b"
    127.0.0.1:6379> srandmember set1 -5 ## 返回5个元素,可能重复
    1) "a"
    2) "b"
    3) "c"
    4) "c"
    5) "c"
    127.0.0.1:6379> spop set1
    "c"
    127.0.0.1:6379> smembers set1
    1) "b"
    2) "a"
    127.0.0.1:6379> smembers set2
    1) "d"
    2) "a"
    3) "e"
    127.0.0.1:6379> smove set2 set1 c ##source中不含移动的元素,不操作
    (integer) 0
    127.0.0.1:6379> smove set2 set1 e ##移动一个元素到另一个集合
    (integer) 1
    127.0.0.1:6379> smembers set2
    1) "d"
    2) "a"
    127.0.0.1:6379> smembers set1
    1) "b"
    2) "a"
    3) "e"

    用途

    1. 唯一性数据集合,如某用户访问了哪些店铺等。
    2. 集合相关场景。每个店铺的访问用户是一个set,查找同时访问多个店铺的用户群,查找访问一类店铺的用户群等。

    sorted set

    有序集合为每一个元素关联一个分数,并按照分数进行排序。 虽然集合中的每个元素都是不相同的,但是它们的分数却可以相同。

    ZADD key score member [score member … ] 添加新元素,如果元素已经存在,则更新分数。score支持整型和双精度浮点型。返回新添加的元素的个数(更新分数的不算)。inf和-inf分别表示正无穷和负无穷。

    ZINCRBY key increment member 增加一个元素的分数,increment可以是负数。

    ZSCORE key member 查询元素的分数

    ZCARD key 获取集合中元素的个数

    ZCOUNT key min max 指定分数范围内元素的个数,支持开闭区间。

    ZRANGE key start end [WITHSCORES] 按照分数从小到大排序,获取排名在某个范围的元素列表,分数可选。闭区间,end可为负数,与lrange参数要求一致。

    ZREVRANGE key start end [WITHSCORES] 按照分数从大到小排序。

    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count ] 按分数从小到大顺序,返回分数在闭区间[min,max]的元素。可以指定开区间,在min前面加上”(“,则表示(min, max]。支持inf和-inf。 offset和count指,在获得的元素列表的基础上,向后偏移offset个元素,并且只获取前count个元素。

    ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count ] 按分数从大到小顺序,返回分数在闭区间[min,max]的元素。注意max和min的参数位置。

    ZREM key member [member … ] 删除一个或者多个元素

    ZREMRANGEBYRANK key start end 按照范围排名删除元素,闭区间。索引从0开始。

    ZREMRANGEBYSCORE key min max 按照分数排名,删除分数在[min,max]的元素,支持开区间。

    ZRANK key member 按分数从小到大排序,获取元素member的排名,分数最小的排名是0

    ZREVRANK key member 按分数从大到小排序,获取元素member的排名,分数最大的排名是0

    ZINTERSTORE destination numkeys key [key … ] [WEIGHTS weight [weight … ]] [AGGREGATE SUM|MIN|MAX] 计算numkeys个有序集合的交集,存储在有序集合destination里面,返回destination的元素个数。

    WEIGHTS参数设置每个集合的权重,每个集合在参与计算时,元素的分数会被乘上该集合的权重。

    AGGREGATE表示destination中元素分数的计算方式:

    AGGREGATE为SUM(默认值)时,则destination中元素的分数,是每个参与计算的集合中该元素分数的和。

    AGGREGATE为MAX时,则destination中元素的分数,是每个参与计算的集合中该元素分数的最大值。

    AGGREGATE为MIN时,则destination中元素的分数,是每个参与计算的集合中该元素分数的最小值。

    ZUNIONSTORE destination numkeys key [key … ] [WEIGHTS weight [weight … ]] [AGGREGATE SUM|MIN|MAX] 与上面类似。

    
    127.0.0.1:6379> zadd zset1 10 sh 40 bj ##添加2个元素
    (integer) 2
    127.0.0.1:6379> zadd zset1 20 sh 50 hz 80 cd ##更新1个,添加2个
    (integer) 2
    127.0.0.1:6379> zscore zset1 sh ##获取sh的分数,已更新为20
    "20"
    127.0.0.1:6379> zrange zset1 1 -1 ##从第二个元素开始的所有元素
    1) "bj"
    2) "hz"
    3) "cd"
    127.0.0.1:6379> zrange zset1 0 -1 withscores ##获取全部元素
    1) "sh"
    2) "20"
    3) "bj"
    4) "40"
    5) "hz"
    6) "50"
    7) "cd"
    8) "80"
    127.0.0.1:6379> zadd zset1 inf zy ##添加正无穷
    (integer) 1
    127.0.0.1:6379> zrangebyscore zset1 (50 inf withscores ## 分数大于50的元素
    1) "cd"
    2) "80"
    3) "zy"
    4) "inf"
    127.0.0.1:6379> zrangebyscore zset1 50 inf withscores limit 1 2 
    ## 分数大于等于50的元素,从第二个开始,取2个
    1) "cd"
    2) "80"
    3) "zy"
    4) "inf"
    127.0.0.1:6379> zincrby zset1 5 hz ## 给元素hz加5分
    "55" 
    127.0.0.1:6379> zrangebyscore zset1 (50 inf ## 添加成功
    1) "hz"
    2) "cd"
    3) "zy"
    127.0.0.1:6379> zrange zset1 0 -1 WITHSCORES ##查询所有元素
     1) "sh"
     2) "20"
     3) "bj"
     4) "40"
     5) "hz"
     6) "55"
     7) "cd"
     8) "80"
     9) "zy"
    10) "inf"
    127.0.0.1:6379> zcount zset1 0 inf ##获取元素个数
    (integer) 5
    127.0.0.1:6379> zcount zset1 (55 inf ##大于55元素个数
    (integer) 2
    127.0.0.1:6379> zrem zset1 zy ##删除zy
    (integer) 1
    127.0.0.1:6379> zrange zset1 0 -1 ## 剩下四个
    1) "sh"
    2) "bj"
    3) "hz"
    4) "cd"
    127.0.0.1:6379> zremrangebyrank zset1 1 2 ## 按照排名,删除第2名到第3名
    (integer) 2
    127.0.0.1:6379> zrange zset1 0 -1 ## 只剩下2个
    1) "sh"
    2) "cd"
    127.0.0.1:6379> zadd zs1 1 a 2 b 
    (integer) 2
    127.0.0.1:6379> zadd zs2 10 a 20 b
    (integer) 2
    ## zs1和zs2取交集,zs1的权重为1,zs2的权重为0.5,所以a的结果分数是1+10*0.5=6
    127.0.0.1:6379> zinterstore zs3 2 zs1 zs2 WEIGHTS 1 0.5 AGGREGATE sum
    (integer) 2
    127.0.0.1:6379> zrange zs3 0 -1 withscores
    1) "a"
    2) "6"
    3) "b"
    4) "12"

    用途

    • 排序的场景。如按照博客访问量排序文章列表。key是用户id,set中的数据是文章id,每个文章id关联一个score(访问量)。

    与列表的比较

    • 都可以获取某一范围的元素
    • 列表类型通过链表实现,获取两端数据速度快,元素增多后,访问中间数据速度较慢。所以适合“新鲜事”和“日志”一类的场景。
    • 有序集合是通过散列表和跳跃表实现的,所以读取位于中间部分的数据的速度也很快。时间复杂度O(log(N))。
    • 列表不能简单的调整某个元素的位置,有序集合可以。(修改元素的分数)

    更多关于redis基本类型和使用方法请点击下面的相关链接