redis基本API的理解和使用

前言

在正式介绍5种数据结构之前,了解一下Redis的一些全局命令、数据结构和内部编码等。

全局命令
  • 查看所有键
    keys * —o(n)
  • 键总数
    dbsize —o(1)
  • 检查键是否存在
    exists key—o(1)如果键存在则返回1,不存在则返回0
  • 删除键
    del key [key ...]—o(1)通用所有的数据结果
  • 键过期
    expire key seconds 设置过期时间
    ttl key 剩余过期时间,它有3种返回值:(1)大于等于0的整数:键剩余的过期时间。(2)-1:键没设置过期时间。(3)-2:键不存在
  • 键的数据结构类型
    type key
5种数据结构
字符串

字符串类型是Redis最基础的数据结构,字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML)、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

字符串数据结构.png
* 命令
(1)设置值
set key value [ex seconds] [px milliseconds] [nx|xx]

set hello world
OK

set命令有几个选项:
·ex seconds:为键设置秒级过期时间。
·px milliseconds:为键设置毫秒级过期时间。
·nx:键必须不存在,才可以设置成功,用于添加。
·xx:与nx相反,键必须存在,才可以设置成功,用于更新。
除了set选项, Redis还提供了setex和setnx两个命令:

setex key seconds value
setnx key value

(2)获取值
get key

127.0.0.1:6379> get hello
"world"

(3)批量设置/获取值
mset/mget key value [key value ...]
(4)计算相关
incr key (自增)、decr(自减)、 incrby(自增指定数字)、decrby(自减指定数字)、 incrbyfloat(自增浮点数)
(5)不常用命令
append key value(追加)、strlen key(字符长度)、getset key value(设置并返回原值)、setrange key offeset value(设置指定位置的字符)等

字符串类型命令时间复杂度.png

  • 内部编码
    (1)int: 8个字节的长整型。
    (2)embstr:小于等于39个字节的字符串。
    (3)raw:大于39个字节的字符串
  • 典型使用场景
    (1)缓存功能
    (2)计数
    (3)共享Session
    (4)限速等
哈希

哈希类型是指键值本身又是一个键值对结构,形如value={{field1, value1}, ...{fieldN,valueN}}
字符串和哈希类型对比.png
  • 命令
    (1)设置/获取值
    hset/hget key field value
    (2)删除field
    hdel key field [field ...]
    (3)批量设置或获取field-value
    hmget key field [field ...]/hmset key field value [field value ...]
    (4)判断field是否存在
    hexists key
    (5)获取所有field/获取所有value
    hkeys/ hvals key
    (6)其他等
    hgetall key(获取所有的field-value)、hincrby key field,hincrbyfloat key field(像incrby和incrbyfloat命令一样,但是它们的作用域是filed)、hstrlen key field(计算长度)等
    哈希类型命令的时间复杂度.png
  • 内部编码
    (1)ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节时, Redis会使用ziplist作为哈希的内部实现, ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
    (2)hashtable(哈希表):当哈希类型无法满足ziplist的条件时, Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)
  • 使用场景
    (1)缓存对象信息,省去string序列化消耗
    (2)哈希类型是稀疏的
列表

列表( list)类型是用来存储多个有序且重复的字符串。

  • 命令
    (1)添加操作
    rpush key value [value ...](右边添加)、lpush key value [value ...](左边添加)、linsert key before|after pivot value(向某个元素前或者后插入元素)
    (2)查询
    lrange key start end(指定范围内的元素列表)、lindex key index(列表指定索引下标的元素)、llen key(列表长度)
    (3)删除
    lpop key(左边删除)、rpop key(右边删除)、lrem key count value(删除指定元素)
    (4)修改
    lset key index newValue
    列表命令时间复杂度.png
  • 内部编码
    (1)ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节), Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
    (2)linkedlist(链表):当列表类型无法满足ziplist的条件时, Redis会使用linkedlist作为列表的内部实现。
  • 使用场景
    (1)消息队列
    (2)文章列表
集合

集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。
集合类型.png
  • 命令
    (1)集合内操作
    sadd key element [element ...](添加元素)、srem key element [element ...](删除元素)、scard key(计算个数)、sismember key element(判断是否在集合中)、srandmember key [count](随即取指定元素)、spop key(随即弹出元素)、smembers key(获取所有元素)
    (2)集合间操作
    sinter key [key ...](交集)、suinon key [key ...](并集)、sdiff key [key ...](差集)
    集合常用命令时间复杂度.png
  • 内部编码
    (1)intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)时, Redis会选用intset来作为集合的内部实
    现,从而减少内存的使用。
    (2)hashtable(哈希表):当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现。
  • 使用场景
    (1)打标签。
    (2)计算共同爱好用户等。
有序集合

有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数( score)作为排序的依据。

eg:
有序集合.png
  • 命令
    (1)集合内操作
    zadd key score member [score member...](添加元素)、zscore key member(计算某个成员的分数)、zcard key(计算个数)、zrank/zrevrank key member(排名)等
    (2)集合间操作
    zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](交集)、zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](并集)
这个命令参数较多,下面分别进行说明:
(1)destination:交集计算结果保存到这个键。
(2)numkeys:需要做交集计算键的个数。
(3)key[key...]:需要做交集计算的键。
(4)weights weight[weight...]:每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
(5)aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、min(最小值)、 max(最大值)做汇总,默认值是sum。
eg:
127.0.0.1:6379> zinterstore user:ranking:1_inter_2 2 user:ranking:1
user:ranking:2
(integer) 3
有序集合命令的时间复杂度.png
  • 内部编码
    (1)ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时, Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
    (2)skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。
  • 使用场景
    (1)添加用户赞数。
    (2)取消用户赞。
    (3)展示获取赞数最多的十个用户。
    (4)展示用户信息以及用户分数。
    列表、集合和有序集合三者的异同点.png

注意事项:命令遍历所有的键,分别是keys和scan

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

推荐阅读更多精彩内容

  • Redis的内存优化 声明:本文内容来自《Redis开发与运维》一书第八章,如转载请声明。 Redis所有的数据都...
    meng_philip123阅读 18,871评论 2 29
  • 参考来源 Redis的内存优化 Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直...
    秦汉邮侠阅读 1,280评论 0 2
  • 全局命令 1.查看所有键 keys*命令会将所有的键输出,遍历O(n),线上禁用 2.键总数 dbsize命令会返...
    何何与呵呵呵阅读 693评论 0 2
  • 1.通用命令 1.1通用命令 keys *遍历所有key keys [pattern]遍历符合通配符的所有key ...
    香沙小熊阅读 495评论 0 0
  • 声明:本文内容来自《Redis开发与运维》一书第八章,如转载请声明。Redis所有的数据都在内存中,而内存又是非常...
    yoqu阅读 1,489评论 0 2