Redis

Redis(Remote Dictionary Server)是一个高性能的开源内存数据结构存储系统,常被用作数据库、缓存和消息代理。

参考网站

知乎 超强、超详细Redis入门教程

CSDN【Redis二三事】一套超详细的Redis学习教程(步骤图片+实操)—第一集

详细,附有业务场景的实例

数据结构

Redis包含五大数据类型:字符串(string), 列表(list), 哈希(hash), 集合(set), 集合(zset)

string

Redis 最基本的数据类型,每个键对应一个值,值可以是文本、数字或二进制数据,最大存储 512MB。支持字符串拼接、截取、递增递减等操作,适用于缓存数据、计数器(如访问量统计)、分布式锁等场景。

基础操作

1
2
3
set key value
get key
del key 
添加修改多个数据
1
mset key1 value1 key2 value2...
获取多个数据
1
mget key1 key2...
获取数据的字符个数
1
2
3
4
5
strlen key
//例如
set name1 nosql
strlen name1
//输出为: 5
追加信息
1
2
3
4
5
append key value
//例如
append name1 name
get name1
/*输出为: nosqlname*/
多数据操作与单数据操作
  • 单指令执行 n 条指令需要 n次发送 + n次处理 + n次返回
  • 多指令执行 n 条指令需要 1次发送 + n次处理 + 1次返回
  • 数据量较大时,多指令消耗的时间远远少于单指令

扩展操作

设置数值数据增加/减少指定范围的值
1
2
incrby key increment
decrby key increment
对字符串类型进行数值操作
1
2
3
4
5
6
7
8
127.0.0.1:6379> set mynum "2"
OK
127.0.0.1:6379> get mynum
"2"
127.0.0.1:6379> incr mynum
(integer) 3
127.0.0.1:6379> get mynum
"3"

遇到数值操作,redis会自动将字符串类型转换成数值

string类型数值操作的注意事项

  • 数据操作不成功的反馈与数据正常操作之间的差异
    • 表示运行结果是否成功
      • (integer)0->false 失败
      • (integer)1->true 成功
    • 表示运行结果值
      • (integer)3->3 3个
      • (integer)1->1 1个
  • 数据未获取到
    • (‘’nil’’)等同于’’null’'
  • 数据最大存储量
    • 512MB
  • 数值计算最大范围(‘‘java’‘中的’’long’‘的最大值)
    • 9223372036854775807

hash

类似于小型的键值存储,适用于存储结构化数据,如用户信息(ID、姓名、邮箱等),相比 String 类型更节省内存,因为多个字段共享同一个键。可以对字段进行单独操作,避免整体读取修改,适用于存储对象、会话信息等。

基础操作

1
2
3
4
hset key field value //添加/修改数据
hget key field //获取数据
hgetall key
hdel key field1 [field2]
添加/修改多个数据
1
hmset key field1 value1 field2 value2
获取多个数据
1
hmget key field1 field2...
获取哈希表中字段的数量
1
hlen key
获取哈希表中是否存在指定的字段
1
hexists key field

扩展操作

获取哈希表中所有字段名或字段值
1
2
hkeys key
hvals key
设置指定字段的数值数据增加指定范围的值
1
hincrby key field increment
综合示例
 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> HMSET user:001 username antirez password P1pp0 age 34 
OK
//列出哈希的内容
127.0.0.1:6379> HGETALL user:001 
1) "username"
2) "antirez"
3) "password"
4) "P1pp0"
5) "age"
6) "34"
//更改哈希中的某一个值
127.0.0.1:6379> HSET user:001 password 12345 
(integer) 0
//再次列出哈希的内容
127.0.0.1:6379> HGETALL user:001 
1) "username"
2) "antirez"
3) "password"
4) "12345"
5) "age"
6) "34"

hash类型数据操作的注意事项

  • 1.hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil
  • 2.每个hash可以存储2^23-1个键值对
  • 3.hash类型十分贴近对象的数据存储形式,并且可以灵活添加对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
  • 4.hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈

list

基于双向链表实现,可以从头部(左侧)或尾部(右侧)快速插入和删除元素,同时支持指定范围的索引读取。适合实现消息队列、时间轴(如微博动态)、任务调度等应用,尤其适用于需要按照插入顺序处理数据的场景。

基础操作

添加/修改数据
1
2
lpush key value1 [value2]... //从左边进
rpush key value1 [value2]... /*从右边进*/
获取数据

关于lrange:

  • lrange用来获取指定范围的元素
  • -1 代表倒数第一个元素
  • 列表元素索引从位置0开始
1
2
3
lrange key start stop
lindex key index
lien key
获取并移除数据
1
2
lpop key
rpop key
移除指定数据

关于lrem:

  • 参数count
    • count > 0 → 从头(左侧)开始删除count个匹配的value
    • count < 0 → 从尾(右侧)开始删除count个匹配的value
    • count = 0 → 删除所有匹配的value(等价于删除列表中所有该值的元素)
  • 如果key不存在
    • 返回 0
  • 常用于去除列表中的重复元素或清理数据
1
lrem key count value

扩展操作

在规定时间内获取并移除数据

关于blpop:

  • 参数key1 [key2...]
    • 可以提供多个列表的键名,Redis 会按照顺序依次检查这些列表
  • 参数timeout
    • timeout > 0 → 如果列表为空,则最多等待 timeout
    • timeout < 0 → 永远阻塞,直到有数据可用
  • 适用于任务队列、生产者-消费者模型等场景
1
2
blpop key1 [key2] timeout
brpop key1 [key2] timeout

示例

1
2
3
4
5
RPUSH list1 "a" "b" "c"    // 列表内容:["a", "b", "c"]
BLPOP list1 10             // 取出 "a",返回 ["list1", "a"]
BLPOP list1 10             // 取出 "b",返回 ["list1", "b"]
BLPOP list1 10             // 取出 "c",返回 ["list1", "c"]
BLPOP list1 10             /* 列表为空,阻塞最多 10 秒,若无新元素,则返回 nil */
综合示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
//新建一个list叫做mylist,并在列表头部插入元素"1"
127.0.0.1:6379> lpush mylist "1" 
//返回当前mylist中的元素个数
(integer) 1 
//在mylist右侧插入元素"2"
127.0.0.1:6379> rpush mylist "2" 
(integer) 2
//在mylist左侧插入元素"0"
127.0.0.1:6379> lpush mylist "0" 
(integer) 3
//列出mylist中从编号0到编号1的元素
127.0.0.1:6379> lrange mylist 0 1 
1) "0"
2) "1"
//列出mylist中从编号0到倒数第一个元素
127.0.0.1:6379> lrange mylist 0 -1 
1) "0"
2) "1"
3) "2"

list类型数据操作注意事项

  • 1.list中保存的数据都是string类型的,数据总容量是有限的,最多2^32-1个元素
  • 2.list具有’‘索引’‘的概念,但是操作数据时通常以’‘队列’‘的形式进行入队出队操作,或以’‘栈’‘的形式进行入栈出栈操作
  • 3.获取全部数据操作结束索引设置为-1
  • 4.list可以对数据进行分页操作,通常第1页的信息来自于list,第2页及更多的信息通过’‘数据库’‘的形式加载

set

由唯一无序的元素组成,支持 O(1) 时间复杂度的添加、删除和查找操作,并提供交集、并集、差集等集合运算,适用于去重、推荐系统中的共同关注、标签管理等应用。由于不允许重复元素,可以高效存储不重复的数据集合。

基础操作

添加数据
1
sadd key member1 [member2]
获取全部数据
1
smembers key
删除数据
1
srem key member1 [member2]
获取集合数据总量
1
scard key
判断集合中是否包含指定数据
1
sismember key member

进阶操作

随机获取集合中指定数量的数据
1
srandmember key [count]
随机获取集合中的某个数据并将其移出集合
1
spop key
求两个集合的交、并、差集
1
2
3
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
求两个集合的交、并、差集 并存储到指定集合中
1
2
3
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
将指定数据从原始集合中移动到目标集合中
1
smove source destination member
综合示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//向集合myset中加入一个新元素"one"
127.0.0.1:6379> sadd myset "one" 
(integer) 1
127.0.0.1:6379> sadd myset "two"
(integer) 1
//列出集合myset中的所有元素
127.0.0.1:6379> smembers myset 
1) "one"
2) "two"
//判断元素1是否在集合myset中,返回1表示存在
127.0.0.1:6379> sismember myset "one" 
(integer) 1
//判断元素3是否在集合myset中,返回0表示不存在
127.0.0.1:6379> sismember myset "three" 
(integer) 0
//新建一个新的集合yourset
127.0.0.1:6379> sadd yourset "1" 
(integer) 1
127.0.0.1:6379> sadd yourset "2"
(integer) 1
127.0.0.1:6379> smembers yourset
1) "1"
2) "2"
//对两个集合求并集
127.0.0.1:6379> sunion myset yourset 
1) "1"
2) "one"
3) "2"
4) "two"

set类型数据操作的注意事项

  • set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
  • set虽然和hash的存储结构相同,但是无法启用hash中存储值的空间

zset

在 Set 的基础上增加了一个分数(score),并按分数排序,支持范围查询、按分数排名等操作。适用于排行榜(如游戏积分榜)、优先级队列(如定时任务)、时间排序数据存储(如文章阅读量排名)等需要按权重排序的场景。

基础操作

添加数据
1
zadd key score1 member1 [score2 member2]
获取全部数据
1
2
zrange key start stop [WITHSCORES]     //按从小到大的顺序展示
zrevrange key start stop [WITHSCORES]  //按从大到小的顺序展示
删除数据
1
zrem key member [member...]
按条件获取数据
1
2
zrangebyscore key min max [Withscores][limit]
zrevrangebyscore key max min [withscores]
按条件删除数据
1
2
zremrangebyrank key start stop  //按索引删除
zremrangebyscore key min max 	//按范围删除
综合示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1:
127.0.0.1:6379> zadd myzset 1 baidu.com 
(integer) 1
//向myzset中新增一个元素360.com,赋予它的序号是3
127.0.0.1:6379> zadd myzset 3 360.com 
(integer) 1
//向myzset中新增一个元素google.com,赋予它的序号是2
127.0.0.1:6379> zadd myzset 2 google.com 
(integer) 1
//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
127.0.0.1:6379> zrange myzset 0 -1 with scores 
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//只列出myzset的元素
127.0.0.1:6379> zrange myzset 0 -1 
1) "baidu.com"
2) "google.com"
3) "360.com"

进阶操作

获取集合数据总量
1
2
zcard key
zcount key min max
集合交、并集操作
1
2
zinterstore destination numkeys key [key …]
zunionstore destination numkeys key [key …]

sorted_set类型数据操作的注意事项

score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992 score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重 sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果

comments powered by Disqus