【Redis】Redis基本操作

目录

[1. String](#1. String)

[2. Hash](#2. Hash)

[3. List](#3. List)

[4. Set](#4. Set)

[5. Zset](#5. Zset)

[6. 类型补充](#6. 类型补充)

[1. Streams](#1. Streams)

[2. Geospatial](#2. Geospatial)

[3. Hyperloglog](#3. Hyperloglog)

[4. Bitmaps](#4. Bitmaps)

[5. Bitfield](#5. Bitfield)

[6. Scan](#6. Scan)


官方文档:Redis - The Real-time Data Platform

Redis与MySQL的区别

MySQL:数据存储于硬盘中,速度慢,通过"表"来存储数据,是"关系型数据库";

Redis:数据存储于内存中,速度快,但是存储空间有限,通过"键值对"来存储数据,是"非关系型数据库"

Redis:在内存中存储数据的中间件,作为数据库,用于数据缓存,在分布式系统中可以大展拳脚。

1. String

常见全局命令:

1)set [key] [value]:创建键值对

2)get [key]:查看键对应的值

3)keys [pattern]:查看匹配规则的key

4)exists [key]:判定key是否存在

5)del [key]:删除指定的key

6)expire [key] [seconds]:给key设置过期时间

7)ttl [key]:查询key的过期时间

8)type [key]:查询key对应的value类型

SET key value [expiration EX seconds | PX milliseconds [NX|XX]

NX:如果key不存在才设置;如果key存在,则不设置(返回nil)

XX:如果key存在才设置(相当于更新key的value);如果key不存在则不设置(返回nil)

注意:GET 只支持字符串类型的value,其他类型使用GET获取会报错

MSET [key1 value1 key2 value2 ...]:一次性设置多个键值对

MGET [key1 key2 ...]:一次性获取多个键值对

SETNX / SETXX / SETPX

SETNX:不存在才设置,存在则设置失败

SETEX:设置的同时指定超时时间,单位秒

PSETEX:设置的同时指定超时时间,单位毫秒

键值对的运算操作:

incr [key]:value + 1

incrby [key] [number]:value + n

decr [key]:value - 1

decrby [key] [number]:value - n

incrbyfloat [key] [number]: value +/- 小数

APPEND key value:如果key已经存在且是一个string,将value追加到原有string后面;如果key不存在则等同于set命令,返回值为string的长度。

注意:汉字在utf-8字符集中,占3个字节。

在启动redis客户端时加上 --raw(redis-cli --raw) ,就可以使redis客户端能够自动把二进制数据尝试翻译成汉字。

Ctrl+S:冻结当前画面

Ctrl+Q:解除冻结

GETRANGE key start end:左闭右闭,类似于substring。例如:getrange key 0 -1:获取全部 string。

SETRANGE key offset value:从 offset 偏移量开始替换,替换成 value,返回值是替换后字符串的长度;针对不存在的key也可以操作,不过会把offset之前的内容填充成0x00。

STRLEN key:获取字符串的长度,单位字节

String编码方式:

int:8个字节的长整型

embstr:小于等于39个字节的字符串

raw:大于39个字符的字符串

整数当做int来存储,小数当做字符串来存储。

注意:Redis 不擅长数据统计。

2. Hash

常见全局命令:

hset key field value [field value ...],返回值是设置成功的键值对的个数

hget key field:获取哈希表

hmget key [field ...]:一次查询多个value

hexists key field:返回值1表示存在,0表示不存在

hdel key [field ...]:返回值是本次操作删除的字段个数

hkeys key:获取hash中key的所有field字段

hvals :获取hash中所有的value值

hgetall key:获取hash中所有的field和value

hscan:遍历hash,但是属于"渐进式遍历"

HLEN key:获取hash的元素个数,不需要遍历 O(1)

HSETNX key field value:不存在时候才能设置成功,存在则设置失败

HINCRBY key field n:运算操作

HINCRBYFLOAT key field n:运算操作

HSTRLEN key field:计算长度

3. List

List链表

1)list中的元素是有序的;

2) list中的元素可以重复。

增加:

LPUSH key [element ...]:头插链表元素,可一个或多个,返回值为list的长度;如果key已经存在,且key对应的value类型,不是list,则lpush命令就会报错。

LRANGE key start stop:查看list中指定范围的元素,左闭右闭;如果下标超出范围,Redis会尽可能获取到给定区间的元素。

LPUSHX key [element ...]:头插链表元素,key不存在l则直接返回。

RPUSH key [element ...]:尾插链表元素,可一个或多个,返回值为list的长度。

RPUSHX key [element ...]:尾插链表元素,key不存在l则直接返回。

删除:

LPOP key [count]:头删list元素,一次删count个(Redis 5 以上支持)

RPOP key [count]:尾删list元素,一次删count个(Redis 5 以上支持)

LINDEX key index:给定下标,获取到对应的元素;如果下标非法,返回nil。

LINSERT key <before|after> pivot value:在基准值pivot前或后插入新元素value,返回值是新list的长度。

LLEN key:获取list长度。

LREM key count element: 在key中从前往后删除count个值为element的元素,count值为负数时从后往前删,返回值为成功删除元素的个数。

LTRIM key start stop:保留start和stop区间内的元素,左闭右闭。

LSET key index element:根据下标修改元素。

阻塞版本命令:

BLPOP [key ...] timeout :不存在该元素则在timeout时间内一直阻塞;

BRPOP [key ...] timeout:同上。

注意:如果命令中设置了多个key,那么会从左向右进行键遍历,知道有个键对应的列表中可以弹出元素,命令立即返回。

返回的结果是一个二元组,包括当前的数据来自哪个key,以及取到的数据是什么。

timeout单位是秒,从Redis 6 开始超时时间允许设定成小数。

4. Set

Set集合

  1. 集合中的元素是无序的;

  2. 集合中的元素不能重复。

SADD key [member ...]:给集合中添加元素,返回值为添加成功元素的个数。

SMEMBERS key:获取集合中的所有元素。

SISMEMBER key member:判定当前元素是否在集合中。

SPOP key [count]:随机删除count个元素,不写count就是随机删除一个,返回值为成功删除的元素。

SRANDMEMBER key count:随机获取集合中的count个元素,但不会删除。

SMOVE source destination member:将源Set中的member删除,插入目的Set中。

如果目的Set中已经有member,插入后不会有效果;如果源Set中没有member,返回0表示移动失败。

SREM key [member ...]:一次删除一个或多个member,返回值为删除成功的元素个数 。

交集(inter)

SINTER [key ...]:求交集,返回值为交集的元素,O(N*M),N是最小集合元素个数,M是最大集合元素个数。

SINTERSTORE destination [key ...]:直接把算好的交集放到destination这个key对应的集合中,返回值为交集的元素个数。

并集(union)

SUNION [key ...]:求并集,返回值为并集的元素 O(N),N是总的元素个数。

SUNIONSTORE destination [key ...]:直接把算好的并集放到destination这个key对应的集合中,返回值为并集的元素个数。

差集(diff)

SDIFF [key ...]:求差集,返回值为差集的元素,O(N),N是总的元素个数

SDIFFSTORE destination [key ...]:直接把算好的差集放到destination这个key对应的集合中,返回值为差集的元素个数

Set应用场景:

1)使用Set保存用户的"标签"

用户画像:Set方便计算交集,很容易找到两个用户之间的公共标签,基于这样的标签可以衍生出"用户关系"。

2)使用Set计算用户间的共同好友

如QQ推荐可能认识的好友。

3)使用Set统计UV

互联网衡量用户规模的指标主要是两方面:

PV:Page View,用户每次访问该服务器都会产生一个PV;

UV:User View,每个用户访问服务器都会产生一个UV,但是同一个用户的多次访问只算成一条,所以需要Set进行去重。

5. Zset

Zset 有序集合

1.有序(升序/降序)

给Zset中的member引入了一个属性:分数(score),浮点类型;

排序的时候就是依照分数score大小进行升序/降序;

既可以通过member找到对应的score,也可以通过score找到对应的member。

2.唯一

member唯一,score可以相同,不同member的score相同时,按照member的字典序排列。

ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]:新增元素,返回值为新增元素的数量,O(logn),n为有序集合中元素个数

NX|XX:XX只更新存在的,不添加新元素;NX只添加新元素,不更新存在的。

如果不加NX|XX选项:member不存在,添加新member,member已存在,更新对应的score。

LT|GT:LT只更新比当前score小的score;GT只更新比当前score大的score,这个选项不会阻止添加新元素。

CH:让命令的返回值从"新增元素的数量"变为"新增元素数量 + 更新元素数量"。

INCR:针对现有元素的score进行运算,此时只能对一组score member进行计算,如 zadd key incr 1 zhangsan,返回值为修改后的score。

ZRANGE key start stop [withscores]:类似LRANGE,查看有序集合中的元素详情,默认升序。

ZREVRANGE key start stop [withscores]:查看有序集合中的元素详情,默认降序。

ZRANGEBYSCORE key start stop [withscores]:按照分数查找元素,指定分数作为区间

注意:这个命令可能会在6.2版本后弃用,合并到ZRANGE中。

ZCARD key:获取zset中元素的个数。

ZCOUNT key min max:返回分数在min和max之间的元素个数,左闭右闭,想不包含边界值就加上括号(,如 zcount key (1 (10,意为返回1和10之间的数,不包含1和10。O(logn)。

min和max可以写成浮点数,也支持 -inf(负无穷大)+inf(正无穷大)。

ZPOPMAX key [count]:删除并返回分数最高的count个元素,如果存在score相同的最大值,按照member的字典序删除一个,O((logN)*count)。

BZPOPMAX [key ...] timeout:ZPOPMAX的阻塞版本,timeout单位是秒,支持小数形式,返回值为key,member,score,O(logN)。

ZPOPMIN key [count]:删除并返回分数最低的count个元素,如果存在score相同的最小值,按照member的字典序删除一个,O((logN)*count)。

BZPOPMIN [key ...] timeout:ZPOPMIN的阻塞版本,timeout单位是秒,支持小数形式,返回值为key,member,score,O(logN)。

ZRANK key member:获取member元素的排名,O(logN)。

ZREVRANK key member:获取member元素的排名,反着算,O(logN)。

ZSCORE key member:查询指定member元素的分数,O(1)。

ZREM key [member ...]:删除元素,O(logN * M),N为整个有序集合的个数,M为要删除member的个数,返回值为删除成功元素的个数。

ZREMRANGEBYRANK key start stop:使用下标描述的范围进行删除,O(logN + M),N为整个有序集合的个数,M为start-stop区间中的元素个数,返回值为删除成功的元素。

ZREMRANGEBYSCORE key min max:按照分数删除指定范围的元素。

ZINCRBY key increment member:给指定member修改分数内容,同时移动元素位置保持有序,支持小数和负数。

ZINTER,ZUNION,ZDIFF 从Redis 6.2开始支持

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]:

numkeys说明后续有几个有序集合参与运算;

weight为不同有序集合对应的权重,最终分数为权重*score再求和;

aggregate中给了三种处理member相同,score不同的情况时,交集最终的分数如何合并,默认是SUM。

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]:同上。

zset编码方式:ziplist skiplist

zset应用场景:

1) 微博热搜

2)游戏天梯排行

3)成绩排行

6. 类型补充

1. Streams

模拟实现事件传播的机制。

2. Geospatial

存储坐标(经纬度),并根据坐标(半径、矩形区域)查找。

GEOADD

GEOSEARCH

3. Hyperloglog

估算Set集合中的元素个数,误差0.81%左右,即记录当前集合中有多少个不同的元素。

不存储元素的内容,但是能够记录"元素的特征",从而知道新增元素时,是一个已存在的元素还是第一次出现的元素。

PFADD

PFCOUNT

4. Bitmaps

位图,使用比特位表示整数,存储了元素内容,本质上还是一个集合,是Set类型针对整数的特化版本。

SETBIT

GETBIT

5. Bitfield

位域,可以理解成一串二进制序列(字节数组),把这个字节数组中的某几位,赋予特定的含义,并且可以进行读取/修改/算术运算相关操作。

6. Scan

keys *:一次性获取Redis中所有的key,这个操作很危险,可能会阻塞Redis服务器;

渐进式遍历:每执行一次命令,只获取其中一小部分,多次遍历获得全部的key。

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]:

cursor是光标,光标设置为0,表示从头开始获取;

count限制这一次遍历能获取到几个元素,默认是10,但是返回个数不一定是count,不精确;

type指定这次遍历想获取什么类型的key;

如scan 0 count 3,返回值的前半部分说明下次光标从哪里开始遍历,后半部分是这次遍历到的key中的内容。

注意:如果遍历过程中键有所变化(增加、修改、删除),可能导致遍历时键的重复遍历或者遗漏。

相关推荐
独断万古他化1 分钟前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
VALENIAN瓦伦尼安教学设备6 分钟前
设备对中不良的危害
数据库·嵌入式硬件·算法
yyt3630458418 分钟前
spring单例bean线程安全问题讨论
java·spring
小兔崽子去哪了18 分钟前
Docker 安装 PostgreSQL
数据库·后端·postgresql
野犬寒鸦22 分钟前
Redis热点key问题解析与实战解决方案(附大厂实际方案讲解)
服务器·数据库·redis·后端·缓存·bootstrap
我是大猴子28 分钟前
事务失效的几种情况以及是为什么(详解)
java·开发语言
mldlds1 小时前
Windows安装Redis图文教程
数据库·windows·redis
Nyarlathotep01131 小时前
Redis的对象(5):有序集合对象
redis·后端
feng68_1 小时前
Redis架构实践
linux·运维·redis·架构·bootstrap
wertyuytrewm1 小时前
Java面试——Java基础
java·jvm·面试