Redis实操

一、前期准备

下载编译安装

1
2
3
4
5
6
7
8
9
10
wget http://download.redis.io/releases/redis-5.0.10.tar.gz
tar xzf redis-5.0.10.tar.gz
cd redis-5.0.10
make
# 通过如下命令启动Redis:
src/redis-server
# 可以使用内置的客户端与Redis进行交互:
src/redis-cli
redis> ping
PONG

设置环境变量

1
2
3
4
5
6
vim /etc/profile

# 在末尾追加
export PATH=$PATH:/root/redis-5.0.10/src
# 保存退出
source /etc/profile # 使配置文件生效

补充:设置密码在配置文件中修改requirepass 密码

二、Redis六大数据类型实操

1.string 字符串

string 类型是二进制安全的,意思是 Redis 的 string 可以包含任何数据,比如图片或者序列化的对象,一个 redis 中字符串 value 最多可以是 512M

命令 描述 用法
set 1.设置key的值
2.key已关联则覆盖,无视类型
3.原有ttl会被清除
set key value [EX] [PX] [NX|XX]
get 1.获取key关联的值
2.key不存在返回(nil)
get key
mset 1.同时设置一个或多个k-v键值对
2.key已存在,值会被覆盖
3.不希望覆盖则使用msetnx命令
4.mset是一个原子性操作
mset key value [k,v..]
mget 1.获取所有(一个或多个)给定 key 的值
2.key不存在返回(nil)
mget key1 [key2..]
setex 1.设置key的值
2.设置key生存时间,单位为秒
setex key seconds value
setnx 1.当key不存在时,设置key的值
2.若key存在,不做任何动作
setnx key value

一些实际工作中常用的自增减操作

命令 描述 用法
incr 1.key中数值+1,返回增加后的值
2.key不存在,创建并执行+1,则值为1
3.不是数字则报错
4.值限制64为有符号数字之内
incr key
decr key中数值-1,其余同上 decr key
incrby key值+指定增量,返回增加后的值,其余同上 incrby key increment
decrby key值-指定减量,返回增加后的值,其余同上 decrby key increment

典型使用场景

  一、计数

  由于Redis单线程的特点,我们不用考虑并发造成计数不准的问题,通过 incrby 命令,我们可以正确的得到我们想要的结果。

  二、限制次数

  比如登录次数校验,错误超过三次5分钟内就不让登录了,每次登录设置key自增一次,并设置该key的过期时间为5分钟后,每次登录检查一下该key的值来进行限制登录。

2.hash哈希

命令 描述 用法
hset 1.将哈希表 key 中的字段 field 的值设为 value
2.filed已存在,旧值会被覆盖
hset key field value
hget 返回哈希表key中给定域field的值 hget key field
hdel 删除一个或多个哈希表字段,不存在忽略 hdel key field [field]
hmset 1.同时将哈希表 key 中设置多个field-value
2.会覆盖已存在的域
3.key不存在,会创建空哈希表并执行hmset
hmset key field value [field value]
hmget 1.返回哈希表key中一个或多个域给定的值
2.如果域不存在,返回(nil)
hmget key field [field]
hgetall 获取在哈希表中指定 key 的所有字段和值 hgetall key
hexists 查看哈希表 key 中,指定的字段是否存在 hexists key field
hkeys 获取所有哈希表中的字段 hkeys ksy
hvals 获取哈希表中所有值 hvals key
hlen 获取哈希表中字段的数量 hlen key
hincrby 为哈希表中域field+指定增量 hincrby key field increment

典型使用场景: 查询的时间复杂度是O(1),用于缓存一些信息

举例

1
2
3
4
5
6
7
8
# 电商购物车🛒
以用户id为key,商品id为field,商品数量为value
# 购物车操作
1.添加商品->hset cart:1000 10001 10
2.增加数量(+)->hincrby cart:1000 10001 1
3.商品总数(购物车角标)->hlen cart:1000
4.删除商品(删除)->hdel cart:1000 10001
5.获取购物车所有商品(全选)->hgetall cart:1000

3.list 列表

命令 描述 用法
lpush 将一个或多个值插入到列表头部 lpush key value1 [value2]
rpush 在列表中添加一个或多个值 rpush key value1 [value2]
lpop 移出并获取列表的第一个元素 lpop key
rpop 移除列表的最后一个元素,返回值为移除的元素 rpop key
blpop 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 blpop key1 [key2] timeout
brpop 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 brpop key1 [key2] timeout
lset 通过索引设置列表元素的值,list需存在 lset key index value
lindex 通过索引获取列表中的元素 lindex key index
llen 获取列表长度 llen key
lpushx 将一个值插入到已存在的列表头部 lpushx key value
rpushx 将一个值插入到已存在的列表尾部 rpushx key value
lrange 获取列表指定范围内的元素 lrange key start stop
lrem 移除列表元素 lrem key count value
brpoplpush 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 brpoplpush source destination timeout

典型使用场景

  一、栈: lpush+lpop

  二、队列: lpush+rpop

  三、有限集合:lpush+ltrim

  四、消息队列:lpush+brpop

4.set集合

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)

命令 描述 用法
sadd 向集合添加一个或多个成员 sadd key member [member …]
smembers 返回集合中的所有成员 smembers key
sismembers 判断 member 元素是否是集合 key 的成员 sismember key member
srandmember 返回集合中一个或多个随机数 srandmember key [count]
scard 获取集合的成员数 scard key
sdiff 返回第一个集合与其他集合之间的差异 sdiff key [key …]
sinter 返回给定所有集合的交集 sinter key [key …]
sunion 返回所有给定集合的并集 sunion key [key …]
srem 移除集合中一个或多个成员 srem key member [member …]
smove 将 member 元素从 source 集合移动到 destination 集合 smove source destination member
spop 移除并返回集合中的一个随机元素 spop key [count]

典型使用场景: 利用集合的交并集特性,比如在社交领域,我们可以很方便的求出多个用户的共同好友,共同感兴趣的领域等

举例

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
30
31
32
33
# 微信小程序抽奖
1.点击参与抽奖加入集合
sadd key {userid}
2.查看参与抽奖的所用用户
smambers key
3.抽取3名中奖者
srandmember key 3或者spop key 3

# 微信点赞,收藏
1.点赞
sadd like:{消息id} {用户id}
2.取消点赞
srem like:{消息id} {用户id}
3.检查用户是否点过赞
sismember like:{消息id} {用户id}
4.获取点赞的用户列表
smembers like:{消息id}
5.获取点赞用户数
scard like:{消息id}

# 关注模型
1.user1关注的人
user1 {zhangsan,lisi,wangwu}
2.user2关注的人
user2 {lisi,wangwu,user3}
3.user3关注的人
user3 {user1,wangwu,zhaoliu}
4.user1与user2共同关注
sinter user1 user2 -> {lisi,wangwu}
5.user2关注的人也关注了user1
sismember user3 user1
6.user2可能认识的人
sdiff user3 user2 -->{zhaoliu,user1}

5.zset有序集合

命令 描述 用法
zadd 向有序集合添加一个或多个成员,或者更新已存在成员的分数 zadd key [NX|XX] [CH] [INCR] score member [score member …]
zcard 获取有序集合的成员数 zcard key
zcount 计算在有序集合中指定区间分数的成员数 zcount key min max
zrange 通过索引区间返回有序集合指定区间内的成员 zrange key start stop [WITHSCORES]
zrem 移除有序集合中的一个或多个成员 zrem key member [member …]
zrank 返回有序集合中指定成员的索引 zrank key member
zscore 返回有序集中,成员的分数值 zscore key member
zremrangebyrank 移除有序集合中给定的排名区间的所有成员 zremrangebyrank key start stop
zremrangebyscore 移除有序集合中给定的分数区间的所有成员 zremrangebyscore key min max

典型使用场景: 和set数据结构一样,zset也可以用于社交领域的相关业务,并且还可以利用zset 的有序特性,还可以做类似排行榜的业务

6.版本5.0新数据结构-stream

Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。

而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

Redis Stream 的结构如下所示,它有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容

具体可参考:Redis Stream

三、Redis系统相关命令

命令 描述
BGREWRITEAOF 手动触发AOF重写操作,用于减小AOF体积
BGSAVE 后台异步保存当前数据库到磁盘
SELECT index SELECT index切换到指定数据库,默认索引为0,最大值15
FLUSHALL 清空整个redis服务器数据
FLUSHDB 清空当前数据库redis数据
INFO 返回redis服务器的信息统计,可以定返回某一部分
LASTSAVE 返回最后一次保存的时间戳
SHUTDOWN 停止所有客户端,save,更新AOF,关闭redis服务器

四、key相关命令

命令 描述 用法
DEL 删除一个或多个key DEL key [key …]
EXISTS 检查key是否存在 EXISTS key [key …]
KEYS 查找符合给定模式的key KEYS pattern
TTL 以秒为单位,返回key剩余生存时间 TTL KEY
PTTL 以毫秒为单位,返回key剩余生存时间 PTTL KEY
TYPE 返回key存储的类型 TYPE KEY
OBJECT ENCODING key 返回数据类型底层的数据结构 OBJECT ENCODING KEY

五、Redis事务

MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务;DISCARD取消事务,放弃执行事务块内的所有命令。

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
都看到这里了,不赏点银子吗^v^