Redis五大数据类型
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中的值是不能重复的!
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,可以进行带权重进行判断!