Redis基础之五大数据类型理论解释+过程代码(string、list、hash、set、sorted set)

Redis五大数据类型

一、String数据类型

简介

String是redis是基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等

redis-cli -h 192.168.171.7 -p 6379 
#进入到redis命令操作模式

1.SET、GET、APPEND、STRLEN:

192.168.171.7:6379> exists mykey   #判断该键是否存在,存在返回1,否则返回0;
(integer) 0

192.168.171.7:6379> append mykey "hello"    #该键并不存在,因此append命令返回当前value的长度,并创建好这个键;
(integer) 5

192.168.171.7:6379> append mykey " world"   #该键已经存在,因此返回与之前的value长度相加(空格也算一个字符);
(integer) 11

192.168.171.7:6379> append mykey " hhhhh"
(integer) 17

192.168.171.7:6379> get mykey     #通过get命令获取该键,以判断append的结果;
"hello world hhhhh"

192.168.171.7:6379> set mykey "this is a test"  #通过set命令为键设置新值,并覆盖原有值。
OK

192.168.171.7:6379> get mykey    #查看
"this is a test"

192.168.171.7:6379> strlen mykey   #获取指定key的字符长度
(integer) 14

2.INCR、DECR、INCRBY、DECRBY:(增加与减少)

192.168.171.7:6379> set mykey 20   #设置key的值为20
OK

192.168.171.7:6379> incr mykey     #该key的值递增1
(integer) 21

192.168.171.7:6379> decr mykey		#该key的值递减1
(integer) 20

192.168.171.7:6379> del mykey		#删除已有键
(integer) 1

192.168.171.7:6379> decr mykey      #对空值执行递减操作,其原值被设定为0,递减后的值为-1
(integer) -1

192.168.171.7:6379> del mykey     #再删除
(integer) 1

192.168.171.7:6379> incr mykey       #对空值执行递增操作,其原值被设定为0,递增后的值为1
(integer) 1

192.168.171.7:6379> set mykey hello  #先将该键的value设置为除了数字之外的字符串
OK

192.168.171.7:6379> incr mykey		#试着递减,发现错误,因为不是数字
(error) ERR value is not an integer or out of range

192.168.171.7:6379> set mykey 10     #设置值为10
OK

192.168.171.7:6379> decrby mykey 5    减少指定的整数也就是5
(integer) 5

192.168.171.7:6379> incrby mykey 10   增加指定的指数也就是10
(integer) 15

mark

3.GETSET:

192.168.171.7:6379> incr k1    #将计算器的值原子性的递增1
(integer) 1

192.168.171.7:6379> getset k1 0  #在获取计算器原有值的同时,并将其设置为新值,这两个操作原子性的同时完成
"1"

192.168.171.7:6379> get k1		#查看设置后的结果
"0"

4.SETEX:

192.168.171.7:6379> setex mykey 15 "hello"   #设置指定key的过期时间为10秒
OK

192.168.171.7:6379> ttl mykey       #通过ttl命令查看一下指定key的剩余存活时间(秒数),-2表示已经过期,-1表示永不过期
(integer) 10

192.168.171.7:6379> get mykey      #在该键的存活期间内我们仍然可以获取到它的Value
"hello"

192.168.171.7:6379> ttl mykey      #过一会再次用ttl命令查看,为-2了,表示过期
(integer) -2

192.168.171.7:6379> get mykey      #获取已过期的key,编程nil了,也就是不存在了
(nil)

mark

5.SETNX:

192.168.171.7:6379> del mykey      #删除该键,便于下方测试
(integer) 0

192.168.171.7:6379> setnx mykey "hello"    #该键并不存在,因此setnx命令执行成功
(integer) 1

192.168.171.7:6379> setnx mykey "world"     #该键已存在,但是设置没有产生任何效果
(integer) 0

192.168.171.7:6379> get mykey            #可以看到值没有被覆盖
"hello"

6.MSET、MGET、MSETNX:

192.168.171.7:6379> mset key1 "hello" key2 "world"     #批量创建键key1和key2和相应的值
OK

192.168.171.7:6379> mget key1 key2      #批量获取也就是查看key1和key2的值
1) "hello"
2) "world"

192.168.171.7:6379> msetnx key3 "zhang" key4 "san"   
#批量设置key3和key4两个键,因为之前这两个键并不存在所以命令执行成功并返回1
(integer) 1

192.168.171.7:6379> mget key3 key4   #查看
1) "zhang"
2) "san"

192.168.171.7:6379> msetnx key3 "hello" key5 "world"
#批量设置key3和key5,但是key3已经存在,所以不管后面有没有存在,都会执行失败并返回0
(integer) 0

192.168.171.7:6379> mget key3 key5    #查看一下key3 和key5,因为key5没有设置成功所以返回了nil也就是没有key5
1) "zhang"
2) (nil)

mark

二、LIST数据类型

简介

列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素

1.LPUSH、LPUSHX、LRANGE:

192.168.171.7:6379> del mykey
(integer) 1

192.168.171.7:6379> lpush mykey a b c d			#mykey键并不存在,该命令会创建该键及其相关联的list,之后在将参数中的value从左到右以此插入;类似倒序添加
(integer) 4

192.168.171.7:6379> lrange mykey 0 2      #取从位置0开始到位置2结束的3个元素;
1) "d"
2) "c"
3) "b"

192.168.171.7:6379> lrange mykey 0 -1		#取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素;
1) "d"
2) "c"
3) "b"
4) "a"

192.168.171.7:6379> lpushx mykey2 e   		#mykey2键并不存在,所以lpushx命令将不会进行任何操作,其返回值为0;
(integer) 0

192.168.171.7:6379> lrange mykey2 0 -1		#可以看到mykey2没有关联任何list value;
(empty list or set)

192.168.171.7:6379> lpushx mykey e          #mykey键此时已经存在,所以lpushx命令插入成功,并返回链表中当前元素的数量;
(integer) 5

192.168.171.7:6379> lrange mykey 0 0     	#获取该键的list value的头部元素
1) "e"

2.LPOP、LLEN:

127.0.0.1:6003> lpop mykey
"e"
127.0.0.1:6003> lpop mykey
"d"
127.0.0.1:6003> llen mykey
(integer) 3

127.0.0.1:6001> lrange mykey 0 -1
-> Redirected to slot [14687] located at 127.0.0.1:6003
1) "c"
2) "b"
3) "a"

mark

mark

3.LREM、LEST、LINDEX、LTRIM

127.0.0.1:6379> del mykey    #删除键
(integer) 1
127.0.0.1:6379> lpush mykey a b c d b a   #创建mykey列表值从左到右,最开始的在最底下
(integer) 6
127.0.0.1:6379> lrange mykey 0 -1     #查看mykey列表所有元素
1) "a"
2) "b"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lrem mykey 2 b      #删除从头到尾2个等于b的元素
(integer) 2
127.0.0.1:6379> lrange mykey 0 -1    #查看发现两个b的元素已经被删了
1) "a"
2) "d"
3) "c"
4) "a"


127.0.0.1:6379> lset mykey 1 b     #将索引值为1的值改为b
OK
127.0.0.1:6379> lrange mykey 0 -1   #查看发现元素值为1的d被改为b了
1) "a"
2) "b"
3) "c"
4) "a"
127.0.0.1:6379> lindex mykey 3    #查看索引为3的值
"a"
127.0.0.1:6379> ltrim mykey 0 2    #只保留索引0-2的元素值
OK
127.0.0.1:6379> lrange mykey 0 -1   #查看
1) "a"
2) "b"
3) "c"

4.LINSERT

127.0.0.1:6379> lpush mykey a b c d e  #创建用于实验的列表
(integer) 5
127.0.0.1:6379> lrange mykey 0 -1    #查看所有元素
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"

127.0.0.1:6379> linsert mykey before a 0  #在a的值前面添加0
(integer) 6
127.0.0.1:6379> linsert mykey after e 1    #在e的值后面添加1
(integer) 7
127.0.0.1:6379> lrange mykey 0 -1   #查看发现成功了
1) "e"
2) "1"
3) "d"
4) "c"
5) "b"
6) "0"
7) "a"

5.RPUSH、RPUSHX

127.0.0.1:6379> rpush key1 a b c d e   #创建列表key1,从左到右以此插入表从表的末端开始,类似正向排序

(integer) 5
127.0.0.1:6379> lrange key1 0 -1    #查看所有
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpushx key1 f    #在键尾部插入元素f
(integer) 6
 
127.0.0.1:6379> rpushx key2 f    #如果此键不存在则不执行
(integer) 0

6.RPOP、RPOPLPUSH

127.0.0.1:6379> rpop key1    #移除从尾部开始第一个元素并返回该元素
"f"
127.0.0.1:6379> lrange key1 0 -1   #查看
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpoplpush key1 key2   #把key1的尾部元素移除,并且插入到key2,如果没有key2也会自动创建
"e"
127.0.0.1:6379> keys *
1) "key1"
2) "mykey"
3) "key2"
127.0.0.1:6379> lrange key2 0 -1   #查看key2的所有元素
1) "e"
127.0.0.1:6379> lrange key1 0 -1    #查看key1的所有元素
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> rpoplpush key1 key1  #假设用key1把尾部第一个元素移除并添加到key1自己身上
"d"
127.0.0.1:6379> lrange key1 0 -1     #d会跑到列表第一个
1) "d"
2) "a"
3) "b"
4) "c"

三、Hash数据类型(散列型)

简介

hash用于存储对象。可以采用这样的命名方式:对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。 如:存储 ID 为 2 的汽车对象。
如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对

1.HSET、HGET、HDEL、HEXISTS、HLEN、HSETNX

127.0.0.1:6379> hset hash field1 a field2 b field3 c   #给hash键创建字段field1值是a,字段2field2是b,字段3field3是c
(integer) 3                 
127.0.0.1:6379> hget hash field1   #获取hash键字段1的值
"a"
127.0.0.1:6379> hdel hash field2   #删除hash键的字段2,返回1成功
(integer) 1

127.0.0.1:6379> hexists hash field2    #判断hash键的字段2field2是否存在,返回0表示不存在
(integer) 0
127.0.0.1:6379> hlen hash    #获取hash字段数量,还剩下field1和field3所有只有2个
(integer) 2
127.0.0.1:6379> hsetnx hash1 field3 d    #给hash1添加新字段,只要字段不存在于此键中就可以添加,如果键不存在则会自动创建
(integer) 1

127.0.0.1:6379> keys has*    #查看所有has开头的键
1) "hash"
2) "hash1"
127.0.0.1:6379> hsetnx hash field3 d    #因为hash里已有field3所以添加失败返回0
(integer) 0

2.HINCRBY

127.0.0.1:6379> keys *   #查看所有键
1) "key1"
2) "hash"
3) "hash1"
4) "mykey"
5) "key2"
127.0.0.1:6379> hincrby hash2 field 5    #将字段5添加到hash2中
(integer) 5
127.0.0.1:6379> hincrby hash2 field -6    #将字段-6添加,会减去上面的5得到-1
(integer) -1
127.0.0.1:6379> hincrby hash2 field -8    #再减去-8会得到-9
(integer) -9
127.0.0.1:6379> keys *     #hash2是会自动创建的
1) "key1"
2) "hash2"
3) "hash"
4) "hash1"
5) "mykey"
6) "key2"

3.HMSET、HMGET、HGETALL、HKEYS、HVALS

127.0.0.1:6379> hmset hash3 field1 hello field2 world   #在hash3键里创建多个字段和值,hset也可以批量设置,新版基本用hset代替了。如果没有会自动创建hash3
OK
127.0.0.1:6379> hmget hash3 field1 field2    #获取多个字段,但是hget不能获取多个字段
1) "hello"
2) "world"
127.0.0.1:6379> hkeys hash3   #获取hash3键中所有字段名
1) "field1"
2) "field2"
127.0.0.1:6379> hvals hash3    #获取hash3中键的所有字段的值
1) "hello"
2) "world"

 
127.0.0.1:6379> hgetall hash3   #获取hash3中所有字段名和字段的值
1) "field1"
2) "hello"
3) "field2"
4) "world"


四、Set数据类型(无序集合)

简介

无序集合,元素类型为String类型,元素具有唯一性,不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算。

应用范围

  • 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
  • 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。

1.sadd、smembers、scard、sismember

127.0.0.1:6379> sadd myset a b c d e  #把多个值添加到myset中,如果没有键会自动创建
(integer) 5
127.0.0.1:6379> smembers myset    #查看添加的结果,是无序的
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
127.0.0.1:6379> scard myset     #获取键中的值数量
(integer) 5
127.0.0.1:6379> sismember myset d   #验证此值是否存在,存在为1,不存在为0
(integer) 1
127.0.0.1:6379> sismember myset g
(integer) 0

2.spop、srem、srandmember、smove

127.0.0.1:6379> spop myset    #随机移除一个值并返回此值
"c"
127.0.0.1:6379> smembers myset    #查看发现已移除
1) "a"
2) "b"
3) "e"
4) "d"
127.0.0.1:6379> srem myset a b c    #从键中移除abc是哪个值,因为a已被移除所以
(integer) 2
127.0.0.1:6379> smembers myset      
1) "e"
2) "d"
127.0.0.1:6379> srandmember myset   #随机返回一个值
"e"
127.0.0.1:6379> smembers myset      
1) "e"
2) "d"
127.0.0.1:6379> smove myset myset1 e   #将myset的值e移到myset1中
(integer) 1

127.0.0.1:6379> keys myset*     #如果没有键会自动创建
1) "myset"
2) "myset1"

五、Sorted Set数据类型(zset、有序集合)

简介

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

应用范围

  • 可以用于一个大型在线游戏的积分排行榜:
  • 每当玩家的分数发生变化时,可以执行 ZADD 命令更新玩家的分数,此后再通过 ZRANGE 命令获取积分 TOP10 的用户信息

1.zadd、zcard、zcount、zrem、zincrby、zscore、zrank

127.0.0.1:6379> zadd zset 1 a 2 b 3 c 4 d 5 e   #将一个或多个值与相应数值加入到有序集zset键里
(integer) 5
127.0.0.1:6379> zrange zset 0 -1    #查看所有值
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> zrange zset 0 -1 withscores    #查看所有值和对应的数值
 1) "a"
 2) "1"
 3) "b"
 4) "2"
 5) "c"
 6) "3"
 7) "d"
 8) "4"
 9) "e"
10) "5"
127.0.0.1:6379> zrank zset e     #获取e的位置索引
(integer) 4
127.0.0.1:6379> zcard zset      #获取zset的值总数量
(integer) 5

127.0.0.1:6379> zcount zset 2 4    #获取分数2到4的数量
(integer) 3
127.0.0.1:6379> zrem zset a b     #删除a和b并返回删的数量值
(integer) 2
127.0.0.1:6379> zcard zset        #获取全部值的数量查看是否删除成功
(integer) 3
127.0.0.1:6379> zscore zset d     #获取d的数值
"4"
127.0.0.1:6379> zincrby zset 2 a    #如果a不存在,此命令会自动添加a并加2返回此数值
"2"
127.0.0.1:6379> zincrby zset -1 a    #如果a存在则会-1,也就是2-1=1,返回1
"1"

2.zrangebyscore、zremrangebyank、zremrrangebyscore

127.0.0.1:6379> zadd zset 1 a 2 b 3 c 4 d 5 e  
(integer) 5
127.0.0.1:6379> zrangebyscore zset 2 4   #获取数值2到4的值
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> zrangebyscore zset -inf +inf limit 2 3    #-inf表示第一个值 +inf表示最后一个值,limit 2 3 表示索引为2开始的三个值,总的来说表示从索引2开始直到最后一个值
1) "c"
2) "d"
3) "e"

127.0.0.1:6379> zremrangebyscore zset 1 3    #删除数值1到3的成员并返回删除的数量
(integer) 3
127.0.0.1:6379> zrange zset 0 -1    #查看所有值
1) "d"
2) "e"

127.0.0.1:6379> zremrangebyrank zset 1 2    #删除索引1到2的成员,也就是只删除e
(integer) 1
127.0.0.1:6379> zrange zset 0 -1    #最后只剩下d
1) "d"

3.zrevrange、zrevrangebyscore、zrevrank

127.0.0.1:6379> del zset
(integer) 1
127.0.0.1:6379> zadd zset 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrange zset 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> zrevrange zset 0 -1   #将索引的大小从高到低顺序进行获取
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"

127.0.0.1:6379> zrevrank zset a    #查询a的索引,因为是反向排序,索引a的索引是4
(integer) 4
127.0.0.1:6379> zrank zset a    #正向的a索引是0
(integer) 0
127.0.0.1:6379> ZREVRANGEBYSCORE zset 5 3   #获取数值是3到5的值
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> ZREVRANGEBYSCORE zset 3 1 limit 1 2   #获取索引是1到2,数值是1到3的值
1) "b"
2) "a"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值