概述
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
Redis有16个数据库,默认使用第0个数据库。Redis是单线程的。
String类型
- set(key, value):给数据库中名称为 key 的 string 赋予值 value
127.0.0.1:6379> set name makunpeng
OK
127.0.0.1:6379> keys *
1) "name"
- get(key):返回数据库中名称为 key 的 string 的 value
127.0.0.1:6379> get name
"makunpeng"
- getset(key, value):给名称为 key 的 string 赋予上一次的 value
127.0.0.1:6379> getset age 25 //没有该key不会自动创建,返回nil
(nil)
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> getset age 25 //存在该key则先返回key的原值,之后用新值替换原值
"20"
127.0.0.1:6379> get age
"25"
- setnx(key, value):若key不存在,创建key,写入value;若key存在,则创建失败。
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> setnx sex male
(integer) 1
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"
127.0.0.1:6379> setnx sex female
(integer) 0
- setex(key, time, value):向库中添加 string,设定过期时间 time
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"
127.0.0.1:6379> setex age 10 25
OK
127.0.0.1:6379> ttl age
(integer) -2
127.0.0.1:6379> keys *
1) "sex"
2) "name"
- mset(key N, value N):批量设置多个 string 的值
127.0.0.1:6379> keys *
1) "sex"
2) "name"
127.0.0.1:6379> mset age 25 k1 hello k2 world
OK
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "k1"
4) "k2"
5) "name"
- mget(key1, key2,…, key N):返回库中多个 string 的 value
127.0.0.1:6379> mget name age sex k1 k2
1) "makunpeng"
2) "25"
3) "male"
4) "hello"
5) "world"
- msetnx(key N, value N):如果所有名称为 key 的 string 都不存在(原子性:要么都成功,要么都失败。)
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "k1"
4) "k2"
5) "name"
127.0.0.1:6379> msetnx name zhangsan k4 haha
(integer) 0
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "k1"
4) "k2"
5) "name"
127.0.0.1:6379> msetnx k4 haha k5 hehe
(integer) 1
127.0.0.1:6379> keys *
1) "k4"
2) "sex"
3) "age"
4) "k1"
5) "k5"
6) "k2"
7) "name"
- incr(key):名称为 key 的 string 增 1 操作
127.0.0.1:6379> mset money 100 out 0
OK
127.0.0.1:6379> incr out
(integer) 1
127.0.0.1:6379> get out
"1"
- incrby(key, integer):名称为 key 的 string 增加 integer增量
127.0.0.1:6379> get out
"1"
127.0.0.1:6379> incrby out 19
(integer) 20
127.0.0.1:6379> get out
"20"
- decr(key):名称为 key 的 string 减 1 操作
127.0.0.1:6379> decr money
(integer) 99
127.0.0.1:6379> get money
"99"
- decrby(key, integer):名称为 key 的 string 减少 integer减量
127.0.0.1:6379> get money
"99"
127.0.0.1:6379> decrby money 19
(integer) 80
127.0.0.1:6379> get money
"80"
- append(key, value):名称为 key 的 string 的值附加 value
127.0.0.1:6379> set k1 hello
OK
127.0.0.1:6379> get k1
"hello"
127.0.0.1:6379> APPEND k1 world
(integer) 10
127.0.0.1:6379> get k1
"helloworld"
- getrange(key,beginIndex,endIndex):返回按指定范围截取的字符串
127.0.0.1:6379> get k1
"helloworld"
127.0.0.1:6379> GETRANGE k1 2 4
"llo"
- setrange(key,Index,val):替换指定位置的字符串
127.0.0.1:6379> get k1
"helloworld,zhangsan"
127.0.0.1:6379> setrange k1 11 ,mkp
(integer) 19
127.0.0.1:6379> get k1
"helloworld,,mkpgsan"
- substr(key, start, end):返回名称为 key 的 string 的 value 的子串
127.0.0.1:6379> get k1
"helloworld,,mkpgsan"
127.0.0.1:6379> substr k1 12 15
"mkpg"
String类型的应用场景:
- 计数器
- 统计多单位数量
- 粉丝数
- 对象缓存存储
List类型(有序、可重复)
- rpush(key, value):在名称为 key 的 list 尾添加一个值为 value 的元素
127.0.0.1:6379> rpush name mkp
(integer) 1
127.0.0.1:6379> rpush name lisi
(integer) 2
127.0.0.1:6379> rpush name zhangsan
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
3) "zhangsan"
- lpush(key, value):在名称为 key 的 list 头添加一个值为 value 的元素
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
- llen(key):返回名称为 key 的 list 的长度
127.0.0.1:6379> llen list
(integer) 3
- lrange(key, start, end):返回名称为 key 的 list 中 start 至 end 之间的元素
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
- ltrim(key, start, end):截取名称为 key 的 list
127.0.0.1:6379> ltrim list 1 2
OK
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
- lindex(key, index):返回名称为 key 的 list 中 index 位置的元素
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
3) "zhangsan"
127.0.0.1:6379> lindex name 2
"zhangsan"
- lset(key, index, value):给名称为 key 的 list 中 index 位置的元素赋值
127.0.0.1:6379> lindex name 2
"zhangsan"
127.0.0.1:6379> lset name 2 John
OK
127.0.0.1:6379> lindex name 2
"John"
- lrem(key, count, value):删除 count 个 key 的 list 中值为 value 的元素
127.0.0.1:6379> lrange name 0 -1
1) "Tom"
2) "Tom"
3) "Tom"
4) "Tom"
5) "mkp"
6) "lisi"
7) "John"
127.0.0.1:6379> lrem name 3 Tom
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "Tom"
2) "mkp"
3) "lisi"
4) "John"
- lpop(key):返回并删除名称为 key 的 list 中的首元素
127.0.0.1:6379> lrange name 0 -1
1) "Tom"
2) "mkp"
3) "lisi"
4) "John"
127.0.0.1:6379> lpop name
"Tom"
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
3) "John"
- rpop(key):返回并删除名称为 key 的 list 中的尾元素
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
3) "John"
127.0.0.1:6379> rpop name
"John"
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
- linsert(key,before/after,Val ,insertVal):将某个值插入到列表中的指定元素的前一位或者后一位
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
127.0.0.1:6379> linsert name before mkp jack
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "jack"
2) "mkp"
3) "lisi"
127.0.0.1:6379> linsert name after lisi Tom
(integer) 4
127.0.0.1:6379> lrange name 0 -1
1) "jack"
2) "mkp"
3) "lisi"
4) "Tom"
- rpoplpush(srckey, dstkey):返回并删除名称为 srckey 的 list 的尾元素,并将该元素添加到名称为 dstkey 的 list 的头部
127.0.0.1:6379> lrange name 0 -1
1) "jack"
2) "mkp"
3) "lisi"
4) "Tom"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> rpoplpush name list
"Tom"
127.0.0.1:6379> lrange name 0 -1
1) "jack"
2) "mkp"
3) "lisi"
127.0.0.1:6379> lrange list 0 -1
1) "Tom"
2) "two"
3) "one"
List实际上是一个双向链表。若key不存在,创建一个新链表;若key存在,新增内容。移除所有值,空链表,也就代表不存在。在两边插入或改动值,效率最高;插入中间元素,效率相对较低。
Set类型(无序、无重复)
- sadd(key, member...):向名称为 key 的 set 中添加一个或多个元素 member
127.0.0.1:6379> sadd name mkp
(integer) 1
127.0.0.1:6379> sadd name mkp xiaofu panghu //redis单条指令遵循原子性,即要么都成功,要么都失败。
(integer) 0
127.0.0.1:6379> sadd name xiaofu panghu daxiong jingxiang
(integer)
- smembers(key) :返回名称为 key 的 set 的所有元素
127.0.0.1:6379> smembers name
1) "jingxiang"
2) "xiaofu"
3) "xiaohong"
4) "mkp"
5) "daxiong"
6) "panghu"
- srem(key, member) :删除名称为 key 的 set 中的元素 member
127.0.0.1:6379> smembers name
1) "jingxiang"
2) "xiaofu"
3) "xiaohong"
4) "mkp"
5) "daxiong"
6) "panghu"
127.0.0.1:6379> srem name xiaohong
(integer) 1
127.0.0.1:6379> smembers name
1) "jingxiang"
2) "xiaofu"
3) "mkp"
4) "daxiong"
5) "panghu"
- srandmember(key) :随机返回名称为 key 的 set 的一个元素
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
127.0.0.1:6379> srandmember name
"mkp"
- spop(key) :随机返回并删除名称为 key 的 set 中一个元素
127.0.0.1:6379> smembers name
1) "jingxiang"
2) "xiaofu"
3) "mkp"
4) "daxiong"
5) "panghu"
127.0.0.1:6379> spop name
"jingxiang"
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
- smove(srckey, dstkey, member) :移到集合元素
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
127.0.0.1:6379> smove name set panghu
(integer) 1
127.0.0.1:6379> smembers set
1) "panghu"
- scard(key) :返回名称为 key 的 set 的长度
127.0.0.1:6379> scard name
(integer) 3
- sismember(key, member) :member 是否是名称为 key 的 set 的元素
127.0.0.1:6379> sismember name mkp
(integer) 1
127.0.0.1:6379> sismember name panghu
(integer) 0
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
- sinter(key1, key2,…key N) :求交集
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
5) "jack"
127.0.0.1:6379> smembers set
1) "xiaofu"
2) "tom"
3) "panghu"
4) "jack"
127.0.0.1:6379> sinter name set
1) "xiaofu"
2) "panghu"
3) "jack"
- sunion(key1, (keys)) :求并集
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
5) "jack"
127.0.0.1:6379> smembers set
1) "xiaofu"
2) "tom"
3) "panghu"
4) "jack"
127.0.0.1:6379> sunion name set
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "tom"
5) "panghu"
6) "jack"
- sdiff(key1, (keys)) :求差集
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
5) "jack"
127.0.0.1:6379> smembers set
1) "xiaofu"
2) "tom"
3) "panghu"
4) "jack"
127.0.0.1:6379> sdiff name set
1) "daxiong"
2) "mkp"
set类型的应用场景:
利用set集合的无序、无重复的特性,再加上它可以进行求解两集合的交、并、差集的方法,我们可以用它来做:
- 微博、博客的共同关注
- 微信好友间的共同爱好
- 微信、QQ等社交软件的推荐好友(六度分割理论)
Hash类型
- hset(key, field, value):向名称为 key 的 hash 中添加元素 field
127.0.0.1:6379> hset User name mkp
(integer) 1
- hget(key, field):返回名称为 key 的 hash 中 field 对应的 value
127.0.0.1:6379> hget User name
"mkp"
- hmset(key, (fields)):添加多个值
127.0.0.1:6379> hmset User name mkp age 25 sex male
OK
- hmget(key, (fields)):获取多个值
127.0.0.1:6379> hmget User name age sex
1) "mkp"
2) "25"
3) "male"
- hincrby(key, field, integer):将名称为 key 的 hash 中 field 的 value 增加 integer 量
127.0.0.1:6379> hget User age
"25"
127.0.0.1:6379> hincrby User age 10
(integer) 35
- hexists(key, field):名称为 key 的 hash 中是否存在键为 field 的域
127.0.0.1:6379> HEXISTS User name
(integer) 1
127.0.0.1:6379> HEXISTS User k1
(integer) 0
- hdel(key, field):删除名称为 key 的 hash 中键为 field 的域
127.0.0.1:6379> hkeys User
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hdel User age
(integer) 1
127.0.0.1:6379> hkeys User
1) "name"
2) "sex"
- hlen(key):返回名称为 key 的 hash 中元素个数
127.0.0.1:6379> hkeys User
1) "name"
2) "sex"
127.0.0.1:6379> hlen User
(integer) 2
- hkeys(key):返回名称为 key 的 hash 中所有键
127.0.0.1:6379> hkeys User
1) "name"
2) "sex"
- hvals(key):返回名称为 key 的 hash 中所有键对应的 value
127.0.0.1:6379> hvals User
1) "mkp"
2) "male"
- hgetall(key):返回名称为 key 的 hash 中所有的键(field)及其对应的 value
127.0.0.1:6379> hgetall User
1) "name"
2) "mkp"
3) "sex"
4) "male"
- hsetnx(key,fields):存在该key,则设置值;不存在,则不可设置值。
127.0.0.1:6379> hsetnx User age 25
(integer) 1
127.0.0.1:6379> hgetall User
1) "name"
2) "mkp"
3) "sex"
4) "male"
5) "age"
6) "25"
127.0.0.1:6379> hsetnx User age 10
(integer) 0
127.0.0.1:6379> hgetall User
1) "name"
2) "mkp"
3) "sex"
4) "male"
5) "age"
6) "25"
hash类型适合存储变更数据,更适合对象的存储。
sorted sets类型(“有序”,无重复,可以根据sorted排序)
- zadd(key,element...):在名称为key的set里添加一个或多个element。
127.0.0.1:6379> zadd salary 2000 mkp
(integer) 1
127.0.0.1:6379> zadd salary 2500 tom
(integer) 1
127.0.0.1:6379> zadd salary 3500 jack
(integer) 1
- zrange(key,start,end):查看set中指定范围内的所有元素。
127.0.0.1:6379> zrange salary 0 -1
1) "mkp"
2) "tom"
3) "jack"
- zrangebyscore(key,-inf,+inf):查看set中的所有元素,并从小到大排序。
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "mkp"
2) "tom"
3) "jack"
- zrevrange(key,0,-1):查看set中的所有元素,并从大到小排序。
127.0.0.1:6379> zrevrange salary 0 -1
1) "jack"
2) "tom"
3) "mkp"
- zrem(key,element):从set中移除指定元素。
127.0.0.1:6379> zrem salary tom
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "mkp"
2) "jack"
- zcard(key):获取set长度。
127.0.0.1:6379> zcard salary
(integer) 3
- zcount(key,start,end):获取指定区间的元素数量。
127.0.0.1:6379> zcount salary 2000 2800
(integer) 2
sorted sets类型应用场景:
- 存储成绩表、工资表。
- 带权重进行判断。
- 网易云音乐热榜,TopN测试。