Redis五大数据类型

Posted 忘忧山的兰木

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis五大数据类型相关的知识,希望对你有一定的参考价值。

引用学习:https://space.bilibili.com/95256449/

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

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

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类型,可以玩成栈、队列、阻塞队列!

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中的值是不能重复的!