Redis的五大基本数据类型

目录

Redis的八种数据类型

五种基本类型

String类型(字符串)

List类型(列表)

Set类型(集合)

Hash类型(哈希)

Zset类型(有序集合)

三种特殊数据类型


 

Redis的八种数据类型

 

Redis支持多种类型的数据结构,如字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)与范围查询,bitmaps、hyperloglogs、地理空间索引半径查询(geospatial)

 

 

五种基本类型

 

String类型(字符串)

可以存普通文本,json字符串,二进制数据等。

=================================
127.0.0.1:6379> set k1 v1  #设置值
OK
127.0.0.1:6379> get k1	   #获取值
"v1"
127.0.0.1:6379> keys *     #获取所有key
1) "k1"
127.0.0.1:6379> exists k1    #判断某一个key是否存在
(integer) 1
127.0.0.1:6379> append k1 "toyota"   #追加字符串,如果当前key不存在,就相当于setkey
(integer) 8
127.0.0.1:6379> get k1
"v1toyota"
127.0.0.1:6379> strlen k1      #获取字符串长度
(integer) 8
127.0.0.1:6379> 
===================================
127.0.0.1:6379> set view 0     #初始浏览量为0
OK
127.0.0.1:6379> get view		
"0"
127.0.0.1:6379> incr view  #自增1 浏览量变为1(自增默认为1)
(integer) 1
127.0.0.1:6379> get view
"1"
127.0.0.1:6379> decr view  #自减1 浏览量变为1(自减默认为1)
(integer) 0
127.0.0.1:6379> get view
"0"
127.0.0.1:6379> incrby view 10  #指定增量为10
(integer) 10
127.0.0.1:6379> get view
"10"
127.0.0.1:6379> decrby view 5   #指定减量为5
(integer) 5
127.0.0.1:6379> get view
"5"
127.0.0.1:6379> 
====================================
#字符串范围range
127.0.0.1:6379> set k1 "monkey"
OK
127.0.0.1:6379> get k1
"monkey"
127.0.0.1:6379> getrange k1 0 3   #截取字符串 [0,3]
"monk"
127.0.0.1:6379> getrange k1 0 -1  #获取全部字符串
"monkey"

#替换
127.0.0.1:6379> set k2 panda
OK
127.0.0.1:6379> get k2
"panda"
127.0.0.1:6379> setrange k2 1 c  #替换指定位置的字符串+替换后的值
(integer) 5
127.0.0.1:6379> get k2
"pcnda"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> setex key3 10 "3kdang"  #设置过期时间
OK
127.0.0.1:6379> keys *
1) "view"
2) "key3"
3) "k1"
4) "k2"
127.0.0.1:6379> ttl key3   #还有几秒过期
(integer) -2
127.0.0.1:6379> keys *
1) "view"
2) "k1"
3) "k2"
127.0.0.1:6379> setnx k3 "mongodb"  #如果key不存在则创建
(integer) 1
127.0.0.1:6379> get k3
"mongodb"
127.0.0.1:6379> setnx k3 "m"   #如果key存在,不执行操作
(integer) 0
127.0.0.1:6379> get k3
"mongodb"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> mset k11 v11 k22 v22  #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k11"
2) "k22"
3) "view"
4) "k3"
5) "k1"
6) "k2"
127.0.0.1:6379> mget k11 k22     #同时获取多个值
1) "v11"
2) "v22"
127.0.0.1:6379> msetnx k1 v1 k4 v4   #存在则创建失败,原子性操作,都成功才成功
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2  #存对象, user:{id}:{filed}
OK
127.0.0.1:6379> mget user:1:name user:1:age 2  #取对象
1) "zhangsan"
2) "2"
3) (nil)
127.0.0.1:6379> 
====================================
127.0.0.1:6379> getset db redis   #先get再set
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #如果原来存在值,则替换为新值
"redis"
127.0.0.1:6379> get db
"mongodb"
127.0.0.1:6379> 

 

 

List类型(列表)

list其实是一个双向链表,也可以实现队列的功能。你可以从左右插入,从左右弹出。特点是操作两边效率高,操作中间效率低。

list可以作为消息队列(Lpush Rpop)、也可以作为栈(Lpush Lpop)

====================================
127.0.0.1:6379> lpush list one #将一个值或多个值插入到列表头部(左)
(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"
127.0.0.1:6379> rpush list righr #将一个或多个值插入到列表尾部(右)
(integer) 4
127.0.0.1:6379> lrange list 0 -1  #获取list中的所有值
1) "three"
2) "two"
3) "one"
4) "righr"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> lrange list 0 -1 
1) "three"
2) "two"
3) "one"
4) "righr"
127.0.0.1:6379> lpop list  #移除list中的第一个元素
"three"
127.0.0.1:6379> rpop list   #移除list中的最后一个元素
"righr"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1   #通过下标获得list中的某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> lpush list one
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
3) "one"
127.0.0.1:6379> lpush list two
(integer) 4
127.0.0.1:6379> llen list    #返回列表的长度
(integer) 4
127.0.0.1:6379> 
====================================
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "two"
3) "one"
127.0.0.1:6379> lrem list 1 two   #移除list集合中的1个值,值为two
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
====================================
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2   通过下标截取指定的长度,这个list只剩下1和2,其余索引被截断了
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist  #移除列表中的最后一个元素,将它移动到一个新的列表
"hello2"
127.0.0.1:6379> lrange mylist 0 -1   #查看原列表
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1   #查看新列表
1) "hello2"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> exists list  #判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item  #如果不存在列表使用lset更新会报错
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item #如果存在更新当前下标的值
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> lset list 1 other   #如果不存在就会报错
(error) ERR index out of range
127.0.0.1:6379> 
====================================
#linsert  将某个具体的value值插入到list的某个value的前后或后面
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "world"
(integer) 2
127.0.0.1:6379> linsert mylist before "world" "other"
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert mylist after world new
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
127.0.0.1:6379> 

 

 

Set类型(集合)

set集合中存入的值是不能重复的,set集合常用于获取多个集合的交集,并集,差集。

====================================
127.0.0.1:6379> sadd myset "hello"   #向set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "monkey"
(integer) 1
127.0.0.1:6379> sadd myset "aryouok"
(integer) 1
127.0.0.1:6379> smembers myset   #查看指定set的所有值
1) "aryouok"
2) "monkey"
3) "hello"
127.0.0.1:6379> sismember myset hello  #判断某一个值是不是在set集合中
(integer) 1
127.0.0.1:6379> sismember myset xingxing
(integer) 0
127.0.0.1:6379> 
====================================
127.0.0.1:6379> scard myset     #获取set集合中的内容元素个数
(integer) 3
127.0.0.1:6379> 
====================================
127.0.0.1:6379> srem myset hello   #移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "aryouok"
2) "monkey"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> smembers myset
1) "aryouok"
2) "monkey"
127.0.0.1:6379> srandmember myset   #随机抽选出一个元素
"aryouok"
127.0.0.1:6379> srandmember myset
"monkey"
127.0.0.1:6379> srandmember myset 2  #随机抽选出二个元素
1) "monkey"
2) "aryouok"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> smembers myset
1) "aryouok"
2) "monkey"
127.0.0.1:6379> spop myset     #随机删除一些set集合中的元素
"monkey"
127.0.0.1:6379> spop myset
"aryouok"
127.0.0.1:6379> smembers myset
(empty list or set)
127.0.0.1:6379> 
====================================
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "hah"
(integer) 1
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset myset2 "hah"  #将一个指定的值移动到另外一个集合
(integer) 1
127.0.0.1:6379> smembers myset
1) "hello"
2) "world"
127.0.0.1:6379> smembers myset2
1) "hah"
2) "set2"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sdiff key1 key2    #差集
1) "b"
2) "a"
127.0.0.1:6379> sinter key1 key2   #交集
1) "c"
127.0.0.1:6379> sunion key1 key2   #并集
1) "b"
2) "c"
3) "d"
4) "a"
5) "e"
127.0.0.1:6379> 

 

 

Hash类型(哈希)

可以把hash想象成map集合==》{key,Map<>},hash类型适合存储对象,在仅仅访问对象部分属性时,能够避免不必要的Cpu运算和数据传输,大大提高了效率。

====================================
127.0.0.1:6379> hset myhash field1 dalao  #set一个具体的key-value
(integer) 1
127.0.0.1:6379> hget myhash field1   #获取一个字段值
"dalao"
127.0.0.1:6379> hmset myhash field1 hello field2 world #set多个key-value
OK
127.0.0.1:6379> hmget myhash field1 field2   #获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash    #获取全部的数据
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1   #删除hash指定的key字段,对应的value值也会消失
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
3) "field1"
4) "hello"
127.0.0.1:6379> hlen myhash   #获取hash表中的字段数量
(integer) 2
127.0.0.1:6379> 
====================================
127.0.0.1:6379> hexists myhash field1   #判断hash中指定字段是否存在
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0
127.0.0.1:6379> 
====================================
127.0.0.1:6379> hkeys myhash    #只获得所有的field
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash    #只获得所有的value
1) "world"
2) "hello"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> hset myhash field3 5   #指定增量
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1  
(integer) 6
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello   #如果不存在可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world   #如果存在不能设置
(integer) 0
127.0.0.1:6379> 

 

 

Zset类型(有序集合)

zset是在set的基础上,新增了一个值,set k1 v1  ==> zset k1 score1 v1。这个score1相当于每一个值的属性,以此作为排序标准

zset的底层时zipList(压缩表)和skipList(跳跃表),元素少于128且元素长度小于64字节使用压缩表,否则使用跳跃表。

zset访问中间部分的数据效率比较高,但内存消耗大,它以空间换时间。

zset应用各种排序,如工资表,班级。此外还可以进行带权重的判断,排行榜top n 等等。

====================================
127.0.0.1:6379> zadd myset 1 one   #添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three  #添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> zadd salary 2500 laohu  
(integer) 1
127.0.0.1:6379> zadd salary 5000 laoshu
(integer) 1
127.0.0.1:6379> zadd salary 500 fenbuqingchu
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf  #显示全部用户,从小到大排序
1) "fenbuqingchu"
2) "laohu"
3) "laoshu"
127.0.0.1:6379> zrevrange salary 0 -1   #从大到小排序
1) "laoshu"
2) "laohu"
3) "fenbuqingchu"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #显示全部的用户并且附带成绩
1) "fenbuqingchu"
2) "500"
3) "laohu"
4) "2500"
5) "laoshu"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores  #显示工资小于2500员工的升序排序
1) "fenbuqingchu"
2) "500"
3) "laohu"
4) "2500"
127.0.0.1:6379> 
====================================
127.0.0.1:6379> zrange salary 0 -1
1) "fenbuqingchu"
2) "laohu"
3) "laoshu"
127.0.0.1:6379> zrem salary laoshu   #移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1   
1) "fenbuqingchu"
2) "laohu"
127.0.0.1:6379> zcard salary   #获取有序集合中的个数
(integer) 2
127.0.0.1:6379> 
====================================
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 houzi
(integer) 2
127.0.0.1:6379> zcount myset 1 3
(integer) 3
127.0.0.1:6379> zcount myset 1 2  #获取指定区间的成员数量
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "hello"
2) "one"
3) "two"
127.0.0.1:6379> 

 

 

三种特殊数据类型

 

https://blog.csdn.net/Delicious_Life/article/details/106360745 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值