Redis 1 介绍 结构 bitmaps
uwupu 啦啦啦啦啦

Redis

https://pdai.tech/md/db/nosql-redis/db-redis-overview.html

https://redis.io/docs/data-types/

介绍

Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅、高速队列等场景,支持网络,提供字符串、哈希、列表、队列、集合结构直接存取,基于内存,可持久化

数据结构

image

基础数据类型

Redis数据类型:String、List、Set、Hash、Sorted set、Stream。

image

结构类型 结构存储的值 结构的读写能力
String 可以是字符串、整数或浮点数 对字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自建操作
List 一个链表,链表上每个节点都包含一个字符串 对链表的两端进行push和pop操作;读取单个或多个元素;根据值查找或删除元素;
Set 包含字符串的无序集合 字符串的集合,包含基础的方法:添加、删除、查询、isExist;支持交集,并集,差集等;
Hash 包含键值对的无序散列表 添加、获取、删除
Zset 与Hash一样,存储键值对 字符串成员与浮点数分数之间的有序映射;元素的排列依据分数大小排序决定;包含添加、删除、获取;查询支持按照score范围或成员来获取元素。

简述

对于Redis来说,所有key都是字符串;

String

String存储字节序列,可以是文本、序列化对象和二进制数组;

通常用于缓存;

可以进行按位操作。

使用/场景

一些场景

缓存:把常用信息,字符串、图片或饰品等信息放到redis,Redis作为缓存层,MySQL作为持久化层,均衡MySQL的读写压力;

计数器:Redis是单线程模型,一个命令执行完才会去执行下一个;

Session:使用SpringSession+Redis实现Session共享。

设置值、获取值
1
2
3
4
5
127.0.0.1:6379> set user:1 uwupu
OK
127.0.0.1:6379> get user:1
"uwupu"
127.0.0.1:6379>

set user:1 uwupu :设置user:1的值为uwupu;

get user:1:获取user:1的值。

存储一个序列化JSON字符串,并设定100秒后过期
1
2
127.0.0.1:6379> set ticket:1 "{'username':'zhangsan','name':'zs123'}" EX 100
OK

设置一个ticket:1并在100秒后过期;

一个计数器
1
2
3
4
5
6
7
127.0.0.1:6379> incr views:page:2
(integer) 1
127.0.0.1:6379> incrby views:page:2 10
(integer) 11
127.0.0.1:6379> incrby views:page:2 5
(integer) 16
127.0.0.1:6379>

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
    11
    127.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
2
3
4
5
6
7
8
127.0.0.1:6379> incr apple
(integer) 1
127.0.0.1:6379> incr apple
(integer) 2
127.0.0.1:6379> incrby apple 3
(integer) 5
127.0.0.1:6379> incrby apple 7
(integer) 12
其他命令

APPEND key value:追加字符串到key的后面,如果key不存在则创建key并将值赋值;返回添加后value的长度;

1
2
3
4
5
6
127.0.0.1:6379> set a 123
OK
127.0.0.1:6379> append a qwe
(integer) 6
127.0.0.1:6379> get a
"123qwe"

DECR key:若key为整数,则将减一的值赋值给key。仅支持64位有符号整数。返回结果值;

1
2
3
4
127.0.0.1:6379> set a 123
OK
127.0.0.1:6379> decr a
(integer) 122

DECRBY key value:若key为整数,将key减少指定大小;

GETDEL key:获得值然后删除该变量;

GETEX key [EX 秒 | PX 毫秒]:获得Key值并为key设定过期时间;返回key,若key不存在返回nil。

1
2
127.0.0.1:6379> getex a EX 300
"122"

GETRANGE key start end:截取字符串并返回。start和end可以为负,若为负表示从字符串末尾截取;

1
2
3
4
5
6
7
8
127.0.0.1:6379> set asd "This is a Obsidian"
OK
127.0.0.1:6379> GETRANGE asd 0 6
"This is"
127.0.0.1:6379> GETRANGE asd 4 10
" is a O"
127.0.0.1:6379> GETRANGE asd -5 -1
"idian"

GETSET key value:返回当前值,然后设置新的值;

1
2
3
4
5
6
127.0.0.1:6379> set a 123
OK
127.0.0.1:6379> getset a 234
"123"
127.0.0.1:6379> get a
"234"

INCR key:若值为整数,则赋值加一后的结果。返回值为结果值;

INCRBY key increment:为值增加指定的整数;

INCRBYFLOAT key increment:若值可以为浮点数,则设置值为原来的值加上increment;这个可以增加浮点数。

1
2
3
4
127.0.0.1:6379> set a 123
OK
127.0.0.1:6379> incrbyfloat a 1.23
"124.23"

LCS key1 key2 [LEN] [IDX] [MINMATCHLEN len][WITHMATCHLEN]:实现最长公共子序列算法。

  • 匹配的字符串不需要连续,如:”asdqwe”和”asqzxe”的结果是”asqe”。

    1
    2
    3
    4
    5
    6
    127.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
    4
    127.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
    16
    127.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
    4
    1) 1) (integer) 5
    2) (integer) 5
    2) 1) (integer) 5
    2) (integer) 5

    这个是在 2) -> 1)下的内容,其中1)下的两个值为在key1中匹配的起点终点,2)下的两个值时在key2中匹配的起点和重点,其他依次类推。

MGET key [key ...]:一次获得多个值。

1
2
3
4
5
127.0.0.1:6379> mset a 10 b 20
OK
127.0.0.1:6379> mget a b
1) "10"
2) "20"

MSET key value[ key value …]:一次设置多个key和值

MSETNX key value[ key value …]:一次声明且设置多个之前不存在的key和值;若key存在,则失败,返回0;若成功,则返回1。

1
2
3
4
5
6
7
8
127.0.0.1:6379> msetnx x 1 y 2
(integer) 1
127.0.0.1:6379> msetnx x 1 z 3
(integer) 0
127.0.0.1:6379> mget x y z
1) "1"
2) "2"
3) (nil)

PSETEX key milliseconds value:设置key和value,并设置过期时间,单位为毫秒。与setex不同的是,时间以毫秒为单位,setex时间以秒为单位。即将被弃用

1
2
3
4
5
6
127.0.0.1:6379> psetex a 1000 b
OK
127.0.0.1:6379> get a
"b"
127.0.0.1:6379> get a
(nil)

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
2
3
4
5
6
7
8
127.0.0.1:6379> set key "HelloWorld"
OK
127.0.0.1:6379> set a "HelloWorld"
OK
127.0.0.1:6379> setrange a 5 Redis
(integer) 10
127.0.0.1:6379> get a
"HelloRedis"

STRLEN key:获取字符串长度。

1
2
3
4
127.0.0.1:6379> set a "HelloWorld"
OK
127.0.0.1:6379> strlen a
(integer) 10

SUBSTR key start end:截取字符串。

1
2
3
4
127.0.0.1:6379> set a "HelloWorld"
OK
127.0.0.1:6379> substr a 2 5
"lloW"

bitmaps 通过二进制修改/获取String的值

将String编码为二进制格式,bitmaps可以获取或设定二进制数列的每个位置的值。

SETBIT key offset 0/1:设定key的二进制位第offset位的值;

GETBIT key offset:获取key的二进制位第offset位的值;

offset在二进制数列里,从前往后数。0为起始位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
127.0.0.1:6379> set num 0
OK
127.0.0.1:6379> getbit num 0
(integer) 0
127.0.0.1:6379> getbit num 1
(integer) 0
127.0.0.1:6379> getbit num 2
(integer) 1
127.0.0.1:6379> getbit num 3
(integer) 1
127.0.0.1:6379> getbit num 4
(integer) 0
127.0.0.1:6379> getbit num 5
(integer) 0
127.0.0.1:6379> getbit num 6
(integer) 0
127.0.0.1:6379> getbit num 7
(integer) 0
127.0.0.1:6379> setbit num 5 1
(integer) 0
127.0.0.1:6379> get num
"4"

先**设置num的值为’0’**,

然后获取0-7位置上的二进制数字,分别为:00110000,对应’0’的ansi码;

设置第5位的二进制数位为1后,获取num的值,值变成了4

其他命令
bitcount

返回字节位数;

1
2
3
4
127.0.0.1:6379> set apple sweet,nice
OK
127.0.0.1:6379> bitcount apple
(integer) 43
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
2
3
4
5
6
7
8
9
127.0.0.1:6379> set apple sweetAndNice
OK
127.0.0.1:6379> bitfield apple GET i8 0
1) (integer) 115
127.0.0.1:6379> bitfield apple GET i8 8
1) (integer) 119
127.0.0.1:6379> bitfield apple GET i8 16
1) (integer) 101
127.0.0.1:6379>

设定apple的值为sweetAndNice后;

以有符号整数的形式获取位于0,8,16位域的值,分别为115,119,101,分别对应s、w、e。

SET

设置位域的值,并返回原来的值;

1
2
3
4
127.0.0.1:6379> bitfield apple set i8 0 117
1) (integer) 115
127.0.0.1:6379> get apple
"uweetAndNice"

以i8形式设置位置0的位域的值为117。

INCRBY

1
2
3
4
127.0.0.1:6379> bitfield apple incrby i8 0 3
1) (integer) 120
127.0.0.1:6379> get apple
"xweetAndNice"

以i8形式为位置0的位域的值增加3。

OVERFLOW

改变当INCRBY子命令发生溢出情况时的行为。

可以有的值:WRAP SAT FAIL

WRAP:默认值。若为无符号数,则按照最大值进行取模运算;若为有符号数,对于结果的取值,上溢取溢出值与最小值相加的值,下溢取最大值与溢出值相减的值,与C语言类似;

SAT:若上溢,则使值控制在最大值;若下溢,则使值控制在最小值。如:若最大值为127,则120 加 10结果为127;

FAIL:若发生溢出,取消本次操作,返回null向调用者发送错误信号。

1
2
3
4
5
6
7
8
9
OK
127.0.0.1:6379> bitfield a OVERFLOW WRAP INCRBY i8 0 1234
1) (integer) 3
127.0.0.1:6379> bitfield a OVERFLOW SAT INCRBY i8 0 1234
1) (integer) 127
127.0.0.1:6379> bitfield a OVERFLOW FAIL INCRBY i8 0 1234
1) (nil)
127.0.0.1:6379> get a
"\x7f23"
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指定范围;

 评论