Redis基础

Redis

Redis(remote dictionary server)是一个基于KEY-VALUE的高性能的存储系统

Docker安装redis

$ docker pull redis

$ docker run --name myredis -d -p 6379:6379 redis

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
c92daf4edbfe   redis     "docker-entrypoint.s…"   32 seconds ago   Up 32 seconds   0.0.0.0:6379->6379/tcp   myredis

连接redis

$ redis-cli -v
redis-cli 7.0.9

$ redis-cli
127.0.0.1:6379>

字符串

1、设置和获取键值对:get / set

127.0.0.1:6379> set name jim
OK
127.0.0.1:6379> get name
"jim"

2、查询是否存在和查询所有键: exists / keys

127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists age
(integer) 0
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set sex male
OK
127.0.0.1:6379> get sex
"male"
127.0.0.1:6379> keys *
1) "sex"
2) "name"

3、删除键值对:del

127.0.0.1:6379> keys *
1) "sex"
2) "name"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> keys *
1) "sex"

4、批量设置键值对:mset / mget

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset name jim sex male
OK
127.0.0.1:6379> mget name sex
1) "jim"
2) "male"
127.0.0.1:6379> keys *
1) "sex"
2) "name"

5、设置过期时间:expire

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name jim
OK
127.0.0.1:6379> get name
"jim"
127.0.0.1:6379> expire name 5  #5s后过期            
(integer) 1
127.0.0.1:6379> get name       #等待5s
(nil)

6、计数

127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> incr num
(integer) 3
127.0.0.1:6379> get num
"3"
127.0.0.1:6379> incrby num 10
(integer) 13
127.0.0.1:6379> get num
"13"

127.0.0.1:6379> decr num
(integer) 12
127.0.0.1:6379> decr num
(integer) 11
127.0.0.1:6379> get num
"11"
127.0.0.1:6379> decrby num 5
(integer) 6
127.0.0.1:6379> get num
"6"

7、为 key 设置一个值并返回原值:getset

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name jim
OK
127.0.0.1:6379> getset name tom
"jim"
127.0.0.1:6379> get name
"tom"

列表

1、向 list 的左边(头部)添加元素:lpush

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush nums 1
(integer) 1
127.0.0.1:6379> lpush nums 2
(integer) 2
127.0.0.1:6379> lpush nums 3
(integer) 3
127.0.0.1:6379> lrange nums 0 10
1) "3"
2) "2"
3) "1"

2、向 list 的右边(尾部)添加元素:rpush

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush nums 1
(integer) 1
127.0.0.1:6379> rpush nums 2
(integer) 2
127.0.0.1:6379> rpush nums 3
(integer) 3
127.0.0.1:6379> lrange nums 0 10
1) "1"
2) "2"
3) "3"

3、从 list 中取出指定下表的元素: lindex

127.0.0.1:6379> lrange nums 0 10
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lindex nums 0
"1"
127.0.0.1:6379> lindex nums 1
"2"
127.0.0.1:6379> lindex nums 2
"3"
127.0.0.1:6379> lindex nums 3
(nil)
127.0.0.1:6379> lindex nums 10
(nil)

4、list 实现队列

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush nums 1 2 3
(integer) 3
127.0.0.1:6379> lrange nums 0 10
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lpop nums
"1"
127.0.0.1:6379> lpop nums
"2"
127.0.0.1:6379> lpop nums
"3"
127.0.0.1:6379> lpop nums
(nil)
127.0.0.1:6379> lrange nums 0 10
(empty array)

5、list 实现栈

127.0.0.1:6379> flushdb
OK clear
127.0.0.1:6379> rpush nums 1 2 3
(integer) 3
127.0.0.1:6379> lrange nums 0 10
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> rpop nums
"3"
127.0.0.1:6379> rpop nums
"2"
127.0.0.1:6379> rpop nums
"1"
127.0.0.1:6379> rpop nums
(nil)

字典

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset people name jim
(integer) 1
127.0.0.1:6379> hset people age 20
(integer) 1
127.0.0.1:6379> hset people address beijing
(integer) 1
127.0.0.1:6379> hgetall people                         # key 和 value 间隔出现
1) "name"
2) "jim"
3) "age" 
4) "20"
5) "address"
6) "beijing"
127.0.0.1:6379> hget people name
"jim"
127.0.0.1:6379> hset people name tom                   # 因为是更新操作,所以返回 0
(integer) 0
127.0.0.1:6379> hget people name
"tom"
127.0.0.1:6379> hmset people sex male phone 18614023236 # 批量操作
OK
127.0.0.1:6379> hgetall people
 1) "name"
 2) "tom"
 3) "age"
 4) "20"
 5) "address"
 6) "beijing"
 7) "sex"
 8) "male"
 9) "phone"
10) "18614023236"

集合

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> sadd books java
(integer) 1
127.0.0.1:6379> sadd books java           # 重复添加
(integer) 0
127.0.0.1:6379> smembers books。          # 查看集合元素
1) "java"
127.0.0.1:6379> sadd books golang         # 再次添加
(integer) 1
127.0.0.1:6379> sadd books javascript nodejs # 再次添加
(integer) 2
127.0.0.1:6379> smembers books            # 查看集合元素
1) "javascript"
2) "golang"
3) "nodejs"
4) "java"
127.0.0.1:6379> sadd books golang          # 重复添加
(integer) 0
127.0.0.1:6379> sismember books java       # 查询某个 value 是否存在,相当于 contains
(integer) 1
127.0.0.1:6379> scard books                # 获取长度
(integer) 4
127.0.0.1:6379> spop books                 # 弹出一个
"nodejs"

有序列表

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd books 9.1 "think in java"
(integer) 1
127.0.0.1:6379> zadd books 9.3 "think in java2"
(integer) 1
127.0.0.1:6379> zadd books 8.2 "go lang program"
(integer) 1
127.0.0.1:6379> zrange books 0 -1      # 按 score 排序列出(正序),参数区间为排名范围
1) "go lang program"
2) "think in java"
3) "think in java2"
127.0.0.1:6379> zrevrange books 0 -1   # 按 score 逆序列出,参数区间为排名范围
1) "think in java2"
2) "think in java"
3) "go lang program"
127.0.0.1:6379> zcard books             # 相当于 count()
(integer) 3
127.0.0.1:6379> zscore books "think in java"      # 获取指定 value 的 score
"9.0999999999999996"
127.0.0.1:6379> zrank books "think in java"       # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题
(integer) 1
127.0.0.1:6379> zrank books "think in java2"      # 排名
(integer) 2
127.0.0.1:6379> zrangebyscore books 0 9          # 根据分值区间遍历 zset
1) "go lang program"
127.0.0.1:6379> zrangebyscore books -inf 9.2 withscores   # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。
1) "go lang program"
2) "8.1999999999999993"
3) "think in java"
4) "9.0999999999999996"
127.0.0.1:6379> zrem books "think in java"          # 删除 value
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "go lang program"
2) "think in java2"