
Redis
https://pdai.tech/md/db/nosql-redis/db-redis-overview.html
https://redis.io/docs/data-types/
介绍
Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅、高速队列等场景,支持网络,提供字符串、哈希、列表、队列、集合结构直接存取,基于内存,可持久化。
数据结构
基础数据类型
Redis数据类型:String、List、Set、Hash、Sorted set、Stream。
结构类型 | 结构存储的值 | 结构的读写能力 |
---|---|---|
String | 可以是字符串、整数或浮点数 | 对字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自建操作 |
List | 一个链表,链表上每个节点都包含一个字符串 | 对链表的两端进行push和pop操作;读取单个或多个元素;根据值查找或删除元素; |
Set | 包含字符串的无序集合 | 字符串的集合,包含基础的方法:添加、删除、查询、isExist;支持交集,并集,差集等; |
Hash | 包含键值对的无序散列表 | 添加、获取、删除 |
Zset | 与Hash一样,存储键值对 | 字符串成员与浮点数分数之间的有序映射;元素的排列依据分数大小排序决定;包含添加、删除、获取;查询支持按照score范围或成员来获取元素。 |
简述
对于Redis来说,所有key都是字符串;
String
String存储字节序列,可以是文本、序列化对象和二进制数组;
通常用于缓存;
可以进行按位操作。
使用/场景
一些场景
缓存:把常用信息,字符串、图片或饰品等信息放到redis,Redis作为缓存层,MySQL作为持久化层,均衡MySQL的读写压力;
计数器:Redis是单线程模型,一个命令执行完才会去执行下一个;
Session:使用SpringSession+Redis实现Session共享。
设置值、获取值
1 | 127.0.0.1:6379> set user:1 uwupu |
set user:1 uwupu
:设置user:1的值为uwupu;
get user:1
:获取user:1的值。
存储一个序列化JSON字符串,并设定100秒后过期
1 | 127.0.0.1:6379> set ticket:1 "{'username':'zhangsan','name':'zs123'}" EX 100 |
设置一个ticket:1并在100秒后过期;
一个计数器
1 | 127.0.0.1:6379> incr views:page:2 |
incr views:page:2
:设置一个计数器;
incrby views:page:2 10
:使得计数器增加。
限制
默认情况下,单个Redis
字符串最大为512MB。
基本命令
获取和设置字符串
SET:存储一个字符串值。
set apple 3
SETNX:当键不存在时,存储字符串值,可以用于实现锁。
SETNX apple 3
GET:获取/检索字符串值。
GET apple
> 3
MGET:在单个操作中获取多个字符串值
1
2
3
4
5
6
7
8
9
10
11127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> set b 2
OK
127.0.0.1:6379> set c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379>
管理计数器
INCR:创建一个计数器;
INCRBY:使得计数器增加指定值。
1 | 127.0.0.1:6379> incr apple |
其他命令
APPEND key value
:追加字符串到key的后面,如果key不存在则创建key并将值赋值;返回添加后value的长度;
1 | 127.0.0.1:6379> set a 123 |
DECR key
:若key为整数,则将减一的值赋值给key。仅支持64位有符号整数。返回结果值;
1 | 127.0.0.1:6379> set a 123 |
DECRBY key value
:若key为整数,将key减少指定大小;
GETDEL key
:获得值然后删除该变量;
GETEX key [EX 秒 | PX 毫秒]
:获得Key值并为key设定过期时间;返回key,若key不存在返回nil。
1 | 127.0.0.1:6379> getex a EX 300 |
GETRANGE key start end
:截取字符串并返回。start和end可以为负,若为负表示从字符串末尾截取;
1 | 127.0.0.1:6379> set asd "This is a Obsidian" |
GETSET key value
:返回当前值,然后设置新的值;
1 | 127.0.0.1:6379> set a 123 |
INCR key
:若值为整数,则赋值加一后的结果。返回值为结果值;
INCRBY key increment
:为值增加指定的整数;
INCRBYFLOAT key increment
:若值可以为浮点数,则设置值为原来的值加上increment;这个可以增加浮点数。
1 | 127.0.0.1:6379> set a 123 |
LCS key1 key2 [LEN] [IDX] [MINMATCHLEN len][WITHMATCHLEN]
:实现最长公共子序列算法。
匹配的字符串不需要连续,如:”asdqwe”和”asqzxe”的结果是”asqe”。
1
2
3
4
5
6127.0.0.1:6379> set a asdqwe
OK
127.0.0.1:6379> set b asqzxe
OK
127.0.0.1:6379> lcs a b
"asqe"一般用于比较两个序列之间的相似程度。
算法O(N*M)复杂度较高,尽量运行在较小的字符串上;
加上LEN会返回匹配的长度;
1
2
3
4127.0.0.1:6379> mset a asdqwe b asqzxe
OK
127.0.0.1:6379> lcs a b LEN
(integer) 4加上IDX将返回匹配的位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16127.0.0.1:6379> lcs a b IDX
1) "matches"
2) 1) 1) 1) (integer) 5
2) (integer) 5
2) 1) (integer) 5
2) (integer) 5
2) 1) 1) (integer) 3
2) (integer) 3
2) 1) (integer) 2
2) (integer) 2
3) 1) 1) (integer) 0
2) (integer) 1
2) 1) (integer) 0
2) (integer) 1
3) "len"
4) (integer) 4其中,在**2)中有1),2),3)**三组序列,每组序列表示一组匹配列表;
1
2
3
41) 1) (integer) 5
2) (integer) 5
2) 1) (integer) 5
2) (integer) 5这个是在 2) -> 1)下的内容,其中1)下的两个值为在key1中匹配的起点终点,2)下的两个值时在key2中匹配的起点和重点,其他依次类推。
MGET key [key ...]
:一次获得多个值。
1 | 127.0.0.1:6379> mset a 10 b 20 |
MSET key value[ key value …]:一次设置多个key和值
MSETNX key value[ key value …]:一次声明且设置多个之前不存在的key和值;若key存在,则失败,返回0;若成功,则返回1。
1 | 127.0.0.1:6379> msetnx x 1 y 2 |
PSETEX key milliseconds value:设置key和value,并设置过期时间,单位为毫秒。与setex不同的是,时间以毫秒为单位,setex时间以秒为单位。即将被弃用
1 | 127.0.0.1:6379> psetex a 1000 b |
SET key value [NX | XX] [GET] [EX 秒 | PX 毫秒 | EXAT unit-time-sexonds | PXAT unit-time-milliseconds | KEEPTTL]
设置key和value。若key不为
EX:设置指定的过期时间,单位秒;
PX:设置指定的过期时间,单位毫秒;
EXAT:Unix时间,单位秒;
PXAT:Unit时间,单位毫秒;
NX:当Key不存在时设置;
XX:当key存在时设置;
KEEPTTL:获取Key的过期时间;
GET:返回key原来的值,若key不存在返回nil。
返回值:
- OK:成功返回ok;
- nil:若get的值为nil,则返回nil;若因为NX或XX导致SET未执行操作,返回nil;
- 字符串:若get的值不为nil,返回原来字符串的值。
SETEX、SETNX:设置过期时间,即将被弃用。
SETRANGE key offset value:从key值的offset位置开始,设置值为value。
1 | 127.0.0.1:6379> set key "HelloWorld" |
STRLEN key:获取字符串长度。
1 | 127.0.0.1:6379> set a "HelloWorld" |
SUBSTR key start end:截取字符串。
1 | 127.0.0.1:6379> set a "HelloWorld" |
bitmaps 通过二进制修改/获取String的值
将String编码为二进制格式,bitmaps可以获取或设定二进制数列的每个位置的值。
SETBIT key offset 0/1:设定key的二进制位第offset位的值;
GETBIT key offset:获取key的二进制位第offset位的值;
offset在二进制数列里,从前往后数。0为起始位置。
1 | 127.0.0.1:6379> set num 0 |
先**设置num的值为’0’**,
然后获取0-7位置上的二进制数字,分别为:00110000,对应’0’的ansi码;
设置第5位的二进制数位为1后,获取num的值,值变成了4。
其他命令
bitcount
返回字节位数;
1 | 127.0.0.1:6379> set apple sweet,nice |
bitfield
将字符串作为位数组,允许对位域的值进行获取、修改和自增自减。
子命令列表
- GET type offset 获取位域的值,以十进制返回;
- SET type offset value 设置位域的值,并返回原来的值;
- INCRBY type offset increment,自增\自减指定位域的值并返回新值。
type offset 解释
type:即位域的类型;
i表示有符号整数,u表示无符号整数。
例:
i8:8位有符号整数;
u8:8位无符号整数;
i16:16位有符号整数。
offset:即位移偏移量。
使用
GET
1 | 127.0.0.1:6379> set apple sweetAndNice |
设定apple的值为sweetAndNice后;
以有符号整数的形式获取位于0,8,16位域的值,分别为115,119,101,分别对应s、w、e。
SET
设置位域的值,并返回原来的值;
1 | 127.0.0.1:6379> bitfield apple set i8 0 117 |
以i8形式设置位置0的位域的值为117。
INCRBY
1 | 127.0.0.1:6379> bitfield apple incrby i8 0 3 |
以i8形式为位置0的位域的值增加3。
OVERFLOW
改变当INCRBY子命令发生溢出情况时的行为。
可以有的值:WRAP SAT FAIL
WRAP:默认值。若为无符号数,则按照最大值进行取模运算;若为有符号数,对于结果的取值,上溢取溢出值与最小值相加的值,下溢取最大值与溢出值相减的值,与C语言类似;
SAT:若上溢,则使值控制在最大值;若下溢,则使值控制在最小值。如:若最大值为127,则120 加 10结果为127;
FAIL:若发生溢出,取消本次操作,返回null向调用者发送错误信号。
1 | OK |
bitfield_ro
类似于bitfield,但是只接受get子命令;
因为bitfield有改变数值的选项,所以在技术上被标记为redis的写入命令;
(存疑)Redis可以有主节点和副本节点,副本节点是主节点的副本;
若bitfield命令向副本节点发送操作,副本节点会将操作转发到主节点进行操作,而不是在副本中操作;
bitfield_ro命令也会向副本节点发送操作,但bitfield_ro的操作不会被转发到主节点,在副本节点中获取数据后直接返回。(可能会存在旧数据)
bitop
BITOP支持四种与运算:AND、OR、XOR和NOT。
dest 目标 src 来源
- BITOP AND destkey srckey1 srckey2 srckey3 … srckeyN
- BITOP OR destkey srckey1 srckey2 srckey3 … srckeyN
- BITOP XOR destkey srckey1 srckey2 srckey3 … srckeyN
- BITOP NOT destkey srckey
NOT只需要一个参数。
运算结果存放在dest中,依据srckey进行计算。
bitpos
1 | BITPOS key bit [start [end [BYTE | BIT]]] |
将字符串数据作为一个位数组,获取指定范围第一个1或0的位置。
bit值为1/0,表示指定1或者0;
使用start和end指定范围;