Redis五大数据类型
Posted 忘忧山的兰木
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis五大数据类型相关的知识,希望对你有一定的参考价值。
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:设置值
-
-
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
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
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,和栈相同,后放入的在最上面
创建、获取、弹出
-
lpush key value [value...]:将一个或多个值,插入到列表的头部(也就是左边)
-
lrange
-
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:替换列表中指定下标的值
-
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集合的大小
-
以上是关于Redis五大数据类型的主要内容,如果未能解决你的问题,请参考以下文章