redis五大基本数据类型及常用指令

概述

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测试。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342