【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中的内容。

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

相关推荐
maqr_1104 分钟前
HTML怎么生成订单预览_HTML只读订单信息结构【操作】
jvm·数据库·python
2301_8038756128 分钟前
如何通过phpMyAdmin给WordPress所有用户发送全站通知_系统表插入
jvm·数据库·python
aq55356001 小时前
编程语言三巨头:汇编、C++与PHP大比拼
java·开发语言
2301_777599371 小时前
mysql如何进行数据库容量规划_评估磁盘空间增长趋势
jvm·数据库·python
我是无敌小恐龙1 小时前
Java SE 零基础入门Day01 超详细笔记(开发前言+环境搭建+基础语法)
java·开发语言·人工智能·opencv·spring·机器学习
NineData2 小时前
NineData 亮相香港国际创科展 InnoEX 2026,以 AI 加速布局全球市场
运维·数据库·人工智能·ninedata·新闻资讯·玖章算术
m0_377618232 小时前
Redis怎样应对大规模集群的重启风暴_分批次重启节点并等待集群状态恢复绿灯后再继续操作
jvm·数据库·python
心态与习惯2 小时前
Julia 初探,及与 C++,Java,Python 的比较
java·c++·python·julia·比较
imuliuliang2 小时前
存储过程(SQL)
android·数据库·sql
考虑考虑2 小时前
SQL语句中的order by可能造成时间重复
数据库·后端·mysql