基本命令:
100.69.12.9:6379> set name runoob
OK
100.69.12.9:6379> get name
"runoob"
100.69.12.9:6379>
# set if not exist
100.69.12.9:6379> setnx job se
(integer) 1
100.69.12.9:6379> setnx job se
(integer) 0
100.69.12.9:6379>
# set + expire
100.69.12.9:6379> setex job 5 mde
OK
100.69.12.9:6379> get job
"mde"
100.69.12.9:6379> get job
(nil)
100.69.12.9:6379>
# set if not exist and expire
100.69.12.9:6379> set job job EX 5 NX
OK
100.69.12.9:6379> get job
"job"
100.69.12.9:6379> get job
(nil)
100.69.12.9:6379>
设置了过期时间后再set,会清除过期时间
如果list结构中添加一个数据或者改变hset数据的一个字段是不会清除超时时间的;如果想要通过set去覆盖值那就必须重新设置expire。
100.69.12.9:6379> set job mde
OK
100.69.12.9:6379> expire job 5
(integer) 1
100.69.12.9:6379> set job ssse
OK
100.69.12.9:6379> get job
"ssse"
100.69.12.9:6379> get job
"ssse"
100.69.12.9:6379> get job
"ssse"
100.69.12.9:6379>
一次操作多个key
100.69.12.9:6379> mset food mice computer leneve movie TheWD
OK
100.69.12.9:6379> mget food computer movie
1) "mice"
2) "leneve"
3) "TheWD"
100.69.12.9:6379>
计数:
100.69.12.9:6379> set age 20
OK
100.69.12.9:6379> incr age
(integer) 21
100.69.12.9:6379> decr age
(integer) 20
100.69.12.9:6379> incrby age 5
(integer) 25
100.69.12.9:6379> decrby age 5
(integer) 20
100.69.12.9:6379> incrby age -1
(integer) 19
100.69.12.9:6379>
KEYS pattern
查找所有符合给定模式 pattern 的 key 。
KEYS * 匹配数据库中所有 key
KEYS h?llo 匹配 hello , hallo 和 hxllo 等
KEYS h*llo 匹配 hllo 和 heeeeello 等
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
100.69.12.9:6379> keys *
1) "age"
2) "food"
3) "name"
4) "computer"
5) "job"
6) "fod"
7) "movie"
100.69.12.9:6379> keys f*d
1) "food"
2) "fod"
100.69.12.9:6379> keys f?d
1) "fod"
100.69.12.9:6379> keys n[a]me
1) "name"
100.69.12.9:6379>
返回目录
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
记录帖子的点赞数、评论数和点击数 (hash)。
记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。
缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。
缓存用户行为历史,进行恶意行为过滤 (zset,hash)。
命令:
redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"
返回目录
Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。
命令:
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
100.69.12.9:6379> lpush books java c c++ golang
(integer) 8
# 获取books的所有元素
100.69.12.9:6379> lrange books 0 -1
1) "golang"
2) "c++"
3) "c"
4) "java"
5) "golang"
6) "c++"
7) "c"
8) "java"
# 第二个元素
100.69.12.9:6379> lindex books 1
"c++"
# 只保留第4个到第9个元素
100.69.12.9:6379> ltrim books 3 8
OK
100.69.12.9:6379> lrange books 0 -1
1) "java"
2) "golang"
3) "c++"
4) "c"
5) "java"
# 清空books
100.69.12.9:6379> ltrim books 1 0
OK
100.69.12.9:6379> lrange books 0 -1
(empty list or set)
100.69.12.9:6379>
100.69.12.9:6379> lpush books java c c++ golang
(integer) 4
100.69.12.9:6379> rpop books
"java"
100.69.12.9:6379> rpop books
"c"
100.69.12.9:6379> rpop books
"c++"
100.69.12.9:6379> rpop books
"golang"
100.69.12.9:6379> rpop books
(nil)
100.69.12.9:6379>
100.69.12.9:6379> lpush books java c c++ golang
(integer) 4
100.69.12.9:6379> lpop books
"golang"
100.69.12.9:6379> lpop books
"c++"
100.69.12.9:6379> lpop books
"c"
100.69.12.9:6379> lpop books
"java"
100.69.12.9:6379> lpop books
(nil)
100.69.12.9:6379>
返回目录
特点:Redis的Set是string类型的无序集合。值的集合不能重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
命令:
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "redis"
2) "rabitmq"
3) "mongodb"
> sadd books python
(integer) 1
> sadd books python # 重复
(integer) 0
> sadd books java golang
(integer) 2
> smembers books # 注意顺序,和插入的并不一致,因为 set 是无序的
1) "java"
2) "python"
3) "golang"
> sismember books java # 查询某个 value 是否存在,相当于 contains(o)
(integer) 1
> sismember books rust
(integer) 0
> scard books # 获取长度相当于 count()
(integer) 3
> spop books # 弹出一个
"java"...
返回目录
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。
zset 还可以用来存储学生的成绩,value 值是学生的 ID,score 是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。…
命令:
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
> zadd books 9.0 "think in java"
(integer) 1
> zadd books 8.9 "java concurrency"
(integer) 1
> zadd books 8.6 "java cookbook"
(integer) 1
> zrange books 0 -1 # 按 score 排序列出,参数区间为排名范围
1) "java cookbook"
2) "java concurrency"
3) "think in java"
> zrevrange books 0 -1 # 按 score 逆序列出,参数区间为排名范围
1) "think in java"
2) "java concurrency"
3) "java cookbook"
> zcard books # 相当于 count()
(integer) 3
> zscore books "java concurrency" # 获取指定 value 的 score
"8.9000000000000004" # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题
> zrank books "java concurrency" # 排名
(integer) 1
> zrangebyscore books 0 8.91 # 根据分值区间遍历 zset
1) "java cookbook"
2) "java concurrency"
> zrangebyscore books -inf 8.91 withscores # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"
> zrem books "java concurrency" # 删除 value
(integer) 1
> zrange books 0 -1
1) "java cookbook"
2) "think in java"...
返回目录
参考:
掘金小册:Redis 深度历险:核心原理与应用实践