Redis入门 五大数据类型(String、List、Set、Hash、Zset)常用命令详解

文章目录

  • Redis 五大数据类型
    • String(字符串)
    • List(列表)
    • Set(集合)
    • Hash(哈希)
    • Zset(有序集合 sorted set)

Redis 五大数据类型

redis中命令不区分大小写!

String(字符串)

#######################################################################################
127.0.0.1:6379> set key1 value1     #设置值
OK
127.0.0.1:6379> get key1            #获得值
"value1"
127.0.0.1:6379> keys *             #huo得所有的值
1) "key1"
127.0.0.1:6379> EXISTS key1        #判断一个key是否存在
(integer) 1                        #返回1则为存在,0则不存在
127.0.0.1:6379> APPEND key1 haha   #给某一个key追加字符串
(integer) 10                        #返回字符串的长度
127.0.0.1:6379> get key1
"value1haha"
127.0.0.1:6379> append name fanmenggang     #如果这个key不存在的话,就相当于set key
(integer) 11
127.0.0.1:6379> KEYS *
1) "name"
2) "key1"
127.0.0.1:6379> 
127.0.0.1:6379> STRLEN key1     #查看字符串的长度
(integer) 10
#######################################################################################
#i++
#i--
#步长:i+=
#i-=
127.0.0.1:6379> set views 1    #初始浏览量为1
OK
127.0.0.1:6379> incr views      #自增一   浏览量加一
(integer) 2                     #返回当前的值
127.0.0.1:6379> incr views     
(integer) 3
127.0.0.1:6379> get views       #查看
"3"
127.0.0.1:6379> decr views     #自减一 
(integer) 2
127.0.0.1:6379> get views      
"2"
127.0.0.1:6379> incrby views 10    #增加步长  可以指定增量!
(integer) 12
127.0.0.1:6379> get views
"12"
127.0.0.1:6379> decrby views 5    #可以指定减去的数量
(integer) 7
127.0.0.1:6379> decrby views 5
(integer) 2
127.0.0.1:6379> get views
"2"
#######################################################################################
#字符串范围截取   range
127.0.0.1:6379> set key1 hello,redis
OK
127.0.0.1:6379> get key1
"hello,redis"
127.0.0.1:6379> GETRANGE key1 0 5        #截取字符串  [0,5]
"hello,"
127.0.0.1:6379> GETRANGE key1 0 -1     #查看全部的字符串 ,相当于get key
"hello,redis"

#替换
127.0.0.1:6379> set key2 abcde
OK
127.0.0.1:6379> SETRANGE key2 2 oo     #替换指定位置开始的字符串
(integer) 5
127.0.0.1:6379> get key2
"abooe"
#######################################################################################
#setex (set with expire)   设置过期时间
#setnx  (set if not exist)   不存在再设置(在分布式锁中常常使用)
127.0.0.1:6379> setex key3 30 hello       #设置值的时候顺便设置过期时间
OK
127.0.0.1:6379> ttl key3     #查看剩余时间
(integer) 21
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey oo   #如果不存在才能设置成功  返回1
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
2) "key1"
3) "key2"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey aa      #存在则设置失败  返回0
(integer) 0
127.0.0.1:6379> get mykey
"oo"
#######################################################################################
# mset  批量设值 
# mget   批量取值
 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3    #批量设值
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3       #批量取值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4      #如果存在则设置失败,原子性的操作
(integer) 0
127.0.0.1:6379> get k4
(nil)  
#######################################################################################
# 对象
#set user:1:{name zhangsan,age 3}  设置一个user:1对象  值为 json字符串来保存
#这里的key是一个巧妙的设计,user:{id}:{filed}   就是把key换了种方式写也是OK的
 
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 3
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "3"

#######################################################################################
# getset  先获取值再设值
127.0.0.1:6379> getset db redis    #如果不存在则返回nil,设置一个值
(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"

#######################################################################################

String类型的使用场景: value除了是字符串外还可以是数字!

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储

List(列表)

基本的数据类型,列表Redis入门 五大数据类型(String、List、Set、Hash、Zset)常用命令详解_第1张图片

在redis里面,我们可以把它玩成 栈(lpush lpop),消息队列(lpush rpop),阻塞队列!这些都可以用list实现!

基本上list命令都是l开头的

#######################################################################################
#lpush
#rpush
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"
3) "one"
127.0.0.1:6379> lrange list 0 1   #通过区间获取具体的值
1) "three"
2) "two"
127.0.0.1:6379> rpush list right  #将一个或多个值插入到列表的尾部(右边)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
#######################################################################################
#lpop
#rpop
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list     #移除列表中的第一个元素
"three"
127.0.0.1:6379> rpop list      #移除list的最后一个元素
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
#######################################################################################
# lindex
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"
#######################################################################################
# Llen
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> llen list    #返回列表的长度
(integer) 3
#######################################################################################
# 移除指定的值!   lrem
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 two     #移除指定的值,移除一个
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "one"
127.0.0.1:6379> lrem list 2 three   #移除两个指定的值,list中允许重复值,
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "one"
#######################################################################################
# ltrim   list截断!
127.0.0.1:6379> lpush list hello1 hello2 hello3
(integer) 3
127.0.0.1:6379> ltrim list 0 1    #通过下标截取指定的长度,这个list已经被改变,截断了只剩下截取的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "hello3"
2) "hello2"
#######################################################################################
# rpoplpush   移除列表中的最后一个元素,并将它移动到新的列表(如果不存在,就给你创建一个)中
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> rpush list hello hello1 hello2
(integer) 3
127.0.0.1:6379> rpoplpush list mylist  #移除列表中的最后一个元素,并将它移动到新的列表(如果不存在,就给你创建一个)中
"hello2"
127.0.0.1:6379> lrange list 0 -1  #查看原来列表中的值
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange mylist 0 -1   #查看目标列表中的值
1) "hello2"
#######################################################################################
# lset 将列表中指定下标的值替换为另一个值,相当于一个更新操作
127.0.0.1:6379> exists list    #判断有没有这个列表
(integer) 0
127.0.0.1:6379> lset list 0 oo   #如果不存在这个列表则更新失败
(error) ERR no such key
127.0.0.1:6379> lpush list haha   #设置值
(integer) 1
127.0.0.1:6379> lrange list 0 0   #查看
1) "haha"
127.0.0.1:6379> lset list 0 oo   #将0号值替换
OK
127.0.0.1:6379> lrange list 0 0  #查看
1) "oo"
127.0.0.1:6379> lset list 1 o   #没有这个元素则失败
(error) ERR index out of range
#######################################################################################
# linsert  将某个具体的value插入到列表中某个元素的前面或者后面

127.0.0.1:6379> rpush list hello world
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert list before world ,   #将,插入到列表中world的前面
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) ","
3) "world"
127.0.0.1:6379> linsert list after world !   #将!插入到列表中world的后面
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) ","
3) "world"
4) "!"
#######################################################################################
  • 它实际上是一个链表,左边右边都可以插值
  • 如果key不存在,创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有的值,空的链表,也就是不存在
  • 在两边插入元素或者改变值,效率比较高!中间的话,效率相对来说低一点

Set(集合)

set中的值不可以重复!无序不重复集合

#######################################################################################
127.0.0.1:6379> sadd set hello fanmenggang loveyou   #set集合中添加元素
(integer) 3
127.0.0.1:6379> smembers set    #查看指定set的所有值
1) "loveyou"
2) "fanmenggang"
3) "hello"
127.0.0.1:6379> sismember set hello  #判断某一个值是不是在set集合中
(integer) 1                                   #存在返回1,不存在返回0
127.0.0.1:6379> sismember set he
(integer) 0
127.0.0.1:6379> scard set         #获取set集合中的元素个数
(integer) 3
#######################################################################################
# srem  移除指定元素
127.0.0.1:6379> srem set hello   #移除指定元素
(integer) 1
127.0.0.1:6379> smembers set
1) "loveyou"
2) "fanmenggang"
#######################################################################################
# 抽随机 srandmember
127.0.0.1:6379> SMEMBERS set
1) "ooo"
2) "haha"
3) "loveyou"
4) "fanmenggang"
127.0.0.1:6379> SRANDMEMBER set  #随机抽出一个元素
"haha"
127.0.0.1:6379> SRANDMEMBER set
"fanmenggang"
127.0.0.1:6379> SRANDMEMBER set 2   #随机抽出指定数量的元素
1) "haha"
2) "fanmenggang"
127.0.0.1:6379> SRANDMEMBER set 2
1) "ooo"
2) "loveyou"
#######################################################################################
# 随即删除set集合中的元素
127.0.0.1:6379> SMEMBERS set
1) "ooo"
2) "haha"
3) "loveyou"
4) "fanmenggang"
127.0.0.1:6379> spop set  #随即删除一个元素
"fanmenggang"
127.0.0.1:6379> SMEMBERS set
1) "ooo"
2) "haha"
3) "loveyou"
127.0.0.1:6379> spop set 2  #随机删除指定数量的元素
1) "ooo"
2) "loveyou"
127.0.0.1:6379> SMEMBERS set
1) "haha"
#######################################################################################
# 将一个指定的值移动到另一个set集合中   smove
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd set1 hah hehe oo
(integer) 3
127.0.0.1:6379> sadd set2 hhh
(integer) 1
127.0.0.1:6379> smove set1 set2 oo  #将一个指定的值移动到另一个set集合中
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "hehe"
2) "hah"
127.0.0.1:6379> SMEMBERS set2
1) "oo"
2) "hhh"
#######################################################################################
#数字集合类:- 交集 sinter  - 并集 sunion  - 差集 sdiff 
127.0.0.1:6379> sadd key1 a b c
(integer) 3
127.0.0.1:6379> sadd key2 c d e
(integer) 3
127.0.0.1:6379> sinter key1 key2  #交集   共同好友
1) "c"
127.0.0.1:6379> sunion key1 key2 #并集
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> sdiff key1 key2 #差集
1) "a"
2) "b"

共同好友,可能认识的人

Hash(哈希)

存的值是map集合,key-map!本质和String类型没有太大区别!

#######################################################################################
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> hset user name fanmenggang    #set一个具体的key-value
(integer) 1
127.0.0.1:6379> hget user name   #获取一个值
"fanmenggang"
127.0.0.1:6379> hmset user name gangzi age 20   #set多个key-value,可以覆盖以前的字段
OK
127.0.0.1:6379> hmget user name age  #获取多个字段的值
1) "gangzi"
2) "20"
127.0.0.1:6379> hgetall user #获取全部的数据
1) "name"
2) "gangzi"
3) "age"
4) "20"
127.0.0.1:6379> hdel user age  #删除指定的字段
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "gangzi"
#######################################################################################
# hlen 获取hash表中字段数量!
127.0.0.1:6379> hgetall user
1) "name"
2) "gangzi"
127.0.0.1:6379> hlen user   #获取hash表中字段数量!
(integer) 1
#######################################################################################
127.0.0.1:6379> hexists user name  #判断hash中的key中指定字段是否存在
(integer) 1           #存在返回1,不存在返回0
127.0.0.1:6379> hexists user age
(integer) 0
#######################################################################################
127.0.0.1:6379> hkeys user #只获得所有的字段
1) "name"
127.0.0.1:6379> hvals user  #只获得所有的value
1) "gangzi"
#######################################################################################
127.0.0.1:6379> hset user age 5
(integer) 1
127.0.0.1:6379> hincrby user age 5   #设值指定增量
(integer) 10
127.0.0.1:6379> HINCRBY usr age -3  #没有hdecrby  可以写负数相当于hdecrby
(integer) -3
127.0.0.1:6379> hsetnx user sex nan  #如果没有则添加成功
(integer) 1
127.0.0.1:6379> hsetnx user sex nv  #如果有则添加失败
(integer) 0
#######################################################################################

做一些用户信息的保存 ,经常变动的信息!hash更适合对象的存储,String更适合字符串!

Zset(有序集合 sorted set)

在set的基础上,增加了一个值,set k1 v1—zset k1 score v1 这个标志可以让它排序

#######################################################################################
127.0.0.1:6379> FLUSHALL
OK
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"
#######################################################################################
# 如何进行排序    -inf:负无穷,+inf:正无穷
# ZREVRANGEBYSCORE 由高到低排序
# ZRANGEBYSCORE  由低到高排序
 127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd salsry 2500 zhangsan   #存储数据
(integer) 1
127.0.0.1:6379> zadd salsry 500 lisi
(integer) 1
127.0.0.1:6379> zadd salsry 5000 wangwu
(integer) 1
127.0.0.1:6379> ZREVRANGEBYSCORE salsry +inf -inf    #由高到低排序
1) "wangwu"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> ZREVRANGEBYSCORE salsry +inf -inf withscores  #带上分数由高到低排序
1) "wangwu"
2) "5000"
3) "zhangsan"
4) "2500"
5) "lisi"
6) "500"
127.0.0.1:6379> ZRANGEBYSCORE salsry -inf +inf    #由低到高排序
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> ZRANGEBYSCORE salsry -inf +inf withscores  #带上分数由低到高排序
1) "lisi"
2) "500"
3) "zhangsan"
4) "2500"
5) "wangwu"
6) "5000"
#######################################################################################
# rem 移除集合中的元素 ,  zcard   获取集合中所有的元素个数
127.0.0.1:6379> ZRANGE salsry 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> ZREM salsry lisi  #移除集合中指定的元素
(integer) 1
127.0.0.1:6379> ZRANGE salsry 0 -1
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> zcard salsry  #查看集合中元素的个数
(integer) 2
#######################################################################################
# zcount 获取指定区间的元素个数
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd set 1 hello 2 world 3 haha
(integer) 3
127.0.0.1:6379> zcount set 1 3  #获取指定区间的元素个数
(integer) 3
#######################################################################################

排行榜应用实现,存储班级成绩表,工资表排序!

你可能感兴趣的:(Linux)