Redis五大数据类型

camhan 2020-06-05

Redis-key:基本命令

127.0.0.1:6379> keys *    # 查看当前数据库所有的key
(empty list or set)
127.0.0.1:6379> set name zxh    # set一个key-value
OK
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> exists name        # 判断key是否存在
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> move name 1        # 移除key,1表示第0个数据库,从小到大
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> get age        # 根据key获取值
"1"
127.0.0.1:6379> set name zxh
OK
127.0.0.1:6379> expire name 10    # 设置key的过期时间
(integer) 1
127.0.0.1:6379> ttl name    # 查看当前key的剩余时间
(integer) 7
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name
(integer) 5
127.0.0.1:6379> ttl name
(integer) 5
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> type age    # 查看当前key的类型
string

后面如果遇到不会的命令,可以在官网查看帮助文档!

Redis五大数据类型

String(字符串)

关于字符串的常用命令

追加、判断是否存在、获取长度

  • set key value:设置值

  • get key value:获取值

  • keys *:获取所以的key

  • append key value:追加字符串,如果当前key不存在,就相当于set一个key

  • strlen key:获取字符串的长度

  • exists key:判断某一个key是否存在

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 hello    # 追加字符串,如果当前key不存在,就相当于set一个key
(integer) 7
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> append k2 zxh    # 不存在则创建
(integer) 3
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"v1hello"
127.0.0.1:6379> strlen k1    # 获取字符串的长度
(integer) 7
127.0.0.1:6379> append k1 ",zxh"
(integer) 11
127.0.0.1:6379> strlen k1
(integer) 11
127.0.0.1:6379> get k1
"v1hello,zxh"

字符串类型为整数的增/减量

可以用作浏览量等等

  • incr key:自增 +1

  • decr key:自减 -1

  • incrby key increment:设置步长,指定增量!

  • decrby key decrement:设置步长,指定减量!

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views    # 自增 +1
(integer) 1
127.0.0.1:6379> get vies
(nil)
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views    # 自减 -1
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> incrby views 10    # 设置步长,指定增量!
(integer) 9
127.0.0.1:6379> decrby views 5    # 设置步长,指定减量!
(integer) 4
127.0.0.1:6379> set name zxh
OK
127.0.0.1:6379> incr name    # 如果不是一个整数的字符串,就会报错
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set age 1.1
OK
127.0.0.1:6379> incr age    # 如果不是一个整数的字符串,就会报错
(error) ERR value is not an integer or out of range

截取和替换

  • getrange key start end:字符串截取,比如 [0,5] 左右都是一个闭区间

  • setrange key offset value:字符串的替换,替换指定下标的字符

127.0.0.1:6379> set title hello,zxh
OK
127.0.0.1:6379> get title
"hello,zxh"
127.0.0.1:6379> getrange title 0 5    # 字符串截取 [0,5]是一个闭区间
"hello,"
127.0.0.1:6379> getrange title 0 -1
"hello,zxh"
127.0.0.1:6379> setrange title 5 |    # 字符串的替换,替换指定下标的字符
(integer) 9
127.0.0.1:6379> get title
"hello|zxh"

设置时间、判断是否存在

  • setex key seconds value:设置过期时间

  • ttl key:查看剩余时间

  • setnx key value:判断是否存在,再创建

127.0.0.1:6379> setex name 10 zxh    # 设置过期时间
OK
127.0.0.1:6379> ttl name
(integer) 9
127.0.0.1:6379> ttl name    # 查看剩余时间
(integer) -2
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> setnx db redis    # 判断是否存在,再创建
(integer) 1
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> setnx db mongodb
(integer) 0
127.0.0.1:6379> get db
"redis"

多个值的set 和 获取get 以及 对象存储

  • mset [key value...]:同时设置多个k-v

  • mget [key ...]:同时获取多个k-v

  • msetnx [key value....]:设置多个k-v,msetnx是一个原子操作,要么一起成功,要么一起失败,用于分布式锁

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3    # 同时设置多个k-v
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> mget k1 k2 k3    # 同时获取多个k-v
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v100 k4 v4    # msetnx是一个原子操作,要么一起成功,要么一起失败,用于分布式锁
(integer) 0
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"

可以使用 user:1:name 这种key方式来表示 user1对象的name属性,用来代替json字符串

127.0.0.1:6379> mset user:1:name zxh user:1:age 20
OK
127.0.0.1:6379> keys *
1) "user:1:age"
2) "user:1:name"
127.0.0.1:6379> get user
(nil)
127.0.0.1:6379> get user:1
(nil)
127.0.0.1:6379> mget user:1:name user:1:age
1) "zxh"
2) "20"

先获取后设置

  • getset key value:先获取之前存放的值,再设置,如果存在就是覆盖

127.0.0.1:6379> getset db redis    # 先获取之前存放的值,再设置,如果存在就是覆盖
(nil)
127.0.0.1:6379> getset db mongodb    # 先获取之前存放的值,再设置,如果存在就是覆盖
"redis"
127.0.0.1:6379> get db
"mongodb"

数据结构是相同的!

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

  • 计数器

  • 统计多单位的数量

  • 粉丝数

  • 对象缓存存储!

List(列表)

Redis中的List类型,可以玩成栈、队列、阻塞队列!

Redis五大数据类型

List类型

  • 左右两边都可以放入数据,如同双端队列

  • 放入的顺序为1234,存放的顺序就是4321,和栈相同,后放入的在最上面

所有的list命令基本都是 l/L开头的

创建、获取、弹出

  • lpush key value [value...]:将一个或多个值,插入到列表的头部(也就是左边)

  • lrange key start end:取list中的值!先进后出,后进先出,可以看出一条水平线,从左端依次塞入,做左端依次拿出

  • rpush key value [value...]:从将一个或多个值,从列表的右端放入

  • lpop key:移除列表的第一元素,从左端移除

  • rpop key:移除列表的最后一个元素,从右端移除

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    # 获取下标区间内的值,[0, 1]左右都是闭合的
1) "three"
2) "two"
127.0.0.1:6379> rpush list four    # 
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list    # 移除列表的第一元素,从左端移除
"three"
127.0.0.1:6379> rpop list    # 移除列表的最后一个元素,从右端移除
"four"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"

根据下标获取、获取长度

  • lindex key index:通过下标获取列表的值

  • llen key:获取列表的长度/大小

127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1    # 通过下标获取列表的值
"one"
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> llen list
(integer) 2

移除指定的value并且可以指定个数

  • lrem key count value:移除列表中指定个数的指定的值,精准匹配

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 one    # 移除列表中指定个数的指定的值,精准匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"

截取列表并替换

  • ltrim key start end:通过下标指定长度,截取列表的值,并且用截取的列表改变原列表

127.0.0.1:6379> rpush mylist hello1 hello2 hello3 hello4
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
4) "hello4"
127.0.0.1:6379> ltrim mylist 1 2    # 通过下标指定长度,截取列表的值,并且用截取的列表改变原列表
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello2"
2) "hello3"

弹出最后一个元素到另一个列表

  • rpoplpush resouce destination:移除原列表最后一个元素,将它移动到新的列表中(做左端放入)

127.0.0.1:6379> lrange mylist 0 -1
1) "hello2"
2) "hello3"
3) "hello1"
4) "hello4"
127.0.0.1:6379> rpoplpush mylist newlist
"hello4"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello2"
2) "hello3"
3) "hello1"
127.0.0.1:6379> lrange newlist 0 -1
1) "hello4"

替换、插入

  • lset key index value:替换列表中指定下标的值

  • linsert key before|after pivot value:在指定的值前面或者后面插入值

127.0.0.1:6379> exists list
(integer) 0
127.0.0.1:6379> lset list 0 one
(error) ERR no such key
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "one"
127.0.0.1:6379> lset list 0 two        # 替换列表中指定下标的值
OK
127.0.0.1:6379> lset list 1 three    # 如果没有对应的列表,则会报错!
(error) ERR index out of range    
127.0.0.1:6379> lrange list 0 -1
1) "one"
127.0.0.1:6379> lset list 0 two    
OK
127.0.0.1:6379> lset list 1 three    # 如果没有对应的元素,则会报错!
(error) ERR index out of range
########################################
127.0.0.1:6379> lrange list 0 -1
1) "two"
127.0.0.1:6379> lpush list one
(integer) 2
127.0.0.1:6379> rpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> linsert list before three four    # 在指定的three值前面插入值
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
3) "four"
4) "three"
127.0.0.1:6379> linsert list after one five    # 在指定的one值后面插入值
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "five"
3) "two"
4) "four"
5) "three"

小结

  • 他实际上是一个链表,before Node after , left,right 都可以插入值

  • 如果key 不存在,创建新的链表

  • 如果key存在,新增内容

  • 如果移除了所有值,空链表,也代表不存在!

  • 在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~

消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

Set(集合)

set中的值是不能重复的!

  • sadd key meber [member...]:在set集合中添加元素

  • smembers key:查看指定set集合的所有值

  • sismember key member:判断某一个值是否在集合中

  • scard key:获取指定set集合的大小

  • srem key member [member...]:移除set集合中指定的一个或多个元素

  • srandmember key count:随机获取set集合中的一个或者多个元素

  • spop key cout:随机删除一个或者多个元素

  • smove resouce destination member:将集合中指定的元素移动到另一个集合中

  • sdiff key [key...]:差集,保留在第一个集合中其他集合里没有的值

  • sinter key [key...]:交集

  • sunion key [key...]:并集

################## 添加、查看所有、判断是否存在 ######################
127.0.0.1:6379> sadd set hello zxh world    # 在set集合中添加元素
(integer) 3
127.0.0.1:6379> smembers set    # 查看指定set集合的所有值
1) "zxh"
2) "hello"
3) "world"
127.0.0.1:6379> sismember set zxh    # 判断某一个值是否在集合中
(integer) 1
127.0.0.1:6379> sismember set hello    
(integer) 1

################## 获取个数 ######################
127.0.0.1:6379> scard set    # 获取指定set集合的大小
(integer) 3

################## 移除指定的元素 ######################
127.0.0.1:6379> srem set hello    # 移除set集合中指定的一个或多个元素
(integer) 1
127.0.0.1:6379> scard set
(integer) 2
127.0.0.1:6379> smembers set
1) "zxh"
2) "world"

################## 随机获取set集合的元素 ######################
127.0.0.1:6379> sadd set zxh hello world 23333
(integer) 4
127.0.0.1:6379> smembers set
1) "23333"
2) "zxh"
3) "hello"
4) "world"
127.0.0.1:6379> srangemember set    # 随机获取set集合的一个元素
(error) ERR unknown command `srangemember`, with args beginning with: `set`, 
127.0.0.1:6379> srandmember set
"hello"
127.0.0.1:6379> srandmember set
"hello"
127.0.0.1:6379> srandmember set
"world"
127.0.0.1:6379> srandmember set 2    # 随机获取set集合的2个元素
1) "zxh"
2) "23333"
127.0.0.1:6379> srandmember set 2
1) "23333"
2) "world"


################## 随机删除元素 ######################
127.0.0.1:6379> spop set    # 随机删除set集合中一个或者多个元素
"hello"
127.0.0.1:6379> spop set
"23333"
127.0.0.1:6379> smembers set
1) "zxh"
2) "world"

################## 将指定值移动到另一个集合中 ######################
127.0.0.1:6379> sadd set1 hello world zxh        
(integer) 3
127.0.0.1:6379> sadd set2 2333
(integer) 1
127.0.0.1:6379> smove set1 set2 zxh    # 将集合中的指定值移动到另一个集合中
(integer) 1
127.0.0.1:6379> smembers set1
1) "hello"
2) "world"
127.0.0.1:6379> smembers set2
1) "zxh"
2) "2333"

################## 并集、交集、差集 ######################
127.0.0.1:6379> sadd set1 a b c
(integer) 3
127.0.0.1:6379> sadd set2 b c d e
(integer) 4
127.0.0.1:6379> sdiff set2 set1    # 差集,set2 - set1 保留set2中set1没有的植
1) "e"
2) "d"
127.0.0.1:6379> sinter set1 set2    # 交集
1) "c"
2) "b"
127.0.0.1:6379> sunion set1 set2    # 并集
1) "a"
2) "e"
3) "c"
4) "b"
5) "d"

小结

  • 可以应用在共同关注,共同爱好

    • 这里的好友概念,有一个理论叫:六度分割理论!

  • 随机抽奖

Hash(哈希集合)

hash类型:相当于map集合,原来存储的是 key-value,现在变成 key-map!本质和String类型没有太大区别,还是一个简单的k-v!

  • hset key field value:存放一个具体的 k-v

  • hget key field:获取key中某一个属性值

  • hmset key field value [field value...]:存放一个或多个 k-v

  • hmget key field [field....]:获取key中一个或多个属性值

  • hdel key field [field...]:删除key中一个或多个属性值

  • hgetall key:获取key的全部的数据,以键值对形式显示

  • hlen key:获取map的长度

  • hexists key field:判断map是否有对应的属性

  • hkeys key:获取map所有的key

  • hvals key:获取map所有的value

  • hincrby key field increment:对map中的整数类型进行增量

  • hsetnx key field value:判断map中是否有对应的属性,如果没有进行存储

################## 存储、获取、获取所有、指定删除 ######################
127.0.0.1:6379> hset hash field1 zxh    # 存放一个具体的 k-v
(integer) 1
127.0.0.1:6379> hget hash field1    # 获取key中某一个属性值
"zxh"
127.0.0.1:6379> hmset hash field1 zxh field2 10    # 存放多个 k-v
OK
127.0.0.1:6379> hmget hash field1 field2    # 获取key中多个属性值
1) "zxh"
2) "10"
127.0.0.1:6379> hdel hash field1    # 删除key中指定的属性值
(integer) 1
127.0.0.1:6379> hgetall hash    # 获取key的全部的数据,以键值对形式显示
1) "field2"
2) "10"

################## 获取长度 ######################
127.0.0.1:6379> hmset hash field1 hello field2 world
OK
127.0.0.1:6379> hgetall hash
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hlen hash    # 获取map的长度
(integer) 2

################## 判断map中是否存在 ######################
127.0.0.1:6379> hgetall hash
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hexists hash field1    # 判断map中是否存在指定的属性
(integer) 1
127.0.0.1:6379> hexists hash field3
(integer) 0

################## 获取所有的key、获取所有的value ######################
127.0.0.1:6379> hkeys hash    # 获取map中所有的key
1) "field1"
2) "field2"
127.0.0.1:6379> hvals hash    # 获取map中所有的value
1) "hello"
2) "world"

################## 增量 ######################
127.0.0.1:6379> hset myhash field 5
(integer) 1
127.0.0.1:6379> hincrby myhash field 3    # 进行按步长增量
(integer) 8
127.0.0.1:6379> hincrby myhash field -3
(integer) 5

################## 判断后再存储 ######################
127.0.0.1:6379> hsetnx myhash field2 hello    # 判断是否有对应的属性,如果没有进行存储
(integer) 1
127.0.0.1:6379> hsetnx myhash field2 world    # 判断是否有对应的属性,如果有不进行存储
(integer) 0

################# 对象存储 ##########################
127.0.0.1:6379> hset hash user1:name zxh
(integer) 1
127.0.0.1:6379> hset hash user2:age 1
(integer) 1
127.0.0.1:6379> hmget hash user1:name user2:age
1) "zxh"
2) "1"

小结

hash主要用于存储用户信息之类的,经常变动的信息!hash更适合对象的存储,String类型更适合字符串存储!

Zset(有序集合)

Zset就是在set集合上,增加了一个值,比如:set k1 v1,现在是zset k1 score1 v1

我们就可以针对score1 这个值进行一些操作:比如排序

  • zadd key score member [score member...]:添加一个或者多个元素

  • zrange key start end [withscores]:指定区间获取set集合的元素,可以设置是否显示score字段

  • zrangebyscore key min max [withscores]:根据指定的score进行升序排列

  • zrevrange key start stop [withscores]:根据指定的score进行降序排列

  • zrem key member [member...]:删除一个或者多个元素

  • zcard key:获取set集合的长度/大小

  • zcount salary min max:统计个数,按照score属性的区间进行,在[min,max]之间的个数

################### 添加、获取 #######################
127.0.0.1:6379> zadd set 1 one 2 two 3 three    # 添加一个或者多个元素
(integer) 3
127.0.0.1:6379> zrange set 0 -1    # 指定区间获取set集合的元素
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zrange set 0 -1 withscores    # 指定区间获取set集合的元素,包含score字段
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"

################### 排序(升序和降序) #######################
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 zxh
(integer) 1
# 根据指定的score进行升序排列,+-inf表示正无穷大和负无穷大
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "zxh"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
1) "zxh"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
# 根据指定的score进行降序排列
127.0.0.1:6379> zrevrange salary 0 -1
1) "zhangsan"
2) "xiaohong"
3) "zxh"
# 显示工资小于2500的人并按升序排列
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores
1) "zxh"
2) "500"
3) "xiaohong"
4) "2500"

################### 删除、长度 #######################
127.0.0.1:6379> zrange salary 0 -1
1) "zxh"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zxh"
2) "zhangsan"
127.0.0.1:6379> zcard salary
(integer) 2

################### 按score统计 #######################
127.0.0.1:6379> zrange salary 0 -1
1) "zxh"
2) "zhangsan"
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zxh"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zcount salary 0 2500    # 统计区间内的元素个数
(integer) 2
127.0.0.1:6379> zcount salary 0 5000
(integer) 3

其他的API参考官网,工作中有用到可以去查看!

小结

  • 既然时有序的,可以对班级的成绩,工资表进行排序!

  • 比如b站的排行榜,统计视频的播放量,放到Zset进行排序,每天进行操作即可!

  • 普通消息是1,重要的消息是2,可以进行带权重进行判断!

相关推荐

DiamondTao / 0评论 2020-08-30