Redis学习--API的理解和使用

全局命令

1.查看所有键 keys*命令会将所有的键输出,遍历O(n),线上禁用

keys *

2.键总数 dbsize命令会返回当前数据库中键的总数(利用Redis内置的键总数变量O(1))。

dbsize

3.检查键是否存在 如果键存在则返回1,不存在则返回0

exists key

4.删除键 返回结果为成功删除键的个数

del key [key ...]

5.键过期 当超过过期时间后,会自动删除键

expire key seconds

ttl命令会返回键的剩余过期时间,大于等于0的整数:键剩余的过期时间,-1:键没设置过期时间,-2:键不存在
6.键的数据结构类型

type key
数据结构和内部编码

string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)

五种数据结构
单线程架构

Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务
为什么速度会很快?

第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。
第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间(可以参考Netty的EventLoop实现)
第三,单线程避免了线程切换和竞态产生的消耗。

Redis使用IO多路复用和自身事件模型
字符串

字符串类型是Redis最基础的数据结构,值最大不能超过512MB。
1.命令

set key value [ex seconds] [px milliseconds] [nx|xx]

ex seconds:为键设置秒级过期时间
px milliseconds:为键设置毫秒级过期时间
nx:键必须不存在,才可以设置成功,用于添加(衍生setex和setnx两个命令)
xx:与nx相反,键必须存在,才可以设置成功,用于更新

分布式锁:setnx可以实现分布式锁.

get key

获取值.

mset key value [key value ...]

批量设置值

mget key [key ...]

批量获取值
批量操作命令可以有效提高开发效率(可以节省n-1次网络请求时间)

incr key

incr命令用于对值做自增操作,返回结果分为三种情况,值不是整数,返回错误,值是整数,返回自增后的结果,键不存在,按照值为0自增,返回结果为1
除了incr命令,Redis提供了decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数):
2.典型使用场景

  • 缓存功能
  • 计数(可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源。)
  • 共享Session(可以使用Redis将用户的Session进行集中管理)
  • 限速(ip访问频率限制,短信频率限制)
哈希

形如value={{field1,value1},...{fieldN,valueN}}
1.命令

hset key field value

设置值.Redis提供了hsetnx命令,它们的关系就像set和setnx命令一样,只不过作用域由键变为field。

hget key field

获取值,不存在返回nil

hdel key field [field ...]

hdel会删除一个或多个field,返回结果为成功删除field的个数.

hlen key

计算field个数

hmget key field [field ...]
hmset key field value [field value ...]

批量设置或获取field-value

hexists key field

判断field是否存在

hkeys key

获取所有field

hvals key

获取所有value

hgetall key

获取所有的field-value

使用场景

三种方法缓存用户信息优缺点
1)原生字符串类型:每个属性一个键。

优点:简单直观,每个属性都支持更新操作。
缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以此种方案一般不会在生产环境使用。

2)序列化字符串类型:将用户信息序列化后用一个键保存。

优点:简化编程,如果合理的使用序列化可以提高内存的使用效率。
缺点:序列化和反序列化有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到Redis中。

3)哈希类型:每个用户属性使用一对field-value,但是只用一个键保存。

优点:简单直观,如果使用合理可以减少内存空间的使用。
缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存。

列表

1.命令

rpush key value [value ...]

从右边插入元素

lrange key 0 -1

可以从左到右获取列表的所有元素

lpush key value [value ...]

从左边插入元素

linsert key before|after pivot value

向某个元素前或者后插入元素,linsert命令会从列表中找到等于pivot的元素,在其前(before)或者后(after)插入一个新的元素value

lindex key index

获取列表指定索引下标的元素

llen key

获取列表长度

lpop key

从列表左侧弹出元素

lrem key count value

删除指定元素

ltrim key start end

按照索引范围修剪列表

lset key index newValue

修改指定索引下标的元素

blpop key [key ...] timeout
brpop key [key ...] timeout

阻塞式弹出 key[key...]:多个列表的键 timeout:阻塞时间(单位:秒)

内部编码

ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节)
linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现.

使用场景

1.消息队列
Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
2.文章列表

·lpush+lpop=Stack(栈)
·lpush+rpop=Queue(队列)
·lpsh+ltrim=Capped Collection(有限集合)
·lpush+brpop=Message Queue(消息队列)

集合

一个集合最多可以存储23平方-1个元素,无序不重复。

命令
sadd key element [element ...]

添加元素

srem key element [element ...]

删除元素

scard key

计算元素个数.不会遍历集合所有元素,而是直接用Redis内部的变量

sismember key element

判断元素是否在集合中

srandmember key [count]

随机从集合返回指定个数元素 [count]是可选参数,如果不写默认为1

spop key

从集合随机弹出元素

smembers key

获取所有元素,返回结果是无序的

sinter key [key ...]
suinon key [key ...]
sdiff key [key ...]

求多个集合的交集/求多个集合的并集/多个集合的差集

sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]

将交集、并集、差集的结果保存

内部编码

intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。
hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。

使用场景

sadd=Tagging集合类型比较典型的使用场景是标签(tag)
spop/srandmember=Random item(生成随机数,比如抽奖)
sadd+sinter=Social Graph(社交需求,寻找共同爱好)

有序集合

保留了集合不能有重复成员的特性,给每个元素设置一个分数(score)作为排序的依据.


列表、集合和有序集合三者的异同点
命令
zadd key score member [score member ...]

添加成员

·Redis3.2为zadd命令添加了nx、xx、ch、incr四个选项:
·nx:member必须不存在,才可以设置成功,用于添加。
·xx:member必须存在,才可以设置成功,用于更新。
·ch:返回此次操作后,有序集合元素和分数发生变化的个数
·incr:对score做增加,相当于后面介绍的zincrby。

zcard key

计算成员个数

zscore key member

计算某个成员的分数

zrank key member
zrevrank key member(反着来)

计算成员的排名

zrem key member [member ...]

删除成员

zincrby key increment member

增加成员的分数

zrange key start end [withscores]
zrevrange key start end [withscores]

zrange是从低到高返回,zrevrange反之。

zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]

返回指定分数范围的成员,同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大

内部编码

ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。

使用场景

有序集合比较典型的使用场景就是排行榜系统。

键管理
rename key newkey

键重命名,如果在rename之前,键java已经存在,那么它的值也将被覆盖,为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey不存在时候才被覆盖

randomkey

随机返回一个键

·expire key seconds:键在seconds秒后过期。
·expireat key timestamp:键在秒级时间戳timestamp后过期。

对于字符串类型键,执行set命令会去掉过期时间,这个问题很容易在开发中被忽视。
Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能,例如不能对列表类型的一个元素做过期时间设置。
setex命令作为set+expire的组合,不但是原子执行,同时减少了一次网络通讯的时间。

move key db 用于在Redis内部进行数据迁移
dump key dump+restore可以实现在不同的Redis实例之间进行数据迁移的功能
restore key ttl value
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key 用于在Redis实例间进行数据迁移

1)在源Redis上,dump命令会将键值序列化,格式采用的是RDB格式。
2)在目标Redis上,restore命令将上面序列化的值进行复原,其中ttl参数代表过期时间,如果ttl=0代表没有过期时间。

move、dump+restore、migrate三个命令比较
keys pattern
eg. redis-cli keys video* | xargs redis-cli del 删除所有以video字符串开头的键(不要在线上操作,可以在不对外提供服务的Redis从节点上执行,但会影响主从复制)

全量遍历键

scan cursor [match pattern] [count number]

渐进式遍历,每次scan命令的时间复杂度是O(1),但是要真正实现keys的功能,需要执行多次scan。
为解决诸如hgetall、smembers、zrange可能产生的阻塞问题,redis对应的命令分别是hscan、sscan、zscan
存在问题:在扫描的时候插入新值.新增的键可能没有遍历到,遍历出了重复的键等情况

select dbIndex

切换数据库(默认配置中是有16个数据库),不建议使用该功能.

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

推荐阅读更多精彩内容

  • 理解Redis提供的5种数据结构,以及一些全局命令。 1. 预备 1.1 全局命令 查看所有键:key 复杂度O(...
    leon4ever阅读 202评论 0 1
  • Redis的内存优化 声明:本文内容来自《Redis开发与运维》一书第八章,如转载请声明。 Redis所有的数据都...
    meng_philip123阅读 18,874评论 2 29
  • 参考来源 Redis的内存优化 Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直...
    秦汉邮侠阅读 1,280评论 0 2
  • 1.数据结构 1.1字符串 字符串类型的值实际可以是字符串、数字(整数,浮点数),甚至是二进制(图片、视频)...
    Sponge1128阅读 1,229评论 0 0
  • 声明:本文内容来自《Redis开发与运维》一书第八章,如转载请声明。Redis所有的数据都在内存中,而内存又是非常...
    yoqu阅读 1,491评论 0 2