目录
基本操作
默认有 16 个库(0-15),可以在配置文件中修改,默认使用第一个 db0。
切换数据库:select 0
清空当前数据库:flushdb
清空所有数据库:flushall
存值:set qingshan 2673
取值:get qingshan
查看所有键:keys *
获取键总数:dbsize
查看键是否存在:exists qingshan
删除键:del qingshan jack
重命名键:rename qingshan pengyuyan
查看类型:type qingshan
Redis基本数据类型
redis的数据类型有String、Hash、Set、List、Zset、Hyperloglog、Geo、Streams。
String字符串
可以用来存储字符串、整数、浮点数。
操作命令
设置多个值(批量操作,原子性):mset qingshan 2673 jack 666
设置值,如果 key 存在,则不成功:setnx qingshan 此操作可以实现分布式锁,客户端A在setnx key时成功则获取到锁,处理完业务逻辑后使用del key释放锁。不成功说明该key已存在,锁被其他客户端持有。
如果释放锁失败导致其他客户端获取不到锁,那么可以加过期时间:SET key value [EX seconds] [PX milliseconds] [NX|XX] set lock1 1 EX 10 NX
- EX second:设置键的过期时间为second秒
- PX millisecond:设置键的过期时间为millisecond毫秒
- NX:只在键不存在时,才对键进行设置操作
- XX:只在键已经存在时,才对键进行设置操作
- SET操作成功完成时,返回OK,否则返回nil
获取多个值:mget qingshan jack
获取值长度:strlen qingshan
字符串追加内容:append qingshan good
获取指定范围的字符:getrange qingshan 0 8
(整数)值递增:incr qingshan incrby qingshan 100
(整数)值递减:decr qingshan decrby qingshan 100
应用场景
缓存热点数据、分布式锁setnx、全局ID INCRBY、计数器INCR
Hash哈希
包含键值对的无序散列表。value 只能是字符串,不能嵌套其他类型。
Hash 与 String 的主要区别
- 把所有相关的值聚集到一个 key 中,节省内存空间
- 只使用一个 key,减少 key 冲突
- 当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU 的消耗
操作命令
hset h1 f 6
hset h1 e 5
hmset h1 a 1 b 2 c 3 d 4
hget h1 a
hmget h1 a b c d
hkeys h1
hvals h1
hgetall h1
hget exists h1
hdel h1
hlen h1
应用场景
string可以做的,hash都可以做;购物车:key:用户 id;field:商品 id;value:商品数量。
List 列表
存储有序的字符串(从左到右),元素可以重复。可以充当队列和栈的角色。
操作命令
元素增减:
lpush queue a
lpush queue b c
rpush queue d e
lpop queue
rpop queue
blpop queue
brpop queue
取值
lindex queue 0
lrange queue 0 -1
应用场景
用户 消息时间线 timeline:因为 List 是有序的,可以用来做用户时间线
消息 队列:
List 提供了两个阻塞的弹出操作:BLPOP/BRPOP,可以设置超时时间。
BLPOP:BLPOP key1 timeout 移出并获取列表的第一个元素, 如果列表没有元素
会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOP:BRPOP key1 timeout 移出并获取列表的最后一个元素, 如果列表没有元
素会阻塞列表直到等待超时或发现可弹出元素为止。
队列:先进先出:rpush blpop,左头右尾,右边进入队列,左边出队列。
栈:先进后出:rpush brpop
set集合
String 类型的无序集合,最大存储数量 2^32-1(40 亿左右)。
操作命令
添加一个或者多个元素:sadd myset a b c d e f g
获取所有元素:smembers myset
统计元素个数:scard myset
随机获取一个元素:srandmember key
随机弹出一个元素:spop myset
移除一个或者多个元素:srem myset d e f
查看元素是否存在:sismember myset a
应用场景
抽奖:随机获取元素 spop myset
点赞 、签到、打卡:
- 这条微博的 ID 是 t1001,用户 ID 是 u3001。
- 用 like:t1001 来维护 t1001 这条微博的所有点赞用户。
- 点赞了这条微博:sadd like:t1001 u3001
- 取消点赞:srem like:t1001 u3001
- 是否点赞:sismember like:t1001 u3001
- 点赞的所有用户:smembers like:t1001
- 点赞数:scard like:t1001
- 比关系型数据库简单许多。
商品 标签:用 tags:i5001 来维护商品所有的标签。
- sadd tags:i5001 画面清晰细腻
- sadd tags:i5001 真彩清晰显示屏
- sadd tags:i5001 流畅至极
Zset 有序集合
操作命令
添加元素:zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python
获取全部元素:zrange myzset 0 -1 withscores zrevrange myzset 0 -1 withscores
根据分值区间获取元素:zrangebyscore myzset 20 30
移除元素:zrem myzset php cpp
统计元素个数:zcard myzset
分值递增:zincrby myzset 5 python
根据分值统计个数:zcount myzset 20 60
获取元素 rank:zrank myzset java
获取元素 score:zsocre myzset java
应用场景
排行榜:
id 为 6001 的新闻点击数加 1:zincrby hotNews:20190926 1 n6001
获取今天点击最多的 15 条:zrevrange hotNews:20190926 0 15 withscores