Redis五种基本类型

redis官网https://redis.io/commands可以找到所有的操作命令

Redis五种基本类型

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

1、String

String (字符串)

  • string是redis最基本的类型,一 个key对应一个value。
  • string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
  • string类型是Redis最基本的数据类型,一 个redis中字符串value最多可以是512M

 

 

具体事例:
 

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> set k2 1234567
OK
127.0.0.1:6379> getrange k2 0 -1
"1234567"
127.0.0.1:6379> getrange k2 0 2
"123"
127.0.0.1:6379> setex k3 20 v3
OK
127.0.0.1:6379> ttl k3
(integer) 17
127.0.0.1:6379> ttl k3
(integer) 16
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379> ttl k3
(integer) 7
127.0.0.1:6379> get k3
(nil)
127.0.0.1:6379> ttl k3
(integer) -2
127.0.0.1:6379> setex k1 20
(error) ERR wrong number of arguments for 'setex' command
127.0.0.1:6379> setnx k4 v4
(integer) 1
127.0.0.1:6379> get k4
"v4"
127.0.0.1:6379> setnx k1 vvvv
(integer) 0
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> 
127.0.0.1:6379> setrange k2 2 x
(integer) 7
127.0.0.1:6379> get k2
"12x4567"
127.0.0.1:6379> clear
127.0.0.1:6379> mset k6 v6 k7 v7 k8 v8
OK
127.0.0.1:6379> mget k6 k7 k8
1) "v6"
2) "v7"
3) "v8"
127.0.0.1:6379> msetnx k8 v8 k9 v9
(integer) 0
127.0.0.1:6379> get k9
(nil)
127.0.0.1:6379> msetnx k9 v9 k10 v10
(integer) 1
127.0.0.1:6379> mget k9 k10
1) "v9"
2) "v10"
127.0.0.1:6379> psetex k11 1000 v11
OK
127.0.0.1:6379> get v11
(nil)
127.0.0.1:6379> get k11
(nil)
127.0.0.1:6379> set k12 12
OK
127.0.0.1:6379> incr k12
(integer) 13
127.0.0.1:6379> incr k12
(integer) 14
127.0.0.1:6379> incr k12
(integer) 15
127.0.0.1:6379> incrby k12 5
(integer) 20
127.0.0.1:6379> incrby k12 5
(integer) 25
127.0.0.1:6379> set key 19.2
OK
127.0.0.1:6379> incrbyfloat key 10
"29.2"
127.0.0.1:6379> incrbyfloat key 10
"39.2"
127.0.0.1:6379> decr k12
(integer) 24
127.0.0.1:6379> decr k12
(integer) 23

127.0.0.1:6379> clear
127.0.0.1:6379> decrby k12 2
(integer) 21
127.0.0.1:6379> decrby k12 2
(integer) 19
127.0.0.1:6379> append k2 hhhhh
(integer) 12
127.0.0.1:6379> get k2
"12x4567hhhhh"
127.0.0.1:6379> setrange k2 2 ppppp
(integer) 12
127.0.0.1:6379> get k2
"12ppppphhhhh"
127.0.0.1:6379> 

//给k1设置过期时间,前面setex是创建时设置过期时间
127.0.0.1:6379> expire k1 20
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 16
127.0.0.1:6379> ttl k1
(integer) 15
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> ttl k1
(integer) 1
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> 


2、Hash

Hash (哈希)            

  • Redis hash是一个键值对集合。(例如:Student.name = xiaoming ,Student.age = 18 Student.gender = man)
  • Redis hash是一个string类型的field和value的映射表, hash特别适合用于存储对象。(例如:Student.name = xiaoming ,Student.age = 18 Student.gender = man)
  • 类似Java里面的Map<String,Object>
127.0.0.1:6379[1]> hset student name xiaoming
(integer) 1
127.0.0.1:6379[1]> hget student name
"xiaoming"
127.0.0.1:6379[1]> hmset student age 18 gender man
OK
127.0.0.1:6379[1]> hget student name
"xiaoming"
127.0.0.1:6379[1]> hget student age
"18"
127.0.0.1:6379[1]> hmget student name age gender
1) "xiaoming"
2) "18"
3) "man"
127.0.0.1:6379[1]> hlen student
(integer) 3
127.0.0.1:6379[1]> hkeys student
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379[1]> hexists student age
(integer) 1
127.0.0.1:6379[1]> hgetall student
1) "name"
2) "xiaoming"
3) "age"
4) "18"
5) "gender"
6) "man"
127.0.0.1:6379[1]> hincrby student age 2
(integer) 20
127.0.0.1:6379[1]> hincrby student age 2
(integer) 22
127.0.0.1:6379[1]> hset student english 98.5
(integer) 1
127.0.0.1:6379[1]> hincrbyfloat student english 1.0
"99.5"
127.0.0.1:6379[1]> hincrbyfloat student english 1.1
"100.6"
127.0.0.1:6379[1]> hsetnx student age 90
(integer) 0
127.0.0.1:6379[1]> hget student age
"22"
127.0.0.1:6379[1]> clear
127.0.0.1:6379[1]> hvals student
1) "xiaoming"
2) "22"
3) "man"
4) "100.6"
127.0.0.1:6379[1]> hdel student age
(integer) 1
127.0.0.1:6379[1]> hget student age
(nil)
127.0.0.1:6379[1]> 

3、List

  • Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
  • 它的底层实际是个链表
序号命令及描述
1BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2BRPOP key1 [key2 ] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
3BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4LINDEX key index
通过索引获取列表中的元素
5LINSERT key BEFORE|AFTER pivot value
在列表的元素前或者后插入元素
6LLEN key
获取列表长度
7LPOP key
移出并获取列表的第一个元素
8LPUSH key value1 [value2]
将一个或多个值插入到列表头部
9LPUSHX key value
将一个值插入到已存在的列表头部
10LRANGE key start stop
获取列表指定范围内的元素
11LREM key count value
移除列表元素
12LSET key index value
通过索引设置列表元素的值
13LTRIM key start stop
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
14RPOP key
移除列表的最后一个元素,返回值为移除的元素。
15RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
16RPUSH key value1 [value2]
在列表中添加一个或多个值
17RPUSHX key value
为已存在的列表添加值
127.0.0.1:6379[2]> lpush list01 1 2 3 4 5
(integer) 5
127.0.0.1:6379[2]> LRANGE list01 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379[2]> rpush list02 1 2 3 4 5
(integer) 5
127.0.0.1:6379[2]> LRANGE list02 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379[2]> LPOP list01
"5"
127.0.0.1:6379[2]> LPOP list02
"1"
127.0.0.1:6379[2]> RPOP list01
"1"
127.0.0.1:6379[2]> RPOP list02
"5"
127.0.0.1:6379[2]> LRANGE list01 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379[2]> LRANGE list02 0 -1
1) "2"
2) "3"
3) "4"
127.0.0.1:6379[2]> LINDEX list01 2
"2"
127.0.0.1:6379[2]> LLEN list01
(integer) 3
127.0.0.1:6379[2]> LPUSH list03 1 1 1 1  1 1 1 
(integer) 7
127.0.0.1:6379[2]> LREM list03 3 1    //删除三个1
(integer) 3
127.0.0.1:6379[2]> LRANGE list03 0 -1
1) "1"
2) "1"
3) "1"
4) "1"
127.0.0.1:6379[2]> RPUSH list04 0 1 2 3 4 5 6 7 8
(integer) 9
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
9) "8"
127.0.0.1:6379[2]> LTRIM list04 3 5   //截取3至5的数据
OK
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "4"
3) "5"
127.0.0.1:6379[2]>                     
127.0.0.1:6379[2]> LPUSH list05 1 2 3
(integer) 3
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "4"
3) "5"
127.0.0.1:6379[2]> LRANGE list05 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379[2]> RPOPLPUSH list04 list05
"5"
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "4"
127.0.0.1:6379[2]> LRANGE list05 0 -1
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379[2]> 

127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "4"
127.0.0.1:6379[2]> lset list04 1 x
OK
127.0.0.1:6379[2]> LRANGE list04 0 -1
1) "3"
2) "x"
127.0.0.1:6379[2]> 
127.0.0.1:6379[2]> LRANGE list05 0 -1
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379[2]> LINSERT list05 before 3 java
(integer) 5
127.0.0.1:6379[2]> LINSERT list05 after 3 mysql
(integer) 6
127.0.0.1:6379[2]> LRANGE list05 0 -1
1) "5"
2) "java"
3) "3"
4) "mysql"
5) "2"
6) "1"
127.0.0.1:6379[2]> 

性能总结:

  • 它是一个字符串链表,left、 right都可以插入添加;
  • 如果键不存在,创建新的链表;
  • 如果键己存在,新增内容;
  • 如果值全移除,对应的键也就消失了。
  • 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。

4、Set

  • Redis的Set是string类型的无序集合。它是通过HashTable实现的
  • 转载于:https://www.runoob.com/redis/redis-sets.html
  • 集合成员是唯一的,这就意味着集合中不能出现重复的数据。和上面说的list很接近,但是需要保证唯一
  • Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
  • 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
序号命令及描述
1SADD key member1 [member2]
向集合添加一个或多个成员
2SCARD key
获取集合的成员数
3SDIFF key1 [key2]
返回第一个集合与其他集合之间的差异。
4SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中
5SINTER key1 [key2]
返回给定所有集合的交集
6SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
7SISMEMBER key member
判断 member 元素是否是集合 key 的成员
8SMEMBERS key
返回集合中的所有成员
9SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
10SPOP key
移除并返回集合中的一个随机元素
11SRANDMEMBER key [count]
返回集合中一个或多个随机数
12SREM key member1 [member2]
移除集合中一个或多个成员
13SUNION key1 [key2]
返回所有给定集合的并集
14SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
15SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
127.0.0.1:6379[3]> sadd set01 1 1 2 2 3 3
(integer) 3
(0.58s)
127.0.0.1:6379[3]> smembers set01
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[3]> sismember set01 1
(integer) 1
127.0.0.1:6379[3]> sismember set01 x
(integer) 0
127.0.0.1:6379[3]> scard set01
(integer) 3
127.0.0.1:6379[3]> srem set01 1
(integer) 1
127.0.0.1:6379[3]> smembers set01
1) "2"
2) "3"
127.0.0.1:6379[3]> sadd set02 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379[3]> srandmember 3
(nil)
127.0.0.1:6379[3]> srandmember set02 3
1) "6"
2) "3"
3) "2"
127.0.0.1:6379[3]> srandmember set02 3
1) "6"
2) "3"
3) "9"
127.0.0.1:6379[3]> srandmember set02 3
1) "5"
2) "8"
3) "7"
127.0.0.1:6379[3]> spop set02 2
1) "9"
2) "6"
127.0.0.1:6379[3]> smembers set02
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
7) "8"
127.0.0.1:6379[3]> 
127.0.0.1:6379[3]> sadd set03 x y z
(integer) 3
127.0.0.1:6379[3]> sadd set04 1 2 3
(integer) 3
127.0.0.1:6379[3]> smove set03 set02 x
(integer) 1
127.0.0.1:6379[3]> smembers set03
1) "y"
2) "z"
127.0.0.1:6379[3]> smembers set04
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[3]> 
127.0.0.1:6379[3]> sadd set5 1 2 3 4 5
(integer) 5
127.0.0.1:6379[3]> sadd set6 1 2 3 a b
(integer) 5
127.0.0.1:6379[3]> sdiff set5 set6
1) "4"
2) "5"
127.0.0.1:6379[3]> sinter set5 set6
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[3]> sunion set5 set6
1) "a"
2) "1"
3) "b"
4) "3"
5) "5"
6) "4"
7) "2"
127.0.0.1:6379[3]> 

5、zset(sorted set: 有序集合)

 

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

在set基础上,加一个score值之前set是k1 v1 v2 v3 现在zset是k1 score1 v1 score2 v2

127.0.0.1:6379[3]> zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
(integer) 5
127.0.0.1:6379[3]> zrange zset01 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379[3]> zrange zset01 0 -1 withscores
 1) "v1"
 2) "60"
 3) "v2"
 4) "70"
 5) "v3"
 6) "80"
 7) "v4"
 8) "90"
 9) "v5"
10) "100"
127.0.0.1:6379[3]> zrangebyscore zset01 60 90
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379[3]> zrangebyscore zset01 60 (90
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379[3]> zrangebyscore zset01 (60 90
1) "v2"
2) "v3"
3) "v4"
127.0.0.1:6379[3]> zrangebyscore zset01 (60 (90
1) "v2"
2) "v3"
127.0.0.1:6379[3]> zrangebyscore zset01 60 90 limit 2
(error) ERR syntax error
127.0.0.1:6379[3]> zrangebyscore zset01 60 90 limit 2 2
1) "v3"
2) "v4"
127.0.0.1:6379[3]> 
127.0.0.1:6379[3]> zrem zset01 v5
(integer) 1
127.0.0.1:6379[3]> zrange zset01 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379[3]> zcard zset01
(integer) 4
127.0.0.1:6379[3]> zcount zset01 60 80
(integer) 3
127.0.0.1:6379[3]> zrank zset01 v4
(integer) 3
127.0.0.1:6379[3]> zscore zset01  v4
"90"
127.0.0.1:6379[3]> zrevrank zset01 v4
(integer) 0
127.0.0.1:6379[3]> zrevrange zset01 0 -1   //带有re是逆序的意思
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379[3]> zrevrangebyscore zset01 90 60
1) "v4"
2) "v3"
3) "v2"
4) "v1"

 

 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值