![](http://www.eleven-smile.com/usr/uploads/2022/09/1632036850.png)

一、特性

1. 快

redis基于内存操作,不需要与磁盘交互,而DB则需要与磁盘交互。 redis的命令执行是单线程,通信采用多路复用 redis是k-v结构,时间复杂度近O(1) redis底层的数据结构,支持跳表、SDS lO多路复用,单个线程中通过记录跟踪每一个sock(I/O流) 的状态来管理多个I/O流

2. 支持多语言

3. 多集群、高可靠、高可用

4. 完善的内存管理机制,如:淘汰策略、过期策略

5. 丰富的数据类型

二、常用基本指令

1、keys

127.0.0.1:6379> keys *
1) "elevenfloat"
2) "queue"
3) "elevenint"
4) "eleven"
5) "k"

用于查找所有符合给定模式 pattern 的 key

2、type

127.0.0.1:6379> type k
string

用于返回 key 所储存的值的类型

3、ttl

127.0.0.1:6379> ttl k
(integer) 98

以秒为单位返回 key 的剩余过期时间

4、rename

127.0.0.1:6379> rename k knew
OK

修改 key 的名称

5、exists

127.0.0.1:6379> exists k
(integer) 1

用于检查给定 key 是否存在

6、persist

127.0.0.1:6379> persist k
(integer) 1
127.0.0.1:6379> ttl k
(integer) -1

用于移除给定 key 的过期时间,使得 key 永不过期

三、数据类型

1、String

基本指令

(1)set

127.0.0.1:6379> set smile eleven
OK

设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型 (2)get

127.0.0.1:6379> get knew
"1"

获取指定 key 的值 (3)mset

127.0.0.1:6379> MSET key1 "Hello" key2 "World"
OK

同时设置一个或多个 key-value 对 (4)incr

127.0.0.1:6379> set keyincr 17
OK
127.0.0.1:6379> incr keyincr
(integer) 18
127.0.0.1:6379> get keyincr
"18"

将 key 中储存的数字值增一 (5)incrby

127.0.0.1:6379> incrby keyincr -1
(integer) 17

将 key 所储存的值加上给定的增量值 (6)setnx

127.0.0.1:6379> set smile eleven
OK

如果键不存在,则将键设置为保存字符串值。在这种情况下,它等于 SET。当 key 已经持有值时,不进行任何操作。 SETNX 是“SET if Not eXists”的缩写

应用场景

incr可以做分布式自增ID; set get 可以缓存,比如:request——>db改成 request——>redis——>db

2、Hash

基本指令

(1)hset

127.0.0.1:6379> hset myhash age 10 name smile
(integer) 2

用于为哈希表中的字段赋值 (2)hget

127.0.0.1:6379> hget myhash age
"10"

用于返回哈希表中指定字段的值 (3)hkeys

127.0.0.1:6379> hkeys myhash
1) "age"
2) "name"

用于获取哈希表中的所有字段名 (4)hexists

127.0.0.1:6379> hexists myhash age
(integer) 1

用于查看哈希表的指定字段是否存在 (5)hgetall

127.0.0.1:6379> hgetall cart:001
1) "3001"
2) "2"
3) "3002"
4) "3"

用于返回哈希表中,所有的字段和值 (6)hincrby

127.0.0.1:6379> hincrby cart:001 3002 4
(integer) 7

用于为哈希表中的字段值加上指定增量值

应用场景

购物车 用户001添加商品3001,数量2;商品3002 数量3

127.0.0.1:6379> hset cart:001 3001 2
(integer) 1
127.0.0.1:6379> hset cart:001 3002 3
(integer) 1

商品全选 hgetall 商品种类添加 hset 删除 hdel 商品数量增减 hincrby

统计PV、UV 使用hset、hexists、hincrby

缓存对象类型数据 使用hset、hget

3、List

存储有序的字符串列表,元素可以重复

基本指令

(1)lpush

127.0.0.1:6379> lpush eleven_queue a c
(integer) 2

将一个或多个值插入到列表头部 (2)rpush

127.0.0.1:6379> rpush eleven_queue b d
(integer) 4

将一个或多个值插入到列表尾部 (3)lrange

127.0.0.1:6379> lrange eleven_queue 0 -1
1) "c"
2) "a"
3) "b"
4) "d"

获取列表指定范围内的元素 (4)lpop

127.0.0.1:6379> lpop eleven_queue
"c"

删除并返回存储在 key 的列表的第一个元素。

默认情况下,该命令从列表的开头弹出一个元素。当提供可选的 count 参数时,回复将包含多达 count 个元素,具体取决于列表的长度 (5)rpop

127.0.0.1:6379> rpop eleven_queue
"d"

删除并返回存储在 key 的列表的最后一个元素。 默认情况下,该命令从列表末尾弹出一个元素。当提供可选的 count 参数时,回复将包含多达 count 个元素,具体取决于列表的长度 (6)blpop

127.0.0.1:6379> blpop eleven_bqueue 1
1) "eleven_bqueue"
2) "f"

移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 (7)brpop

127.0.0.1:6379> brpop eleven_bqueue 1
1) "eleven_bqueue"
2) "a"

移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

应用场景

时间轴 比如:朋友圈、博客时间轴、项目规划时间轴。

127.0.0.1:6379> lpush eleven_queue_test 周一
(integer) 1
127.0.0.1:6379> lpush eleven_queue_test 周二
(integer) 2
127.0.0.1:6379> lpush eleven_queue_test 周四
(integer) 3

阻塞队列 使用blpop、brpop。但是鉴于市面有成熟完善的MQ,不建议使用redis,因为redis是内存型数据库,可能有数据丢失,消费后没有响应机制,没有ack机制。

4、Set

String类型的无序集合,最大存储数量 2^32-1(40 亿左右)。 并且他们的 添加、删除元素的时间都是O(1)

基本指令

(1)sadd

127.0.0.1:6379> sadd eleven_set a b c
(integer) 3

向集合添加一个或多个成员 (2)spop

127.0.0.1:6379> spop eleven_set
"a"

移除并返回集合中的一个随机元素 (3)smembers

127.0.0.1:6379> smembers eleven_set
1) "c"
2) "b"

返回集合中的所有成员(第一次获取的结果集,以后每次获取一样,即:插入随机,获取固定) (4)scard

127.0.0.1:6379> scard eleven_set
(integer) 2

获取集合的成员数 (5)sdiff

127.0.0.1:6379> sadd eleven_set2  b f
(integer) 2
127.0.0.1:6379> sdiff eleven_set eleven_set2
1) "c"

返回由第一个集合和所有后续集合之间的差异产生的集合成员。 (6)sunion

127.0.0.1:6379> sunion eleven_set eleven_set2
1) "c"
2) "f"
3) "b"

返回由所有给定集合的并集得到的集合成员。 (7)sinter

127.0.0.1:6379> sinter eleven_set eleven_set2
1) "b"

返回给定所有集合的交集

应用场景

抽奖(不可重复) 使用spop 随机弹出或获取元素

抽奖(可重复) 使用srandmember随机弹出或获取元素 集合交集、并集、差集 交集:共同好友; 差集:可能认识的人 统计网站的独立IP 利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP 点赞、签到、标签 点赞:sadd like:消息ID 用户ID 取消点赞:srem like:消息ID 用户ID 检查用户是否点过赞:sismember like:消息ID 用户ID 获取点赞列表: smembers like:消息ID

5、Sorted Set

sorted set,有序的set,每个元素有个score。

(1)zadd

127.0.0.1:6379> zadd eleven_zset 10 a 20 b 30 c
(integer) 3

向有序集合添加一个或多个成员,或者更新已存在成员的分数 (2)zcard

127.0.0.1:6379> zcard eleven_zset
(integer) 3

获取有序集合的成员数 (3)zcount

127.0.0.1:6379> zcount eleven_zset 15 25
(integer) 1

计算在有序集合中指定区间分数的成员数 (4)zrange

127.0.0.1:6379> zrange eleven_zset 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrange eleven_zset 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
5) "c"
6) "30"

通过索引区间返回有序集合成指定区间内的成员 (5)zrevrange

127.0.0.1:6379> zrevrange eleven_zset 0 -1 withscores
1) "c"
2) "30"
3) "b"
4) "20"
5) "a"
6) "10"

返回有序集中指定区间内的成员,通过索引,分数从高到底 (6)zrevrangebyscore

127.0.0.1:6379> zrevrangebyscore eleven_zset 25 15
1) "b"

返回有序集中指定分数区间内的成员,分数从高到低排序

应用场景

排行榜、热搜 使用zrevrange 倒序

四、补充

BitMap 位图 底层是位运算 (00000101010) 基本指令 setbit 添加 bitcount 统计 getbit查看 应用场景 实时统计数据、权限。

参考文献: redis官网redis中文网