一、前期准备
下载编译安装
1 | wget http://download.redis.io/releases/redis-5.0.10.tar.gz |
设置环境变量
1 | vim /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 | # 电商购物车🛒 |
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 | # 微信小程序抽奖 |
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 | 127.0.0.1:6379> multi |