Redis五种数据类型

一,介绍一下
STRING
STRING是redis中最基本的数据类型,redis中的STRING类型是二进制安全的,即它可以包含任何数据,比如一个序列化的对象甚至一个jpg图片,要注意的是redis中的字符串大小上限是512M。

LIST
LIST是一个简单的字符串列表,按照插入顺序进行排序,我们可以从LIST的头部(LEFT)或者尾部(RIGHT)插入一个元素,也可以从LIST的头部(LEFT)或者尾部(RIGHT)弹出一个元素。

HASH
HASH类似于Java中的Map,是一个键值对集合,在redis中可以用来存储对象。

SET
SET是STRING类型的无序集合,不同于LIST,SET中的元素不可以重复。

ZSET
ZSET和SET一样,也是STRING类型的元素的集合,不同的是ZSET中的每个元素都会关联一个double类型的分数,ZSET中的成员都是唯一的,但是所关联的分数可以重复。

二,实验
一,String类型
1.set / get / append / strlen

127.0.0.1:6379> append k1 hello  #该键不存在,因此append创建
(integer) 5
127.0.0.1:6379> append k1 word  #该键已经存在,因此返回追加后value的长度值
(integer) 9
127.0.0.1:6379> get k1         #通过get命令获取该键值   
"helloword"
127.0.0.1:6379> strlen k1      #获取指定key的字符长度
(integer) 9
127.0.0.1:6379> exists k1      #判断该键是否存在,存在返回1,否则返回0
(integer) 1
127.0.0.1:6379> set k1 "just do it"  #
OK
127.0.0.1:6379> get k1      #通过set命令为键设置新值,并覆盖原有值 
"just do it"

2.incr / decr / incrby / decrby

127.0.0.1:6379> set k2 100         #为键设置新值
OK
127.0.0.1:6379> incr k2            #该键的值递增1
(integer) 101
127.0.0.1:6379> incr k2 
(integer) 102
127.0.0.1:6379> decr k2            #该键的值递减1
(integer) 101
127.0.0.1:6379> incrby k2 10       #该键的值递增固定值
(integer) 111
127.0.0.1:6379> decrby k2 30       #该键的值减少固定值
(integer) 81
127.0.0.1:6379> get k2 
"81"
127.0.0.1:6379> set k2 "hello"    #该键的值设置非数字
OK
127.0.0.1:6379> get k2 
"hello"
127.0.0.1:6379> incr k2          #非数字无法实现自增长,必须为整数
(error) ERR value is not an integer or out of range

3.getset
获取key值返回,并给key设置新值

127.0.0.1:6379> get k2 
"hello"
127.0.0.1:6379> getset k2 1   #获原有值的同时,并将其设置为新值,这两个操作原子性的同时完成.
"hello"
127.0.0.1:6379> get k2 
"1"

4.setex
设置key值的过期时间为seconds

127.0.0.1:6379> setex k3  20  10  #设定k3的值为10,存活时间为20S
OK
127.0.0.1:6379> ttl k3  #通过ttl命令查看指定key的剩余存活时间(秒),-2表示已过期,-1表示永不过期
(integer) 12
127.0.0.1:6379> ttl k3 
(integer) 9
127.0.0.1:6379> get k3 
"10"
127.0.0.1:6379> ttl k3
(integer) -2
127.0.0.1:6379> get k3   #过期的key返回为nil
(nil)

5.setnx
创建指定键,若该键存在则不执行,不存在则执行

127.0.0.1:6379> setnx k9 10 
(integer) 1
127.0.0.1:6379> get k9 
"10"
127.0.0.1:6379> setnx k9 100
(integer) 0
127.0.0.1:6379> get k9 
"10"

6.mset / mget / msetnx
批量指令

127.0.0.1:6379> mset aa "hello" bb "world"  #批量设置键的值
OK
127.0.0.1:6379> mget aa bb                 #批量获取键的值
1) "hello"
2) "world"
127.0.0.1:6379> msetnx cc 100 dd 200 
(integer) 1
127.0.0.1:6379> mget cc  dd 
1) "100"
2) "200"
127.0.0.1:6379> msetnx aa 200 mm 100     #批量设置键值,若有存在的键则不执行
(integer) 0

二,List类型
列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素
1.lpush / lpushx / lrange

lpush:#该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入到表头
lpushx:#该命令仅当key存在时,将value值插入表头
lrange:#返回列表中指定区间内的元素,0表示第一个元素,1表示第二个元素
127.0.0.1:6379> lpush k2 a b c d e 
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lpush k3 a b c d e 
(integer) 5
127.0.0.1:6379> lpush k3 f 
(integer) 6
127.0.0.1:6379> lrange k3 0 -1 
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lpushx k3 g     #将g插入表头
(integer) 7
127.0.0.1:6379> lrange k3 0 -1 
1) "g"
2) "f"
3) "e"
4) "d"
5) "c"
6) "b"
7) "a"
127.0.0.1:6379> lrange k3 3 6    #第一个元素到第七个元素
1) "d"
2) "c"
3) "b"
4) "a"

2.lpop / llen

   lpop		#移除并返回第一个元素,从头开始
   llen		#查看列表中元素个数
127.0.0.1:6379> lpop k3 
"g"
127.0.0.1:6379> llen k3 
(integer) 6
127.0.0.1:6379> lpop k3 
"f"
127.0.0.1:6379> lrange k3 0 -1 
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"

3.rem / lset / lindex / ltrim

lrem key count value:从列表头部开始删除count个值为value的元素,并返回实际删除数量
lset key index value:将位置索引为index的元素设置新值value
lindex key index:获取索引为index的元素
ltrim  key start stop:仅保留从位置索引start到索引stop的元素
127.0.0.1:6379> lpush k4 a b c d b a   #创建一个list
(integer) 6
127.0.0.1:6379> lrange k4 0 -1 
1) "a"
2) "b"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lrem k4 2 a   #从头部(left)向尾部(right)变量链表,删除2个值等于a的元素,返回值为实际删除的数量。 
(integer) 2
127.0.0.1:6379> lrange k4 0 -1 
1) "b"
2) "d"
3) "c"
4) "b"
127.0.0.1:6379> lset k4 2 f    #将第三个元素设置为f
OK
127.0.0.1:6379> lrange k4 0 -1 
1) "b"
2) "d"
3) "f"
4) "b"
127.0.0.1:6379> lindex k4 3  #获取索引为3的元素
"b"
127.0.0.1:6379> lrange k4 0 -1 
1) "b"
2) "d"
3) "f"
4) "b"
127.0.0.1:6379> ltrim k4 0 2      #仅保留索引为0到索引为2的元素,相当于保留删除
OK
127.0.0.1:6379> lrange  k4 0 -1 
1) "b"
2) "d"
3) "f"

4.linsert

linsert		#在键的xxx元素前|后插入新元素元素 
127.0.0.1:6379> lrange  k4 0 -1 
1) "b"
2) "d"
3) "f"
127.0.0.1:6379> linsert k4 before b  1 
(integer) 4
127.0.0.1:6379> lrange  k4 0 -1 
1) "1"
2) "b"
3) "d"
4) "f"
127.0.0.1:6379> linsert k4 after f 2 
(integer) 5
127.0.0.1:6379> lrange  k4 0 -1 
1) "1"
2) "b"
3) "d"
4) "f"
5) "2"
127.0.0.1:6379> linsert k4 before 1 e 
(integer) 6
127.0.0.1:6379> lrange  k4 0 -1 
1) "e"
2) "1"
3) "b"
4) "d"
5) "f"
6) "2"
127.0.0.1:6379> 

5.rpush / rpushx / rpop / rpoplpush

rpush		    #将值从左往右依次插入到表尾
rpushx		    #指定键value从尾部插入,键存在时执行,否则不执行
rpop			#移除并返回键的第一个元素,从尾开始
rpoplpush	    #将键1尾部元素xxx弹出,同时再插入到键2的头部(原子性的完成这两步操作)
127.0.0.1:6379> rpush k5 a b c d e 
(integer) 5
127.0.0.1:6379> lrange k5 0 -1 
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpushx k5 f      #将元素f在尾部插入键k5
(integer) 6
127.0.0.1:6379> lrange k5 0 -1 
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> rpop k5        #移除k5键的最后一个元素
"f"
127.0.0.1:6379> lrange k5 0 -1 
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpoplpush k5 k6    #将键K5的最后一个元素弹出,同时在K6键的头部插入
"e"
127.0.0.1:6379> lrange k6 0 -1 
1) "e"
127.0.0.1:6379> lrange k5 0 -1 
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> rpoplpush k5 k6 
"d"
127.0.0.1:6379> lrange k5 0 -1 
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lrange k6 0 -1 
1) "d"
2) "e"

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

1.hset / hget / hdel / hexists / hlen / hsetnx

   hset			#给xxx键设置字段为xxx,值为xxx
   hget			#获取xxx键,字段为xxx的值
   hdel			#删除xxx键的xxx字段,成功返回1
   hexists		#判断xxx键中的xxx字段是否存在,存在返回1
   hlen			#获取xxx键的字段数量
   hsetnx		#给xxx键添加新字段,是否执行基于此字段是否存在,不管键是否存在,返回1表示执行成功

```bash
127.0.0.1:6379> hset k7 zhangsan1 a zhangsan2 b zhangsan3 c 
(integer) 3
127.0.0.1:6379> get k7 zhangsan1 
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> hget k7 zhangsan1 
"a"
127.0.0.1:6379> hget k7 zhangsan2
"b"
127.0.0.1:6379> hexists k7  zhangsan4
(integer) 0
127.0.0.1:6379> hlen k7
(integer) 3
127.0.0.1:6379> hget k7 zhangsan3 
"c"
127.0.0.1:6379> hsetnx k7 zhangan3 d
(integer) 0
127.0.0.1:6379> hget k7 zhangsan3 
"c"
127.0.0.1:6379> hsetnx k8  zhangan3 d
(integer) 0

2.hincrby
hincrby #给xxx键的xxx字段值加x

127.0.0.1:6379> hset k7 lisi1 100      #追加的方式
(integer) 1
127.0.0.1:6379> hget k7 lisi1 
"100"
127.0.0.1:6379> hget k7  zhangsan1
"a"
127.0.0.1:6379> hincrby k7 lisi1 5 
(integer) 105
127.0.0.1:6379> hincrby k7 lisi1 -10
(integer) 95
127.0.0.1:6379> hget k7 lisi1 
"95"

3.hmset / hmget / hgetall / hkeys / hvals

hmset key field value   #批量为xxx键创建字段和赋值
hmget key field		    #获取指定多个字段值
hgetall key		        #返回xxx键的所有字段及其值,是逐对列出的
hkeys key		        #仅获取xxx键中所有字段名
hvals key		        #仅获取xxx键中所有字段值
127.0.0.1:6379> hmset k8 zhaoliu1 a zhaoliu2 b 
OK
127.0.0.1:6379> hmget k8 zhaoliu1 zhaoliu2
1) "a"
2) "b"
127.0.0.1:6379> hgetall k8 
 1) "zhangan3"
 2) "d"
 3) "zhangan4"
 4) "d"
 5) "zhangan5"
 6) "f"
 7) "zhaoliu1"
 8) "a"
 9) "zhaoliu2"
10) "b"
127.0.0.1:6379> hget k8 zhangsan3
(nil)
127.0.0.1:6379> hget k8 zhaoliu1
"a"
127.0.0.1:6379> hkeys k8 
1) "zhangan3"
2) "zhangan4"
3) "zhangan5"
4) "zhaoliu1"
5) "zhaoliu2"
127.0.0.1:6379> hvals k8 
1) "d"
2) "d"
3) "f"
4) "a"
5) "b"
127.0.0.1:6379> hget k8 zhaoliu1 zhaoliu2
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hmget k8 zhaoliu1 zhaoliu2
1) "a"
2) "b"

四,Set数据类型(无序集合)
元素类型为string类型, 元素具有唯一性,
不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算
应用范围:
可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中, 而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections 命令就可以充分发挥它的方便和效率的优势了
1.sadd / smembers / scard / sismember

sadd				#将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合
smembers			#通过smembers命令查看插入的结果,输出的顺序与插入顺序无关
scard			    #获取集合中成员的数量
sismember		    #判断键中xxx成员是否存在,返回0表示不存在,1表示存在
127.0.0.1:6379> sadd k1 a b c d e 
(integer) 5
127.0.0.1:6379> smembers k1 
1) "b"
2) "a"
3) "d"
4) "c"
5) "e"
127.0.0.1:6379> scard k1 
(integer) 5
127.0.0.1:6379> sismember k1 c 
(integer) 1
127.0.0.1:6379> sismember k1 f 
(integer) 0
127.0.0.1:6379> 

2.spop / srem / srandmember / smove

spop				#随机的移除并返回键中的某一成员
srem				#从键中移出xxx、xxx、xxx成员,并返回移出成员个数
srandmember		    #该命令随机的返回某一成员
smove 			    #将键1的xxx成员移到键2,成功返回1,失败返回0
127.0.0.1:6379> sadd k1 a b c d e 
(integer) 5
127.0.0.1:6379> spop k1 
"d"
127.0.0.1:6379> smembers k1
1) "c"
2) "b"
3) "a"
4) "e"
127.0.0.1:6379> srem k1 a  b c 
(integer) 3
127.0.0.1:6379> smembers k1 
1) "e"
127.0.0.1:6379> del k2 
(integer) 1
127.0.0.1:6379> smove k1 k2  d   #k1中没有d所以失败
(integer) 0
127.0.0.1:6379> smove k1 k2  e 
(integer) 1
127.0.0.1:6379> keys k2
1) "k2"
127.0.0.1:6379> smembers k2 
1) "e"

五,Sorted Set数据类型(zset、 有序集合)
概述:
有序集合,元素类型为Sting, 元素具有唯一 性,不能重复。
每个元素都会关联一个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同。
应用范围:
可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP10的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
Sorted-Set类型还可用于构建索引数据。

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

zadd		#将一个或多个成员元素及其分数值加入到有序集当中
zcard		#获取键中成员的数量
zcount		#分数满足表达式x <= score <= x的成员的数量
zrem		#删除成员xxx、xxx,返回实际删除成员的数量
zincrby	 	#成员xxx不存在,zincrby命令将添加该成员并假设其初始分数为0
zscore		#获取成员xxx的分数
zrank		#获取成员xxx的位置索引值
127.0.0.1:6379> zadd k1 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrange k1 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> zcard k1 
(integer) 5
127.0.0.1:6379> zcount k1 2 4 
(integer) 3
127.0.0.1:6379> zrem k1 a b 
(integer) 2
127.0.0.1:6379> zcard k1 
(integer) 3
127.0.0.1:6379> zincrby k1 2 a 
"2"
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "a"
2) "2"
3) "c"
4) "3"
5) "d"
6) "4"
7) "e"
8) "5"
127.0.0.1:6379> zincrby k1 -4 a 
"-2"
127.0.0.1:6379> zrange k1 0 -1 
1) "a"
2) "c"
3) "d"
4) "e"
127.0.0.1:6379> zrank k1 c 
(integer) 1
127.0.0.1:6379> zrank k1  d 
(integer) 2

2.zrangebyscore / zremrangebyrank / zremrrangebyscore

zrangebyscore		 #获取分数满足表达式 x <= score <= x 的成员
zremrangebyrank		 #删除位置索引满足表达式 x <= rank <= x 的成员。
zremrrangebyscore	 #删除分数满足表达式 x <= score <= x 的成员,并返回实际删除的数量。
127.0.0.1:6379> zadd k1 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrangebyscore k1 2 4
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> zrangebyscore k1 -inf +inf limit 2 2 
1) "c"
2) "d"
127.0.0.1:6379> zremrangebyrank k1 1 3
(integer) 3
127.0.0.1:6379> zrange k1 0 -1 
1) "a"
2) "e"
127.0.0.1:6379> zremrangebyscore k1 1 2
(integer) 1
127.0.0.1:6379> zrange k1 0 -1 
1) "e"

3.zrevrange / zrevrangebyscore / zrevrank

zrevrange			    #以位置索引从高到低的方式获取并返回此区间内的成员
zrevrangebyscore		#获取分数满足表达式x >= score >= x 的成员,并以从高到底的顺序输出。
zrevrank	 			#获取成员索引
127.0.0.1:6379> zadd k1 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrange k1 0 -1 
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> zrevrsnge k1 0 -1
(error) ERR unknown command `zrevrsnge`, with args beginning with: `k1`, `0`, `-1`, 
127.0.0.1:6379> zrevrange k1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> zrevrank k1 a 
(integer) 4
127.0.0.1:6379> zrank k1 a 
(integer) 0
127.0.0.1:6379> zrevrangebyscore k1 3  1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> zrevrangebyscore k1 3  1 limit 1 2
1) "b"
2) "a"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值