文章目录
一,redis通用命令
通用指令是部分数据类型的,都可以使用的指令,常见的有
命令 | 作用 |
---|---|
KEYS | 查看符合模板的所有key |
DEL | 删除一个指定的key |
EXISTS | 判断key是否存在 |
EXPIRE | 给一个key设置有效期,有效期到期时该key会被自动删除 |
TTL | 查看一个KEY的剩余有效期 |
select nums | 切换数据库,redis默认有16个数据库,默认使用0号数据库 |
dbsize | 产看当前数据库key的数量 |
flushdb | 清空当前库 |
flushall | 清空所有的库 |
通过help [command] 可以查看一个命令的具体用法,例如:
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> type name
string
127.0.0.1:6379> expire name 10 #设置10s到期时间
(integer) 1
127.0.0.1:6379> exists name #10s后过期了
(integer) 0
127.0.0.1:6379> keys * #在查看当前数据库所有的key,发现无了
(empty list or set)
二,redis数据类型
1. String类型
String 类型,也就是字符串类型,是Redist 中最简单的存储类型。 其value 是字符串,不过根据字符串的格式不同,又可以分为3类:
- string :普通字符串
- int:整数类型,可以做自增、自减操作
- float 浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.
1.1 String类型常见的命令
命令 | 作用 |
---|---|
SET | 添加或者修改已经存在的一个string类型的键值对 |
GET | 根据key获取string类型的value |
MSET | 批量添加多个string类型的键值对 |
MGET | 根据多个key获取多个string类型的value |
INCR | 让一个整型的key自增 |
INCRBY | 让一个整型的key自增并且指定步长 |
INCRBYFLOAT | 让一个浮点类型的数字自增并指定步长 |
SETNX | 添加一个string类型的键值对,前提是这个key不存在,否则不执行 |
SETEX | 添加一个string类型的键值对,并且指定有效期 |
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> get name
"thenie"
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> append name Shuai #向指定字符串后加Shuai
(integer) 11
127.0.0.1:6379> get name
"thenieShuai"
127.0.0.1:6379> DECR age #自减
(integer) 17
127.0.0.1:6379> INCR age #自增
(integer) 18
127.0.0.1:6379> DECRBY age 5 #指定减少
(integer) 13
127.0.0.1:6379> INCRBY age 5
(integer) 18
127.0.0.1:6379> STRLEN age #返回字符串长度
(integer) 2
127.0.0.1:6379> getrange name 0 -1 #返回完整字符串
"thenieShuai"
127.0.0.1:6379> getrange name 0 6 #返回下标为0~6的字符串
"thenieS"
127.0.0.1:6379> setrange name 6 Haokan #从6的位置开始用Haokan进行覆盖
(integer) 12
127.0.0.1:6379> get name
"thenieHaokan"
127.0.0.1:6379> GETSET name kuaijieshule #返回name的值,并进行指定的修改
"thenieHaokan"
127.0.0.1:6379> GET name
"kuaijieshule"
127.0.0.1:6379> setnx name , #创建,失败,因为存在key为name
(integer) 0
127.0.0.1:6379> get name
"kuaijieshule"
2. Hash类型
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
2.1 hash类型常见的命令
命令 | 作用 |
---|---|
HSET key field value | 添加或者修改hash类型key的field的值 |
HGET key field | 获取一个hash类型key的field的值 |
HMSET | 批量添加多个hash类型key的field的值 |
HMGET | 批量获取多个hash类型key的field的值 |
HGETALL | 获取一个hash类型的key中所有的field和value |
HKEYS | 获取一个hash类型的key中的所有的field |
HVALS | 获取一个hash类型的key中的所有的value |
HINCRBY | 让一个hash类型的key的字段值自增并指定步长 |
HSETNX | 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行 |
HSET key field value 添加或者修改hash类型key的field的值
127.0.0.1:6379> HSET buba:user:3 name bilal
(integer) 1
127.0.0.1:6379> HSET buba:user:3 age 21
(integer) 1
HGET key field 获取一个hash类型key的field的值
127.0.0.1:6379> HGET buba:user:3 name
"bilal"
127.0.0.1:6379> HGET buba:user:3 age
"21"
HMSET 批量添加多个hash类型key的field的值
127.0.0.1:6379> HMSET buba:user:4 name bilal age 18 sex man
OK
HMGET 批量获取多个hash类型key的field的值
127.0.0.1:6379> HMGET buba:user:4 name age sex
1) "bilal"
2) "18"
3) "man"
HGETALL 获取一个hash类型的key中所有的field和value
127.0.0.1:6379> HGETALL buba:user:4
1) "name"
2) "bilal"
3) "age"
4) "18"
5) "sex"
6) "man"
HKEYS:获取一个hash类型的key中的所有的field
127.0.0.1:6379> HKEYS buba:user:4
1) "name"
2) "age"
3) "sex"
HVALS:获取一个hash类型的key中的所有的value
127.0.0.1:6379> HVALS buba:user:4
1) "bilal"
2) "18"
3) "man"
HINCRBY :让一个hash类型的key的字段值自增并指定步长
127.0.0.1:6379> HINCRBY buba:user:4 age 4
(integer) 22
127.0.0.1:6379> HVALS buba:user:4
1) "bilal"
2) "22"
3) "man"
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
127.0.0.1:6379> HSETNX buba:user:4 sex woman
(integer) 0
127.0.0.1:6379> HSETNX buba:user:3 sex woman
(integer) 1
127.0.0.1:6379> HGETALL buba:user:3
1) "name"
2) "bilal"
3) "age"
4) "21"
5) "sex"
6) "woman"
3. List 类型
Redist 中的List类型与Java中的LinkedList 类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索,列表,可以经过规则定义将其变为队列、栈、双端队列等
3.1 List类型的常见命令
正如图Redis中List是可以进行双端操作的,所以命令也就分为了LXXX和RLLL两类,有时候L也表示List例如LLEN
命令 | 作用 |
---|---|
LPUSH key element… | 向列表左侧插入一个后多个元素 |
LPOP key | 移除并返回列表左侧的第一个元素,没有返回nil |
RPUSH key | 向列表右侧插入一个或多个元素 |
RPOP key | 移除并返回列表右侧的第一个元素 |
LRENGE key star end | 返回一段角标范围的所有元素 |
BLPOP HE BRPOP | 与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是返回nil |
LLEN | 查看列表长度 |
LTRIM | 通过下标截取指定范围内的列表 |
LINSERT key BEFORE | AFTER pivot value | 在指定列表元素的前/后 插入value |
LPUSH key element… :向列表左侧插入一个后多个元素
LRENGE key star end : 返回一段角标范围的所有元素
127.0.0.1:6379> LPUSH users 1 2 3
(integer) 3
127.0.0.1:6379> LRANGE users 0 -1
1) "3"
2) "2"
3) "1"
LPOP key :移除并返回列表左侧的第一个元素,没有返回nil
127.0.0.1:6379> LPOP users
"3"
127.0.0.1:6379> LRANGE users 0 -1
1) "2"
2) "1"
RPUSH key :向列表右侧插入一个或多个元素
127.0.0.1:6379> RPUSH users 4 5 6
(integer) 5
127.0.0.1:6379> LRANGE users 0 -1
1) "2"
2) "1"
3) "4"
4) "5"
5) "6"
RPOP key :移除并返回列表右侧的第一个元素
127.0.0.1:6379> RPOP users
"6"
127.0.0.1:6379> LRANGE users 0 -1
1) "2"
2) "1"
3) "4"
4) "5"
LTRIM:通过下标截取指定范围内的列表
127.0.0.1:6379> LRANGE users 0 -1
1) "2"
2) "1"
3) "4"
4) "5"
127.0.0.1:6379> LTRIM users 1 2
OK
127.0.0.1:6379> LRANGE users 0 -1
1) "1"
2) "4"
LINSERT key BEFORE | AFTER pivot value:在指定列表元素的前/后 插入value (before)
127.0.0.1:6379> LRANGE users 0 -1
1) "1"
2) "4"
127.0.0.1:6379> LINSERT users before 1 *
(integer) 3
127.0.0.1:6379> LRANGE users 0 -1
1) "*"
2) "1"
3) "4"
LINSERT key BEFORE | AFTER pivot value:在指定列表元素的前/后 插入value (after)
127.0.0.1:6379> LRANGE users 0 -1
1) "*"
2) "1"
3) "4"
127.0.0.1:6379> LINSERT users after 1 *
(integer) 4
127.0.0.1:6379> LRANGE users 0 -1
1) "*"
2) "1"
3) "*"
4) "4"
4. set类型
Redis set 对外提供的功能与list类似,是一个列表的功能
特点
set是可以自动排重的,
当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的
redis的Set是String类型的无序集合,它底层其实是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变
4.1 set常见命令有
指令 | 作用 |
---|---|
[SADD key member1 member2] | 向set集合添加一个或多个成员 |
[SREM key member1 member2] | 移除set中的指定元素 |
SCARD key | 返回set中元素的个数 |
SISMEMBER key member | 判断一个元素是否存在于set中 |
SMEMBERS key | 获取set中的所有元素 |
[SINTER key1 key2] | 求key1和key2的交集 |
[SDIFF key1 key2] | 求key1和key2的差集 |
[SUNION key1 key2] | 求key1和key2的并集 |
[SADD key member1 member2] 向set集合添加一个或多个成员
SMEMBERS key 获取set中的所有元素
127.0.0.1:6379> SADD s1 a b c
(integer) 3
127.0.0.1:6379> SMEMBERS s1
1) "c"
2) "a"
3) "b"
[SREM key member1 [member2]]( 移除set中的指定元素
127.0.0.1:6379> SREM s1 a
(integer) 1
127.0.0.1:6379> SMEMBERS s1
1) "c"
2) "b"
SCARD key 返回set中元素的个数
127.0.0.1:6379> SCARD s1
(integer) 2
SISMEMBER key member 判断一个元素是否存在于set中
127.0.0.1:6379> SMEMBERS s1
1) "c"
2) "b"
127.0.0.1:6379> SISMEMBER s1 a
(integer) 0
127.0.0.1:6379> SISMEMBER s1 b
(integer) 1
s1和s2的差集是 A , s1和s2的交集是 B C
4.2案例 set命令练习
将下列数据用Redis 的Set集合来存储
- 张三的好友有:李四、王五、赵六
- 李四的好友有:王五、麻子、二狗
利用Set的命令实现下列功能:
- 计算张三的好友有几人 (SCARD)
- 计算张三和李四有哪些共同好友 (SINTER)
- 查询哪些人是张三的好友却不是李四的好友 (SDIFF)
- 查询张三和李四的好友总共有哪些人 (SUNION)
- 判断李四是否是张三的好友 (SISMEMBER)
- 判断张三是否是李四的好友 (SISMEMBER)
- 将李四从张三的好友列表中移除(SREM)
127.0.0.1:6379> sadd zs lisi wangwu zhaoliu #张三的好友有:李四、王五、赵六
(integer) 3
127.0.0.1:6379> sadd ls wangwu mazi ergou #李四的好友有:王五、麻子、二狗
(integer) 3
127.0.0.1:6379> SCARD zs #计算张三的好友有几人
(integer) 3
127.0.0.1:6379> SINTER zs ls #计算张三和李四有哪些共同好友
1) "wangwu"
127.0.0.1:6379> SDIFF zs ls #查询哪些人是张三的好友却不是李四的好友
1) "zhaoliu"
2) "lisi"
127.0.0.1:6379> SUNION za ls #查询张三和李四的好友总共有哪些人
1) "ergou"
2) "wangwu"
3) "mazi"
127.0.0.1:6379> SISMEMBER zs lisi #判断李四是否是张三的好友
(integer) 1
127.0.0.1:6379> SISMEMBER ls zhangsan #判断张三是否是李四的好友
(integer) 0
127.0.0.1:6379> SREM zs lisi #将李四从张三的好友列表中移除
(integer) 1
127.0.0.1:6379> SMEMBERS zs #获取张三的所有好友
1) "zhaoliu"
2) "wangwu"
5. SortedSet类型
sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性。
Redis 的 SortedSet 类型是 String 类型的有序不重复集合,与 Java 中的 TreeSet 有些类似,但是底层数据结构却差别很大。SortedSet 中的每个元素都维护着一个 score 属性,可以基于 score 属性对元素进行排序,底层实现是跳表 + 哈希表 。
应用场景:
- 因为 SortedSet 类型的有序不重复的特点,经常被用来实现排行榜这样的功能。
5.1 SortedSet的常见命令有
指令 | 作用 |
---|---|
ZADD key score member | 添加一个或多个元素到sorted sat,如果已经存在则更新其score值 |
ZREM key member | 删除sorted sat中的一个指定元素 |
ZSCORE key member | 获取sorted sat中的指定元素的score值 |
ZRANK key member | 获取sorted sat中的指定元素的排名 |
ZCARD key | 获取sorted sat中的元素个数 |
ZCOUNT key min max | 统计score值在给定范围内的所有元素的个数 |
ZINCRBT key increment member | 让sorted sat中的指定元素自增,步长为指定的increment值 |
ZRANGE key min max | 按照score排序后,获取指定范围内的元素 |
ZRANGEBYSCORE key min max | 按照score排序后,获取指定score范围内的元素 |
ZDIFF , ZINTER , ZUNION | 求差集,交集,并集 |
注意: 所有的排序默认都是升序,如果要降序则在命令的Z后面添加REV即可
zadd:添加多个score/member对到键为key的有序集合中,如果member存在,则更新score。语法:ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
:
127.0.0.1:6379> zadd fruit 50 apple 40 orange 80 balana
(integer) 3
zrem:删除有序集合中指定的元素。语法:ZREM key member [member ...]
:
127.0.0.1:6379> zrem yy xxoo
(integer) 1
127.0.0.1:6379> zrange yy 0 -1
1) "666"
2) "ooxx"
3) "xoox"
4) "oxxo"
zscore:返回有序集合中member对应的score。语法:ZSCORE key member
127.0.0.1:6379> ZADD fruit 50 apple 40 orange 80 banana
(integer) 3
127.0.0.1:6379> ZSCORE fruit banana
"80"
zrank:返回member在有序集合中从小到大的排名。语法:ZRANK key member
127.0.0.1:6379> ZADD fruit 50 apple 40 orange 80 banana
127.0.0.1:6379> ZRANK fruit orange
(integer) 0
127.0.0.1:6379> ZRANK fruit apple
(integer) 1
127.0.0.1:6379> ZRANK fruit banana
(integer) 2
zcard:返回有序集合中元素的个数。语法:ZCARD key
:
127.0.0.1:6379> ZADD fruit 50 apple 40 orange 80 banana
127.0.0.1:6379> zcard fruit
(integer) 3
zcount:统计score值在给定范围内的所有元素的个数。语法:ZCOUNT key min max
:
127.0.0.1:6379> ZADD fruit 50 apple 40 orange 80 banana
127.0.0.1:6379> ZCOUNT fruit 45 65
(integer) 1
127.0.0.1:6379> ZCOUNT fruit 40 60
(integer) 2
ZINCRBT: 让sorted sat中的指定元素自增,步长为指定的increment值
127.0.0.1:6379> ZADD fruit 50 apple 40 orange 80 banana
127.0.0.1:6379> ZINCRBY fruit 5 banana
"85"
127.0.0.1:6379> zrange fruit 0 -1 withscores
1) "orange"
2) "40"
3) "apple"
4) "50"
5) "banana"
6) "85"
ZRANGE:按照score排序后,获取指定范围内的元素。语法:ZRANGE key start stop [WITHSCORES]
:
127.0.0.1:6379> ZADD fruit 50 apple 40 orange 85 banana
127.0.0.1:6379> ZRANGE fruit 0 1
1) "orange"
2) "apple"
127.0.0.1:6379> ZRANGE fruit 0 2
1) "orange"
2) "apple"
3) "banana"
127.0.0.1:6379> ZRANGE fruit 0 3
1) "orange"
2) "apple"
3) "banana"
127.0.0.1:6379> zrange fruit 0 -1
1) "orange"
2) "apple"
3) "banana"
127.0.0.1:6379> zrange fruit 0 -1 withscores
1) "orange"
2) "40"
3) "apple"
4) "50"
5) "banana"
6) "85"
ZRANGEBYSCORE : 按照score排序后,获取指定score范围内的元素
127.0.0.1:6379> ZADD fruit 50 apple 40 orange 85 banana
127.0.0.1:6379> ZRANGEBYSCORE fruit 30 70
1) "orange"
2) "apple"
127.0.0.1:6379> ZRANGEBYSCORE fruit 30 70 WITHSCORES
1) "orange"
2) "40"
3) "apple"
4) "50"
ZREM : 删除sorted sat中的一个指定元素 语法:ZREM key member [member ...]
:
127.0.0.1:6379> ZADD fruit 50 apple 40 orange 85 banana
127.0.0.1:6379> zrem fruit banana
(integer) 1
127.0.0.1:6379> ZRANGE fruit 0 -1
1) "orange"
2) "apple"
6.2 案例 SortedSet命令练习
将班级的下列学生得分存入redis的sortedSet中:
- Jack 85, Lucy 89,Rose 82 Tom 95 ,Jerry 78 , Amy 92 , Miles 76
实现下列功能:
- 删除tom同学
- 获取Amy同学的分数
- 获取Rose同学的排名
- 查询80分以下有几个学生
- 给Amy同学加2分
- 查出成绩前3名的同学
- 查出成绩80分以下的所有同学
#将班级的下列学生得分存入redis的sortedSet中:
# Jack 85, Lucy 89,Rose 82 Tom 95 ,Jerry 78 , Amy 92 , Miles 76
127.0.0.1:6379> ZADD stus 85 Jack 89 Lusy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
(integer) 7
127.0.0.1:6379> ZREM stus Tom #删除tom同学
(integer) 1
127.0.0.1:6379> ZSCORE stus Amy #获取Amy同学的分数
"92"
127.0.0.1:6379> ZREVRANK stus Rose #获取Rose同学的排名
(integer) 3
127.0.0.1:6379> zcount stus 0 80 #查询80分以下有几个学生
(integer) 2
127.0.0.1:6379> ZINCRBY stus 2 Amy #给Amy同学加2分
"94"
127.0.0.1:6379> ZREVRANGE stus 0 2 #查出成绩前3名的同学
1) "Amy"
2) "Lusy"
3) "Jack"
127.0.0.1:6379> ZRANGEBYSCORE stus 0 80 #查出成绩80分以下的所有同学
1) "Miles"
2) "Jerry"