Redis的五大数据类型的基本使用

239 阅读12分钟

五大数据类型

在redis中无论什么数据类型,在数据库中都是以key-value形式保存,通过进行对Redis-key的操作,来完成对数据库中数据的操作。

Redis的全部官方命令

下面只是一些常见的命令

String(字符串)

  • set key value(设置name字段的值为wulei)
127.0.0.1:6379> set name wulei
OK
  • get key 得到name字段的值
127.0.0.1:6379> get name
"wulei"
  • exists key 判断key是否存在,存在返回1,不存在返回0
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> exists name2
(integer) 0
  • del key 删除key
  • move key [0~15] 移动key到指定的数据库
  • type key 查看key的数据类型
127.0.0.1:6379> type name
string
  • expire key second 设置字段的作用时间(多久会失效)
  • ttl key 查看字段的有效时间
127.0.0.1:6379> expire name 30  # 设置name字段的有效期为30秒
(integer) 1 
127.0.0.1:6379> ttl name  # 查看name还有多久失效  如果还没失效会返回正常的有效时间
(integer) 21
127.0.0.1:6379> ttl name
(integer) 16
127.0.0.1:6379> ttl name
(integer) 11
127.0.0.1:6379> ttl name
(integer) 4
127.0.0.1:6379> ttl name  # 现在name已经失效,返回-2
(integer) -2
127.0.0.1:6379> get name  # 再次get name  返回空,说明name字段已经被自动删除
(nil)
127.0.0.1:6379> set age 3 # 加一个字段age不设置有效时间
OK
127.0.0.1:6379> ttl age  # 用ttl age 会返回 -1
(integer) -1
  • rename key newkey 字段重命名
  • renamenx key newkey 当newkey不存在的时候重命名成功,否则失败
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> rename age newage
OK
127.0.0.1:6379> renamenx newage newage2
(integer) 1
127.0.0.1:6379> keys *
1) "newage2"
  • APPEND key value 向指定的key的value后追加字符串
127.0.0.1:6379> set string hello
OK
127.0.0.1:6379> append string ,wulei
(integer) 11
127.0.0.1:6379> get string
"hello,wulei"
  • DECR/INCR key 将指定key的value数值进行+1/-1的原子递增
127.0.0.1:6379> set count 0
OK
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> incr count
(integer) 2
127.0.0.1:6379> get count
"2"
127.0.0.1:6379> decr count
(integer) 1
127.0.0.1:6379> decr count
(integer) 0
127.0.0.1:6379> decr count
(integer) -1
127.0.0.1:6379> get count
"-1"
  • INCRBY/DECRBY key num 按指定的步长对数值进行加减
127.0.0.1:6379> incrby count 10
(integer) 10
127.0.0.1:6379> incrby count 10
(integer) 20
127.0.0.1:6379> get count
"20"
127.0.0.1:6379> decrby count 20
(integer) 0
127.0.0.1:6379> get count
"0"
  • STRLEN key 查看key保存值的长度
127.0.0.1:6379> set string abcdefg
OK
127.0.0.1:6379> strlen string
(integer) 7
  • GETRANGE key start end 按起止位置获取字符串[start,end]
127.0.0.1:6379> getrange string 0 3
"abcd"
  • SETRANGE key offset value 用指定的value 替换key中 offset开始的值
127.0.0.1:6379> setrange string 1 xxx
(integer) 7
127.0.0.1:6379> get string
"axxxefg"
  • GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
127.0.0.1:6379> getset string xxxxxx   
"axxxefg"
127.0.0.1:6379> get string
"xxxxxx"
  • SETNX key value 仅当key不存在时进行set
127.0.0.1:6379> set name wl   #name:wl
OK
127.0.0.1:6379> setnx name zhangsan   #在name已经存在的情况下用setnx设置name的值失败返回0
(integer) 0
127.0.0.1:6379> get name
"wl"
127.0.0.1:6379> setnx name2 lishi
(integer) 1
127.0.0.1:6379> get name2
"lishi"
  • SETEX key seconds value 创建一个键值对并设置它的有效期(秒)
127.0.0.1:6379> setex name3 20 wl
OK
127.0.0.1:6379> get name3
"wl"
127.0.0.1:6379> ttl name3
(integer) 11
127.0.0.1:6379> keys *
1) "name2"
2) "name3"
3) "name"
4) "count"
5) "string"
127.0.0.1:6379> keys *
1) "name2"
2) "name"
3) "count"
4) "string"
  • MSET(MGET) key1 value1 [key2 value2..] 批量设置(获取)键值对
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
  • MSETNX key1 value1 [key2 value2..] 批量设置键值对,仅当参数中所有的key都不存在时执行(有一个失败就全部失败)
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> msetnx k1 v1 k2 v2 k3 v3
(integer) 0
127.0.0.1:6379> keys *
1) "k1"
  • 最常用的习惯性写法之一
127.0.0.1:6379> msetnx user:1:name zhangsan user:1:age 3
(integer) 1
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "3"
127.0.0.1:6379> keys *
1) "user:1:name"
2) "user:1:age"

List(列表)

Redis里面的list与java的list有一点点相同,常用的也是push和pop命令,只是redis的list可以在两头添加或者移除元素,常用的命令也不多

  • LPUSH/RPUSH key value1[value2..] 在左边或者右边push一个或者多个值,那个key就是一个list
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list one   #新建一个list名为list并在左边push一个value
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1   #查看list的全部数据
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> RPUSH list2 one
(integer) 1
127.0.0.1:6379> RPUSH list2 two
(integer) 2
127.0.0.1:6379> RPUSH list2 three
(integer) 3
127.0.0.1:6379> LRANGE list2 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> LPUSH list3 1 2 3 4  #批量push
(integer) 4
127.0.0.1:6379> LRANGE list3 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
  • LRANGE key start end 获取list[start,end]的元素
  • LINSERT key BEFORE|AFTER pivot value 在指定元素的前面或者后面插入元素
127.0.0.1:6379> LRANGE list 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> LINSERT list before one xxx
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "four"
2) "three"
3) "two"
4) "xxx"
5) "one"
127.0.0.1:6379> LINSERT list after four cccc
(integer) 6
127.0.0.1:6379> LRANGE list 0 -1
1) "four"
2) "cccc"
3) "three"
4) "two"
5) "xxx"
6) "one"
  • LLEN key 查看list的长度
  • LINDEX key index 通过索引获取list的元素
127.0.0.1:6379> LINDEX list 0
"four"
  • LSET key index value 根据索引更新元素的值
127.0.0.1:6379> Lrange list 0 -1
1) "four"
2) "cccc"
3) "three"
4) "two"
5) "xxx"
6) "one"
127.0.0.1:6379> LSET list 0 vvv
OK
127.0.0.1:6379> Lrange list 0 -1
1) "vvv"
2) "cccc"
3) "three"
4) "two"
5) "xxx"
6) "one"
  • LPOP/RPOP key 移除list左边或者右边的元素
  • RPOPLPUSH source destination 移除source列表的右边的元素并添加到到destination列表的第一个元素
127.0.0.1:6379> RPOPLPUSH list list2
"one"
127.0.0.1:6379> LRANGE list 0 -1
1) "vvv"
2) "cccc"
3) "three"
4) "two"
5) "xxx"
127.0.0.1:6379> LRANGE list2 0 -1
1) "one"
  • LTRIM key start end 通过list的下标截取元素并改变原来的list
127.0.0.1:6379> LRANGE list 0 -1
1) "xxx"
2) "vvv"
3) "cccc"
4) "three"
5) "two"
127.0.0.1:6379> LTRIM list 1 3
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "vvv"
2) "cccc"
3) "three"
  • LREM key count value 移除指定数量的元素,因为list的元素是可以重复的,所以count有3种情况:
    • count > 0 从左边开始扫描指定count个value
    • count < 0 从右边开始扫描指定count个value
    • count = 0 删除全部的value
127.0.0.1:6379> LRANGE list 0 -1
1) "vvv"
2) "ddd"
3) "ccc"
4) "vvv"
5) "bbb"
6) "aaa"
7) "vvv"
127.0.0.1:6379> LREM list 1 vvv
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "ddd"
2) "ccc"
3) "vvv"
4) "bbb"
5) "aaa"
6) "vvv"
127.0.0.1:6379> LREM list -1 vvv
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "ddd"
2) "ccc"
3) "vvv"
4) "bbb"
5) "aaa"
127.0.0.1:6379> LREM list 0 vvv
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "ddd"
2) "ccc"
3) "bbb"
4) "aaa"

Set(集合)

Redis Set 是 String 的无序排列

  • SADD key member1[member2..] 向集合set中添加一个或多个不重复的元素
127.0.0.1:6379> sadd set1 1
(integer) 1
127.0.0.1:6379> sadd set1 2 3 4
(integer) 3
127.0.0.1:6379> sadd set1 4 5 6
(integer) 2
  • SCARD key 获取set集合中元素的个数
127.0.0.1:6379> scard set1
(integer) 6
  • SMEMBERS key 返回set集合中的所有元素
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
  • SISMEMBER key member 判断某个元素是否是set集合中的元素
127.0.0.1:6379> SISMEMBER set1 1
(integer) 1
127.0.0.1:6379> SISMEMBER set1 8
(integer) 0
  • SRANDMEMBER key [count] 随机返回set集合中的count个元素,默认值为1
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SRANDMEMBER set1
"4"
127.0.0.1:6379> SRANDMEMBER set1
"4"
127.0.0.1:6379> SRANDMEMBER set1
"3"
127.0.0.1:6379> SRANDMEMBER set1 3
1) "5"
2) "6"
3) "3"
  • SPOP key [count] 随机弹出并删除set集合中的count个元素,count的默认值为1
127.0.0.1:6379> spop set1
"6"
127.0.0.1:6379> spop set1 2
1) "1"
2) "3"
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "4"
3) "5"
  • SMOVE source destination member 将source集合的元素member移动到destination集和中
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "4"
3) "5"
127.0.0.1:6379> SMOVE set1 set2 2
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "2"
  • SREM key member1[member2..] 移除指定的一个或多个元素
127.0.0.1:6379> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> srem set1 1
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"
3) "4"
4) "5"
  • SDIFF key1[key2..] 获得两个集合的差集
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> sadd set1 a b c d
(integer) 4
127.0.0.1:6379> sadd set2 b c e f
(integer) 4
127.0.0.1:6379> sdiff set1 set2
1) "a"
2) "d"
  • SDIFFSTORE destination key1[key2..] 将key1和key2...的差集保存在destination集合中,destination原有的数据会被删除,只保留差集的结果
127.0.0.1:6379> SMEMBERS set1
1) "c"
2) "a"
3) "d"
4) "b"
127.0.0.1:6379> SMEMBERS set2
1) "f"
2) "c"
3) "e"
4) "b"
127.0.0.1:6379> sadd set3 g
(integer) 1
127.0.0.1:6379> SDIFFSTORE set3 set1 set2
(integer) 2
127.0.0.1:6379> SMEMBERS set3
1) "a"
2) "d"
  • SINTER key1 [key2..] 交集
127.0.0.1:6379> SINTER set1 set2
1) "c"
2) "b"
  • SINTERSTORE destination key1[key2..] 和SDIFFSTORE一样,返回的交集的结果覆盖到集合destination里面去
  • SUNION key1 [key2..] 并集
127.0.0.1:6379> sunion set1 set2
1) "c"
2) "f"
3) "a"
4) "d"
5) "b"
6) "e"
  • SUNIONSTORE destination key1 [key2..] 取得多个集合并集的结果覆盖到destination集合中

Hash(哈希)

Hash与String的命令大多相似 Hash的存储结构为:key-map

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。重复设置同一个field会覆盖,返回0
127.0.0.1:6379> hset myhash name zhangsan
(integer) 1
127.0.0.1:6379> hset myhash name zhangsan
(integer) 0
  • HMSET key field1 value1 [field2 value2..] 和String一样,同时设置多个字段的值
127.0.0.1:6379> hmset myhash age 3 sex 1
OK
  • HSETNX key field value 当field不存在的时候才会添加成功
127.0.0.1:6379> hsetnx myhash name lishi  #name已经存在了
(integer) 0
  • HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
127.0.0.1:6379> hexists myhash name
(integer) 1
  • HGET key field value 获取存储在哈希表中指定字段的值
127.0.0.1:6379> hget myhash name
"zhangsan"
  • HMGET key field1 [field2..] 获取存储在哈希表中多个指定字段的值
  • HGETALL key 获取在哈希表key 的所有字段和值
127.0.0.1:6379> hgetall myhash
1) "name"
2) "zhangsan"
3) "age"
4) "3"
5) "sex"
6) "1"
  • HKEYS key 获取哈希表key中所有的字段
  • HVALS key 获取哈希表中所有值
  • HLEN key 获取哈希表中字段的数量
  • HDEL key field1 [field2..] 删除哈希表key中一个/多个field字段
127.0.0.1:6379> hdel myhash age sex
(integer) 2
  • HINCRBY key field n 和String一样这个数值加n
127.0.0.1:6379> hset myhash num 5
(integer) 1
127.0.0.1:6379> hincrby myhash num 5
(integer) 10
127.0.0.1:6379> hincrby myhash num -5
(integer) 5

ZSet(有序集合)

ZSet 和Set差不多,不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

  • ZADD key score member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的值
127.0.0.1:6379> Zadd myset 2000 zhangsan 500 lishi 1000 wangwu
(integer) 3
  • ZCARD key 查看有序集合中的元素数量
127.0.0.1:6379> zcard myset
(integer) 3
  • ZCOUNT key min max 返回有序集合中指定区间score的成员数
127.0.0.1:6379> zcount myset 500 1000
(integer) 2
  • ZINCRBY key n member 有序集合中对指定成员的分数加上增量 n
127.0.0.1:6379> ZINCRBY myset 100 lishi
"600"
  • ZSCORE key member 返回有序集中,指定元素的分数值
127.0.0.1:6379> ZSCORE myset lishi
"600"
  • ZRANK key member 返回有序集合中指定成员的索引
127.0.0.1:6379> ZRANK myset zhangsan
(integer) 2
  • ZRANGE key start end 根据索引区间查看元素
127.0.0.1:6379> ZRANGE myset 0 -1 withscores #返回全部的元素并带上他们的数值
1) "lishi"
2) "600"
3) "wangwu"
4) "1000"
5) "zhangsan"
6) "2000"
  • ZRANGEBYLEX key min max 返回指定成员区间内的成员,按成员字典正序排序, 分数必须相同
127.0.0.1:6379> ZRANGEBYLEX myset - + 
1) "lishi"
2) "wangwu"
3) "zhangsan
  • ZRANGEBYSCORE key min max 通过分数返回有序集合指定区间内的成员 -inf 和 +inf分别表示最小最大值
127.0.0.1:6379> ZRANGEBYSCORE myset 500 2000 #返回500-2000的成员,升序
1) "lishi"
2) "wangwu"
3) "zhangsan"
127.0.0.1:6379> ZRANGEBYSCORE myset 500 2000 withscores #带上他们的分数
1) "lishi"
2) "600"
3) "wangwu"
4) "1000"
5) "zhangsan"
6) "2000"
127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf  #升序的另外一种写法
1) "lishi"
2) "wangwu"
3) "zhangsan"
  • ZREM key member1 [member2..] 移除一个或多个成员
127.0.0.1:6379> ZREM myset zhangsan
(integer) 1
127.0.0.1:6379> ZRANGE myset 0 -1
1) "lishi"
2) "wangwu"
  • ZREMRANGEBYLEX key - + 删除所有的成员
  • ZREMRANGEBYRANK key start stop 在升序好了的数据根据下标的索引区间删除数据
  • ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
  • ZREVRANGE key start end 返回有序集中指定区间内的成员,通过索引,分数从高到底
127.0.0.1:6379> ZREVRANGE myset 0 -1
1) "wangwu"
2) "zhangsan"
3) "lishi"
4) "xiaohong"
5) "jon"
127.0.0.1:6379> ZREVRANGE myset 0 -1 withscores
 1) "wangwu"
 2) "6000"
 3) "zhangsan"
 4) "1500"
 5) "lishi"
 6) "1000"
 7) "xiaohong"
 8) "500"
 9) "jon"
10) "300"
  • ZREVRANGEBYSCORRE key max min 根据给定的scores的区间的值按照降序排序
127.0.0.1:6379> ZREVRANGEBYSCORE myset 6000 500 withscores
1) "wangwu"
2) "6000"
3) "zhangsan"
4) "1500"
5) "lishi"
6) "1000"
7) "xiaohong"
8) "500"
  • ZREVRANK key member 返回降序后的指定成员的下标索引

小结

String的基本命令:

  • set key value set一个key-value
  • get key get一个key
  • MSET key1 value1 [key2 value2..] 批量set多个key-value
  • MGET key1 [key2..] 批量获得多个key的value
  • DEL key 删除key

List的基本命令

  • LPUSH/RPUSH key value1[value2..] 在左边/右边push一个值
  • LRANGE key start end LRANGE key 0 -1 根据索引获取所有的值
  • LPOP/RPOP key 从最左边/最右边移除值 并返回

Set的基本命令

  • SADD key member1[member2..] 向集合中无序增加一个/多个成员
  • SCARD key 获取集合的成员数
  • SMEMBERS key 返回集合中所有的成员
  • SREM key member1[member2..] 移除集合中一个/多个成员
  • SDIFF key1[key2..] 差集
  • SINTER key1 [key2..] 交集
  • SUNION key1 [key2..] 并集

Hash的基本命令

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value
  • HMSET key field1 value1 [field2 value2..] 同时将多个 field-value (域-值)对设置到哈希表 key 中
  • HGET key field value 获取存储在哈希表中指定字段的值
  • HMGET key field1 [field2..] 获取所有给定字段的值
  • HDEL key field1 [field2..] 删除哈希表key中一个/多个field字段

ZSet的基本命令

  • ZADD key score member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
  • ZCOUNT key min max 计算在有序集合中指定区间score的成员数
  • ZSCORE key member 返回有序集中,指定成员的分数值
  • ZRANGE key start end 通过索引区间返回有序集合成指定区间内的成员,升序
  • ZRANGEBYSCORE key min max 通过分数返回有序集合指定区间内的成员,升序
  • ZREVRANGE key start end 返回有序集中指定区间内的成员,通过索引,分数从高到底
  • ZREM key member1 [member2..] 移除有序集合中一个/多个成员
  • ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员