Redis详解(三)redis的数据类型详解

474 阅读6分钟

一、前言

       上一篇我们详细介绍了Redis的配置文件(redis.conf)(Redis详解(二)redis配置文件),本篇将带大家重点详细介绍Redis的五大数据类型:string、hash、list、set、zset

注意:Redis的命令不区分大小写,edis的Key区分大小写。

二、string

  1. 开头说明

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

  1. 相关命令

基本命令 表格图片引用 www.cnblogs.com/xrq730/p/89…

演示

127.0.0.1:6379> set a 1  #key:a  value:1
OK
127.0.0.1:6379> get a	#获取key为a的value值
"1"
127.0.0.1:6379> mset a 2 b 3 c 4 d dd	#批量操作
OK
127.0.0.1:6379> mget a b c d
1) "2"
2) "3"
3) "4"
4) "dd"
127.0.0.1:6379> setex redis 60 redis	#key:redis  value:redis  key的有效期为60秒
OK
127.0.0.1:6379> ttl redis	#获取key:redis的有效时间(ttl命令是返回key的剩余过期时间,单位为秒)
(integer) 55
127.0.0.1:6379> setnx a aa	#因为key:a已经存在所以返回0表示操作失败。
(integer) 0
127.0.0.1:6379> setnx aa aa	#因为key:aa不存在所以操作成此时key:aa的value值为 aa
(integer) 1
127.0.0.1:6379> 

要点

  • ttl 命令是返回 key 的剩余过期时间,单位为秒。

  • mset和mget这种批量处理命令,能够极大的提高操作效率。因为一次命令执行所需要的时间=1次网络传输时间+1次命令执行时间,n个命令耗时=n次网络传输时间+n次命令执行时间,而批量处理命令会将n次网络时间缩减为1次网络时间,也就是1次网络传输时间+n次命令处理时间。但是需要注意的是,Redis是单线程的,如果一次批量处理命令过多,会造成Redis阻塞或网络拥塞(传输数据量大)。

  • setnx可以用于实现分布式锁,之后会详细介绍。

string自增自减命令

演示

127.0.0.1:6379> set a1 1  #key:a1  value:1
OK
127.0.0.1:6379> get a1	#获取key为a1的value值
"1"
127.0.0.1:6379> incr a1 #key:a1 自增并返回自增后的value值:2
(integer) 2
127.0.0.1:6379> decr a1	#key:a1 自减并返回自减后的value值:1
(integer) 1
127.0.0.1:6379> incrby a1 3	#key:a1 增加3并返回增量后的value值:4
(integer) 4
127.0.0.1:6379> decrby a1 2	#key:a1 减去3并返回减去后的value值:2
(integer) 2
127.0.0.1:6379> 

  1. 应用场景

    计数器,分布式锁,分布式全局唯一ID

三、hash

  1. 开头说明        hash 是一个键值对集合,是一个 string 类型的 key和 value 的映射表,key 还是key,但是value是一个键值对(key-value)。类比于 Java里面的 Map<String,Map<String,Object>> 集合。

  2. 相关命令

演示

127.0.0.1:6379> hset hash-a field1 1	#key:hash-a field:field1 value:1
(integer) 1
127.0.0.1:6379> hget hash-a field1	#获取hashkey:hash-a field:field1 的value值
"1"
127.0.0.1:6379> hset hash-a field2 qwe field3 456
(integer) 2
127.0.0.1:6379> hgetall hash-a	#获取hashkey:hash-a的所有field及value值
1) "field1"
2) "1"
3) "field2"
4) "qwe"
5) "field3"
6) "456"
127.0.0.1:6379> hvals hash-a	#获取hashkey:hash-a的所有value值
1) "1"
2) "qwe"
3) "456"
127.0.0.1:6379> hdel hash-a field1	#删除hashkey:hash-a field:field1的值
(integer) 1
127.0.0.1:6379> hexists hash-a field1	#hashkey:hash-a field:field1是否存在
(integer) 0
127.0.0.1:6379> hkeys hash-a	#获取hashkey:hash-a的所有field值
1) "field2"
2) "field3"
127.0.0.1:6379> hexists hash-a field2
(integer) 1
127.0.0.1:6379> 
  1. 应用场景

    购物车

四、list

  1. 开头说明

       list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表。list列表有两个特点:有序、可重复。

  1. 相关命令

演示

127.0.0.1:6379> lpush list-a v1 v2 v3	#列表list-a 添加v1,v2,v3三个元素
(integer) 3
127.0.0.1:6379> lpushx list-a v4	#列表list-a表头插入v4元素
(integer) 4
127.0.0.1:6379> lpop list-a	#列表list-a 移除表头元素
"v4"
127.0.0.1:6379> lrange list-a 0 -1	#返回列表指定区间的元素(闭区间)
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> lindex list-a 0	#列表list-a下标0的元素
"v3"
127.0.0.1:6379> linsert list-a before v3 v4	#列表list-a v3元素前插入v4元素
(integer) 4
127.0.0.1:6379> lindex list-a 0
"v4"
127.0.0.1:6379> linsert list-a after v3 v4	#列表list-a v3元素后插入v4元素
(integer) 5
127.0.0.1:6379> lindex list-a 2
"v4"
127.0.0.1:6379> llen list-a	#返回列表list-a的长度
(integer) 5
127.0.0.1:6379> rpop list-a	#移除列表list-a的尾元素
"v1"

要点

       List还有BLPOP、BRPOP、BRPOPLPUSH三个命令没有说,它们是几个POP的阻塞版本,即没有数据可以弹出的时候将阻塞客户端直到超时或者发现有可以弹出的元素为止。

  1. 应用场景

    栈、队列等

五、set

  1. 开头说明

       Redis 的 set 是 string 类型的无序集合。相对于列表,set集合也有两个特点:无序、不可重复。

  1. 相关命令

演示

127.0.0.1:6379> sadd set1 1 2 3	#setkey:set1 集合中添加1,2,3元素
(integer) 3
127.0.0.1:6379> sadd set2 3 4 5
(integer) 3
127.0.0.1:6379> scard set1	#返回setkey:set1集合中的元素数量
(integer) 3
127.0.0.1:6379> sdiff set1 set2	#返回setkey:set1集合中setkey:set2集合中不存在的元素
1) "1"
2) "2"
127.0.0.1:6379> sadd set3 1 2 3
(integer) 3
127.0.0.1:6379> sdiff set1 set2 set3
(empty array)
127.0.0.1:6379> sdiffstore set3 set1 set2 #返回setkey:set1集合中setkey:set2集合中不存在的元素并保存到setkey:set3集合中
(integer) 2
127.0.0.1:6379> sdiff set1 set3
1) "3"
127.0.0.1:6379> sismember set1 1	#元素1是否为setkey:set1集合中的元素
(integer) 1
127.0.0.1:6379> smembers set1	#返回setkey:set1集合中所有的元素
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> spop set1	#随机从setkey:set1集合中移除并返回一个元素
"1"
127.0.0.1:6379> srandmember set1	#随机从setkey:set1集合中返回一个元素(不删除元素)
"2"
127.0.0.1:6379> sunion set1 set2 #setkey:set1,set2集合的并集
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> 

  1. 应用场景

    抽奖,利用集合的交并集特性,比如在社交领域,我们可以很方便的求出多个用户的共同好友,黑白名单。

六、zset

  1. 开头说明

       zset(sorted set 有序集合),和上面的set 数据类型一样,也是 string 类型元素的集合,但是它是有序的。

  1. 相关命令

演示

127.0.0.1:6379> zadd zadd-1 1 a 2 b 3 c 4 d	
(integer) 4
127.0.0.1:6379> zcard zadd-1	#zsetkey:zadd-1 集合元素个数
(integer) 4
127.0.0.1:6379> zcount zadd-1 1 2	#返回zsetkey:zadd-1 集合中score值在1-2之间的元素
(integer) 2
127.0.0.1:6379> zrange zadd-1 0 -1	#返回zsetkey:zadd-1 集合在0到-1(倒数最后一个元素)区间的元素(按照score值从小到大排列)
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> zrange zadd-1 0 -1 withscores	#同上会返回score值
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
127.0.0.1:6379> zrevrange zadd-1 0 -1	#同上 倒序排列
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> zrank zadd-1 a	#zsetkey:zadd-1集合中元素a的下标(按score值从小到大排列)
(integer) 0
127.0.0.1:6379> zrevrank zadd-1 a	#同上 倒序排列的小标值
(integer) 3
127.0.0.1:6379> zrem zadd-1 d	#移除d元素
(integer) 1
127.0.0.1:6379> zremrangebyrank zadd-1 0 0	#	按照下标区间删除元素
(integer) 0
127.0.0.1:6379> zremrangebyscore zadd-1 0 2	#	按照score值区间删除元素
(integer) 1
127.0.0.1:6379>

  1. 应用场景

    延时队列,排行榜

七、key命令



有一种境界叫自黑:聪明绝顶的我再没用过梳子。

关注微信公众号‘秃顶记’,聪明绝顶走到黑。