0%

Redis安装与常用数据结构

Redis – Remote Dictionary Server : 远程字典服务.

Redis 底层是通过 C 语音实现的.为了达到高效的的目的,通过很多巧妙的bit位设计,定义很多数据结构,比如有 Hashtable ,HashSet等.

Redis 安装

Redis 安装,如果只是安装给Mac电脑使用的话,直接取官网下载官网下载,下载解压之后就可以使用了.

进入Redis目录,进入/src目录

1
2
3
4
5
6
# 启动Redis服务
redis-service

# 启动Redis客户端
redis-cli

Linux环境使用

我安装的是centos 7 Linux 环境.

安装步骤

1
2
3
4
5
6
7
8
9
10
11
12

# 安装gcc
yum install gcc

wget http://download.redis.io/releases/redis‐5.0.2.tar.gz

# 解压
tar xzf redis‐5.0.2.tar.gz

# 进入redis目录
cd redis‐5.0.2

编译,安装redis

1
make

使用redis

1
2
3
4
5
6
7
8
9
# 启动Redis服务
redis-service

# 启动Redis客户端
redis-cli

# 检查是否启动
ps -ef | grep redis

Redis 常用数据结构

字符串String数据结构

Redis 存储 String类型的数据.

String

key - value 存储字符串

1
2
3
4
普通存储
SET key value

GET key
1
2
3
4
批量存储
MSET key1 value1 [key2 value2]

MGET key1 [key2]
1
2
3
4
5
设置过期时间
EXPIRE key seconds

过期时间设置为10
SET flagname true ex 10 nx //防止程序意外终止导致死锁

使用场景:

  • 一般性的存值.

分布式锁

1
2
3
4
5
存入一个不存在的值 如果返回1 说明不存在, 返回0说明已存在
SETNX key

删除
DEL key

使用场景:

  • 分布式锁

使用Redis可以实现分布式锁功能,如果获取不到锁,要一直尝试获取锁.

自增id/自加

1
2
3
4
5
6
7
8
9
10
11
数字key 存储的值自增(每次+1)
INCR key

数字key 存储的值自减(可以是负数)(每次-1)
DECR key

数字key 存储的值自增increment (每次+increment)
INCRBY key increment

数字key 存储的值自减decrement(可以是负数)(每次-decrement)
DECRBY key decrement

使用场景:

  • 实现分库分表的自增id.

  • 实现需要订单号自增.

  • 实现记录访问量.

哈希Hash数据结构

Redis存储Hash数据结构,可以理解为Values 是很多HashMap;

哈希Hash数据结构

常用操作

1
2
3
4
5
6
7
8
存一组数据
HSET key field value

存一组hashMap中不存在的数据
HSETNX key field value

批量存储
HMSET key field value [field value ...]
1
2
3
4
5
6
7
8
9
10
11
获取redis中key对用的HashMap中 filed对应的value
HGET key field

批量获取
HMGET key field [field ...]

获取key对应的HashMap所有的数据
HGETALL  key

批量删除
HDEL key field [field ...]
1
2
3
4
5
key对应的HashMap 中数据数量
HLEN key

将key对应的HashMap 中的field字段对应的值 自增 increment
HINCRBY key field increment

使用场景:

  • 对象缓存

  • 电商项目:购物车(用户为key , 商品id–商品详情/商品数量)

列表List数据结构

Redis存储List数据结构,可以理解为Values 是很多List集合;

列表List数据结构

常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

给key 对应的list 从左添加元素
LPUSH key value [value ...]

移除左边头元素
LPOP key

给key 对应的list 从右添加元素
RPUSH key value [value ...]

移除右边头元素
RPOP key

从左边开始输出 范围start - stop的元素
LRANGE key start stop

带阻塞功能的LPOP(带超时时间)
BLPOP key [key ...] timeout

带阻塞功能的RPOP(带超时时间)
BRPOP key [key ...] timeout

使用场景:

  • 实现Stack , QUEUE , Blocking MQ

Stack (FILO) = LPUSH + LPOP | RPUSH + RPOP

QUEUE (FIFO) = LPUSH + RPOP | RPUSH + LPOP

Blocking MQ = LPUSH + BRPOP | RPUSH + BLPOP

集合Set数据结构

Redis存储Set数据结构,可以理解为Values 是很多Set集合,不会出现重复的数据;

集合Set数据结构

常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
添加元素
SADD key member [member ...]

移除元素
SREM key member [member ...]

获取key 对应set的所有元素
SMEMBERS key

获取key 对应set的元素个数
SCARD key

判断member 是否在 key 对应的set集合中
SISMEMBER key member

从key对应的set集合中获取 count 个元素(不执行删除操作)
SRANDMEMBER key [count]

从key对应的set集合中获取 count 个元素(执行删除操作)
SPOP key [count]

Set集合操作(交集 ,并集 ,差集 )

首先复习下 高中集合操作知识

1
2
3
4
5
AB交集 = A ∩ B

AB并集 = A ∪ B

ABC差集 = A - ( B ∪ C )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
将多个key 对应的 Redis Set集合取交集 
SINTER key [key ...]

将多个key 对应的 Redis Set集合取交集 并存储到新的 destination Set 集合中
SINTERSTORE destination key [key ..]


将多个key 对应的 Redis Set集合取并集
SUNION key [key ..]

多个key 对应的 Redis Set集合取并集 并存储到新的 destination Set 集合中
SUNIONSTORE destination key [key ...]

将多个key 对应的 Redis Set集合取差集
SDIFF key [key ...]

多个key 对应的 Redis Set集合取差集 并存储到新的 destination Set 集合中
SDIFFSTORE destination key [key ...]

使用场景:

  • 微信抽奖功能(要求不重复)

  • 年会抽奖活动(不重复,可删除)

  • 微信点赞/是否点赞,标签

  • 微博共同关注,QQ共同好友

  • 电商平台商品分类功能(集合操作)

有序集合Zset数据结构

Redis存储ZSet数据结构,可以理解为Values 是很多Set集合,不会出现重复的数据且有序;

有序集合Zset数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

将排序规则为score 的元素 添加到 ZSet 集合中
ZADD key score member [[score member]…]

移除key对应的ZSet 中的member元素
ZREM key member [member …]

获取Score
ZSCORE key member

给Key对应的ZSet 中 member 成员的 score + increment( 操作完之后 会重新排序)
ZINCRBY key increment member

获取Key 对应ZSet集合中元素的数量
ZCARD key

正序 获取key对应的ZSet 中范围为start - stop 中 member ( 如果带上WITHSCORES] 可以输出 score )
ZRANGE key start stop [WITHSCORES]

倒序 获取
ZREVRANGE key start stop [WITHSCORES]

集合操作

1
2
3
4
5
并集
ZUNIONSTORE destkey numkeys key [key ...]

交集
ZINTERSTORE destkey numkeys key [key …]

使用场景: 有排序要求的场景

  • 排行版需求/热点需求

其他

命令

不推荐使用KEYS ,推荐使用SCAN

1
2
3
4
5
6
7
8
9
10
11
获取所有key
keys *

带规则
keys a*


scan cursor [MATCH pattern] [COUNT count]

cursor 游标
count 是每次大概输出的数量

QA

  • Redis 是否是单存的单线程?

Redis服务与客户端的网络已经键值对读写是由一个线程来完成的,但Redis的持久化,集群数据同步等是异步线程负责的.

  • Redis 为什么快?

Redis快,是因为Redis的数据操作都是基于内存操作的.

  • 单线程如何处理那么多的并发客户端连接的?

我们知道Redis是基于内存操作的,性能瓶颈一部分在I/O, Redis采用I/O多路复的策略,将客户端连接信息和事件添加到队列,当一个操作完成了,直接获取到连接信息复用上一个I/O实例.